1. String在 Java 中字符串属于对象
创建字符串:
String s1 = "Runoob"; // String 直接创建
String s2 = "Runoob"; // String 直接创建
String s3 = s1; // 相同引用
String s4 = new String("Runoob"); // String 对象创建
String s5 = new String("Runoob"); // String 对象创建
直接创建和对象创建的区别:
常用的方法:
| SN(序号) | 方法描述 |
|---|---|
| 1 | char charAt(int index) 返回指定索引处的 char 值。 |
| 2 | int compareTo(String anotherString) 按字典顺序比较两个字符串 |
| 3 | String concat(String str) 将指定字符串连接到此字符串的结尾。 |
| 4 | boolean equals(Object anObject) 将此字符串与指定的对象比较。 |
| 5 | int lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。 |
| 6 | int indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引。 |
| 7 | int length() 返回此字符串的长度。 |
| 8 | isEmpty() 判断字符串是否为空。 |
| 9 | String trim() 返回字符串的副本,忽略前导空白和尾部空白。 |
| 10 | contains(CharSequence chars) 判断是否包含指定的字符系列。 |
| 11 | String toUpperCase(Locale locale) 使用给定 Locale 的规则将此 String 中的所有字符都转换为大写。 |
| 12 | char[ ] toCharArray() 将此字符串转换为一个新的字符数组。 |
| 13 | String replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 |
| 14 | [String] split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串。 |
代码示例:
package com.leetcode.String;
public class String01 {
public static void main(String[] args){
String str = "Hello ";
//判断字符串是否为空:false
System.out.println("判断字符串是否为空:" + str.isEmpty());
//下标为0的字符为:H
System.out.println("下标为0的字符为:" + str.charAt(0));
//在结尾连接字符串:Hello World!
str = str.concat("World! ");
System.out.println("在结尾连接字符串:" + str);
//字符串的长度:15
System.out.println("字符串的长度:" + str.length());
//忽略前导空白和尾部空白Hello World!
str = str.trim();
System.out.println("忽略前导空白和尾部空白" + str);
//字符串的长度:12
System.out.println("字符串的长度:" + str.length());
//转大写:HELLO WORLD!
System.out.println("转大写:" + str.toUpperCase());
//str = Hello World!
System.out.println("str = " + str);
}
}
2. StringBuilder和StringBuffer
StringBuffer与StringBuilder的用法完全相同,只是StringBuffer是线程安全的。
| 1 | public StringBuffer append(String s) 将指定的字符串追加到此字符序列。 |
|---|---|
| 2 | public StringBuffer reverse() 将此字符序列用其反转形式取代。 |
| 3 | public delete(int start, int end) 移除此序列的子字符串中的字符。 |
| 4 | public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。 |
| 5 | insert(int offset, String str) 将 str 参数的字符串插入此序列中。 |
| 6 | replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。 |
代码示例:
//定义
StringBuilder sb = new StringBuilder();
//追加字符串
sb.append("java");
//插入
sb.insert(0,"hello"); // hellojava
//替换
sb.replace(5,6,"B"); // helloBava
//删除
sb.delete(5,6); // helloava
//sb的长度
System.out.println(sb.length()); // 8
//sb的容量,通常比length大
System.out.println(sb.capacity()); // 16
3.继承结构
public final class String
implements java.io.Serializable, Comparable, CharSequence,
Constable, ConstantDesc {
}
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, Comparable, CharSequence
{ }
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, Comparable, CharSequence
{ }
4. 三者的区别
| String | StringBuffer | StringBuilder |
|---|---|---|
| String的值是不可变的,导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 | 可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 | 可变类,速度更快 |
| 不可变 | 可变 | 可变 |
| 线程安全 | 线程不安全 | |
| 多线程操作字符串 | 单线程操作字符串 |
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况



