Java String、StringBuffer、StringBuilder类介绍
Immutable 类
String类是典型的 Immutable 类,本身是final class,同时String的value属性也被声明成final类型。不可变保证了String的线程安全。
String 的初始化
String 类的初始化主要有两种方式: 直接赋值和对象初始化
直接赋值:
String s = "12345";
直接赋值会将String内容写入方法区的内存常量池。而JVM会维护一份String字面量列表,保证相同值的String都会指向一片空间。
对象初始化
String s = new String("12345");
String对象初始化后会在堆区创建一个对象,有可能会被垃圾回收,同时两次new相同值的String不会指向同一地址。
String t1 = new String("1111");
String t2 = new String("1111");
System.out.println(t1 == t2); //false
System.out.println(t1.equals(t2));//true
String的拼接-StringBuffer、StringBuilder
String的不可变导致了对String的修改必须生成新的String对象。
String三种拼接方式 : + 、StringBuilder、StringBuffer
先说结论: StringBuilder > StringBuffer > 使用 加号 拼接
先说 StringBuilder 为什么比 + 快
String 每次拼接都要重新开辟一个大小等于新字符串大小的空间,而StringBuilder会在初始化对象的时候开辟字符串大小+16的空间,当额外空间用光的时候新申请空间的时候也会预留出一段空间,这样一定程度避免了对象拼接时需要不断新申请空间的问题。
在说 StringBuilder 为什么比StringBuffer快
StringBuilder和StringBuffer 都继承自AbstractStringBuilder,区别就是StringBuffer为了保证线程安全,在所有方法上都添加了synchronized。相比StringBuilder增加加锁解锁时间。
在非要求线程安全的情况下推荐使用StringBuilder。
String的拼接后续-机智的JVM
JVM在使用+拼接字符串的时候会自动调用SpringBuilder