文章目录
Java String & StringBuilder & StringBuffer & StringJoiner区别
总结
String是Java中非常基础和重要的类,提供了构造和管理字符串的各种基本逻辑。String被声明为final class
,所有属性也是final
的,是不可变的。由于String是不可变的,类似拼接/剪切字符串等动作,都会产生新的String对象,对性能有一定的影响。
StringBuffer是为了解决字符串的各种操作提供的一个类。StringBuffer是一个线程安全的可修改的,保证了现场安全,也带来了额外的性能开销,所以除了线程安全的需要,不推荐使用。StringBuffer底层是char数组,各种方法加上synchronized
关键字实现。
StringBuilder是Java 1.5新增的,很多地方与StringBuffer区别不大,但它去掉了线程安全的部分,有效减少了开销,是绝大部分情况下进行字符串拼接的首选。
String
创建
String s1 = "helloString";
String s2 = new String("helloString");
System.out.println(System.identityHashCode(s1)); //1163157884
System.out.println(System.identityHashCode(s2)); //1956725890
- 第一行代码使用直接赋值操作,如果字符串常量池里有hello字符串,则变量s1就会直接指向常量池中的hello字符串,否则JVM会在类加载期间在常量池中创建该字符串。
- 第二行代码使用new创建一个对象,会先在堆内存中创建一个对象,然后该对象会指向常量池中的hello字符串,变量s2会指向该对象的地址
- s1的地址值指向常量池hello字符串的地址,s2的地址指向堆内存中的对象地址,所有
s1==s2
返回false
charAt
- 获取指定索引的元素
s1.charAt(1) //e
indexOf & lastIndexOf
- indexOf 从左往右查找,获取指定字符串的第一次出现的索引
- lastIndexOf 同理indexOf,从有网做查找
String s = "hello";
System.out.println(s.indexOf("e"));//1
System.out.println(s.lastIndexOf("e"));//1
contentEquals
- 判断两字符串内容是否相等
s1.contentEquals(s2) //true
substring
- 截取字符串
s1.substring(1) //elloString
s1.substring(1, 5) //ello
startsWith & endsWidth
- startsWith 判断是否为指定字符串开头
- endsWidth
- 判断是否为指定字符串结尾
s1.endsWith("ing") //true
s1.startsWith("hello") //true
isEmpty
- 判断字符串是否为空
s1.isEmpty() //false
trim
- 去除前后空格
s1.trim()
split
- 根据特定符号,分割字符串为字符串数据
String s1 = "he|llo|Str|ing";
String[] split = s1.split("\\|");
for (String i : split) {
System.out.println(i);
}
//her
//llo
//Str
//ing
replace & replaceAll
- replace 替换指定字符串
- replaceAll 替换指定字符串,支持正则
String s1 = "hellostringhellostring";
System.out.println(s1.replace("hello", "HELLO")); //HELLOstringHELLOstring
System.out.println(s1.replaceAll("hello", "HELLO")); //HELLOstringHELLOstring
contains
- 是否包含指定字符串
String s1 = "hellostringhellostring";
System.out.println(s1.contains("hello")); //true
concat
- 拼接字符串
String s1 = "abc";
String s2 = "efg";
System.out.println(s1.concat(s2)); //abcefg
equals
- String重写了equals方法,可以用于判断两字符串内容是否相等
s1.equals(s2) //true
intern
intern
是一个本地方法,它返回的是一个字符串对象,如果常量池已经包含了字符串,那么直接返回该字符串;否则,会将该字符串添加到常量池,并返回该字符串
String s1 = "hello";
String s2 = "hello".intern();
System.out.println(s2); //hello
System.out.println(s1 == s2); //true
StringBuilder & StringBuffer
- StringBuilder与StringBuffer的API基本类似,通常是用于频繁拼接字符串
- StringBuffer是线程安全的,StringBuilder是线程不安全的
append
- 拼接字符串
StringBuilder builder = new StringBuilder();
builder.append("[")
.append("hello ")
.append("StringBuilder")
.append("]");
System.out.println(builder.toString()); //[hello StringBuilder]
delete
- 删除指定范围字符串
StringBuilder builder = new StringBuilder("hello StringBuilder");
builder.delete(0, 3);
System.out.println(builder.toString()); //lo StringBuilder
StringJoiner
- Java提供StringJoiner用于更高效拼接字符串
StringJoiner joiner = new StringJoiner(",", "[", "]");
joiner.add("hello")
.add("StringJoiner");
System.out.println(joiner.toString());//[hello,StringJoiner]