String,StringBuffer,StringBuilder三者的异同:?
-
String:不可变的字符序列;底层使用char[]存储(用final修饰)
-
StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储(不用final修饰)
-
StringBuilder:可变的字符序列;jdk5.0新增的,非线程安全的,效率高;底层使用char[]存储(不用final修饰),StringBuffer的单线程版,AbstractStringBuilder是其与StringBuffer的共同父类
源码分析:
* String str = new String(); //new char[0]
* String str1 = new String(“abc”); //new char[]{‘a’,‘b’,‘c’};
*
* StringBuffer buffer1 = new StringBuffer(); //new char[16];底层创建了以个长度为16的char数组,StringBuilder空参构造器同样也是创建16个长度的char数组
* buffer1.appen(‘a’); //value[0] = ‘a’
* buffer1.appen(‘b’); //value[0] = ‘b’
* System.out.println(buffer1.length()); //0 返回的是count值而不是char数组的长度
*
*StringBuffer buffer = new StringBuffer(“abc”);//char[] value = new char[(str.length() + 16)];
* 问题一:System.out.println(buffer.length()); //3 返回的是count值而不是char数组的长度
* 问题二:扩容问题:
* 默认情况,扩容为原来容量的2倍+2,同时将原有的数组元素复制到新数组中,如果还不够需要扩容为新加长度和原有长度的总和
* 建议:开发中建议使用: public StringBuffer(int capacity)或new StringBuilder(int capacity)新建字符串