Java常用类—String、StringBuilder与StringBuffer
String:不可变的字符序列;底层是char value[]
StringBuffer:可变的字符序列;线程安全,效率低;底层是char value[]
StringBuilder:可变的字符序列;jdk5.0新增,线程不安全;底层是char value[]
源码分析
String str = new String();//new char[0];
String str1 = new String("abc");//char value[] = new char[]{'a','b','c'};
StringBuffer sb1 = new StringBuffer();//char value[] = new char[16];底层创建长度是16的char数组
sb1.append('a');//value[0]='a';
sb1.append('b');//value[1]='b';
StringBuffer sb2 = new StirngBuffer("abc");//char value[] = new char["abc".length()+16]
- 问题1.sb1.length()和sb2.length()多少? 0和3,因为是字符个数不是value.Length
- 问题2.扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组
默认情况下,扩容为原来容量的2倍+2,同时将原有数组元素复制到心得数组当中
指导意义:开发中建议大家初始化时指定好字符串大小,new StringBuffer(int capacity) 或new StringBuilder(int capacity)
StringBuffer(和StringBuilder几乎一样)的常用方法
- PS:方法中涉及start 和 end 位置的,都是左闭右开
- 方法链:sb.append(xxx).append(xxx)
总结
增:append(xxx)
删:delete(int start,int end)
改:setCharAt(int n,char ch)
查:charAt(int n)
插入:insert(int offset,xxx)
*遍历:for+charAt
String、StringBuffer与StringBuilder的效率对比
String特别慢,因为每次都需要重新创建常量
StringBuffer与StringBuilder都很快,但StringBuffer涉及线程安全稍慢一点
细节测试题
String str=null;
StringBuffer sb=new StringBuffer();
sb.append(str); //不报错
System.out.println(sb.length); //4
System.out.println(sb); //"null"
StringBuffer sb1=new StringBuffer(str); //抛异常
System.out.println(sb1);
源码中的append(string str),当str=null时会特殊处理,添加"null"
而构造器对于null的str不会处理,会抛异常