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不会处理,会抛异常

posted @ 2022-05-05 18:32  JayerListen  阅读(51)  评论(0编辑  收藏  举报