StringBuffer类

 

StringBuffer代表着可变的字符序列, 线程安全,效率相对于String快 相对于StringBuilder较低

底层也是char [] 来存储的

java.lang.StringBuffer代表可变的字符序列,JDK1.0中声明,可以对字符 串内容进行增删,此时不会产生新的对象。

 很多方法与String相同。
 作为参数传递时,方法内部可以改变值。

StringBuffer类不同于String,其对象必须使用构造器生成。有三个构造器:

StringBuffer():初始容量为16的字符串缓冲区 
StringBuffer(int size):构造指定容量的字符串缓冲区
StringBuffer(String str):将内容初始化为指定字符串内容

 

源码分析:

  String str = new String();  // 相当于 char [] value = new char[0]; String的底层实现就是char []               
  String str1 = new String("abc"); // 相当于 char [] value = new char []{"a","b", "c"}                  
                                                                                                     
  StringBuffer sb1 = new  StringBuffer();  char [] value =  new char [16]; 底层创建了一个长度为16的char数组       
  system.out.println(sb1.length()); // 0 虽然他的底层数组长度为16 但是他本身的length仍然是0                              
                                                                                                                          
  StringBuffer sb2 = new StringBuffer("abc"); // char [] value = new char["abc".length()+16]         

 

问题: 

StringBuffer sb2 = new StringBuffer("abc")

写出输出内容:
system.out.println(sb2);


是3 虽然它的底层是16 只是代表可以放置的  而他本身的是count统计出来的是3,  

 

StringBuffer扩容问题:

StringBuffer虽然默认创建一个可以存放16的char [] 容器, 如果超出这个长度需要扩容, 默认情况下扩容为原来容器的2倍+2,并且把原有数组的元素都复制到新数组中

指导: 在开发中建议大家一初始就使用: StringBuffer(int capacity) 一初始就指定长度防止后面再扩容

 

 

StringBuffer的方法

可变的字符串序列
StringBuffer的常用方法


append()  在最后的位置上添加一个字符, 常用语拼接

delete(int start, int end); 删除指定位置的内容
replace(int start, int end, String str); 把[start end)的内容替换为str
insert(String str); 指定位置插入str
reverse(); 把当前字符串翻转
indexOf() 根据内容查下标
charAt() 根据下标查内容 subString() ; 截取字符串 左闭右开 setCharAt(
int n, char ch); 改变指定位置的字符 增: append() 删: delete() 查: charAt(int n) 根据下标查内容, indexOf(String str) 根据内容查下标 改: setCharAt();修改其中的一个字符, replace()修改其中的一段字符 插入: insert()

 

 

以 StringBuffer  stringBuffer = new StringBuffer("abc"); 为 例🌰

添加: append(String str) 在末尾处添加str
        // 增加  append()  在末尾后增加字符
        stringBuffer.append("l");
        System.out.println(stringBuffer); // abcl

 

删除: delete(int start, int end)

  删除字符串以下标start开始  下标end结尾 的区间内容, 左闭右开

        //删除 delete(int start, int end-1) 删除start开始end-1的下标区间字符  左闭右开
        stringBuffer.delete(1,2); // 删除下标为1的字符
        System.out.println(stringBuffer);// acl

 

 

插入: insert(int n, String str) 

  在字符串下标n处添加str

        // 插入 insert(int n, String str)  在下标为n处插入str
        stringBuffer.insert(1,"ww");
        System.out.println(stringBuffer);  // awwcl

 

改: 

 替换: replcae(int start, int end, String str)

将字符串以下标start开始 下标end区间内的替换为str

        // 替换 replace(int start, int end, String str) 把从start开始到 end的上一位区间的字符替换为str ,左闭右开
        stringBuffer.replace(3, 4,"老王");  // 把下标为3的字符替换为老王
        System.out.println(stringBuffer); // aww老王l

 

修改单个字符: setCharAt() ,只能是字符不能是字符串

        StringBuffer stringBuffer2 = new StringBuffer("你是一个dahaoren");
        stringBuffer2.setCharAt(4,'b'); // 只能替换单独的字符 并且只能是字符不能是字符串

 

查: 

根据内容获取下标 indexOf(String str);

获取字符串中str的下标

        //indexOf()  //输出字符串的下标
        System.out.println(stringBuffer.indexOf("l"));  // 0

 

输出下标的内容 charAt(int n) 

 

        // charAt(int n) // 输出下标是n的字符串
        System.out.println(stringBuffer.charAt(3));

 

截取 subString(int start ,int end) 左闭右开

截取字符串中下标以start开始以下标end区间的内容

       //截取 : subString(int start, int end)  获取以start开始end -1 的下标元素,左闭右开
        System.out.println(stringBuffer.substring(3,5)); // ww

 

 

StringBuilder 类

StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且 提供相关功能的方法也一样

 

面试题:

对比String、StringBuffer、StringBuilder

String(JDK1.0):不可变字符序列
StringBuffer(JDK1.0):可变字符序列、效率低、线程安全
StringBuilder(JDK 5.0):可变字符序列、效率高、线程不安全 注意:作为参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder 会改变其值。

 

 

 

String 与StringBuffer ,StringBuilder之间的转化

String ----> StringBuffer, StringBuilder:  调用StringBuffer, StringBuilder的构造器 
         

StringBuffer, StringBuilder ---> String  
      1: 调用String的构造器,
       2: StringBuilder, StringBuffer 的toString()方法

 

 

 

 

 

 

posted @ 2019-12-22 13:44  可爱的红领巾  阅读(440)  评论(0编辑  收藏  举报