一、存储原理
String不可变的原因
// 底层是个final修饰的char数组private final char value[];
存储原理
public class StringTest {public static void main(String[] args) {String s1 = "abc";String s2 = "abc";String s3 = new String("223");String s4 = new String("223");System.out.println(s1 == s2); // trueSystem.out.println(s3 == s4); // falseSystem.out.println(s3.equals(s4)); // true/*String不可变String属于引用数据类型,String中重写了equals()方法,因此比较的是内容"=="对于引用数据类型来说,是比较内存地址的*/}}
二、StringBuffer和StringBuilder
因为String是不可变的,所以如果需要进行大量的字符串拼接操作的话,每进行一次拼接操作,就有可能在方法区字符串常量池中创建出一个新的字符串,这样会造成方法区内存占用过大……由此就有了可变数组StringBuffer
// 构造一个没有字符且初始容量为 16 个字符的字符串缓冲区// 会自动扩容public StringBuffer() {super(16);}
如何优化StringBuffer的性能?
- 创建的时候指定一个合适的初始容量,扩容次数越少,效率越高
public class StringTest {public static void main(String[] args) {StringBuffer sb = new StringBuffer(24);sb.append("a");sb.append("b");sb.append("c");sb.append("d");}}
- 创建的时候指定一个合适的初始容量,扩容次数越少,效率越高
StringBuffer和StringBuilder的区别
- StringBuffer中方法都有synchronized修饰,是线程安全的
- StringBuilder是非线程安全的
