• 解析java中的StringBuffer和StringBuilder


    解析java中的StringBuffer和StringBuilder

    1 StringBuffer

    1.1 核心

    a 线程安全

    b. 速度相对于StringBuilder慢

    c. 自动扩容(本质还是新开辟一个新的数组(把value的指向改成了这个新的数组))

    1.2 常用方法(改变的都是自身)

    1.2.1 字符串拼接append

    a 语法
    StringBuffer对象名.append(CharSequence s);
    //这个CharSequence是String类实现的接口,里面可以传入String对象
    //本质还是多态的一种体现
    
    • 1
    • 2
    • 3
    b 示例代码
    package Work;
    public class Test05 {
        public static void main(String[] args) {
          StringBuffer stringBuffer=new StringBuffer("abc");
          //此时stringBuffer对象的初始空间为传入字符串长度+16,改的还是自身的空间,append里面的参数也可以是任意类型
          stringBuffer.append(100);
          System.out.println(stringBuffer);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    c 示例代码运行截图

    在这里插入图片描述

    1.2.2 字符串反转reverse

    a 语法
    StringBuffer对象名.reverse();
    
    • 1
    b 示例代码
    package Work;
    public class Test05 {
        public static void main(String[] args) {
          StringBuffer stringBuffer=new StringBuffer("abc");
          //此时stringBuffer对象的初始空间为传入字符串长度+16,改的还是自身的空间,append里面的参数也可以是任意类型
          stringBuffer.reverse();
          //StringBuffer方法的所有方法都是会去对自己操作,会修改自己
          System.out.println(stringBuffer);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    c 示例代码运行截图

    在这里插入图片描述

    1.2.3 字符串插入insert

    a 语法
    StringBuffer对象名.insert(int offSet,插入元素);
    //插入元素可以是任意类型,offSet为插入的位置,这样原来的offSet以及其后的元素都会往后移动一格
    
    • 1
    • 2
    b 示例代码
    package Work;
    public class Test05 {
        public static void main(String[] args) {
          StringBuffer stringBuffer=new StringBuffer("abc");
          //此时stringBuffer对象的初始空间为传入字符串长度+16,改的还是自身的空间,append里面的参数也可以是任意类型
          stringBuffer.insert(0,100);
          System.out.println(stringBuffer);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    c 示例代码运行截图

    在这里插入图片描述

    1.2.4 无参构造

    a.语法
    StringBuffer stringBuffer=new StringBuffer();
    
    • 1
    b 示例代码
    package Work;
    public class Test05 {
        public static void main(String[] args) {
         //创建一个StringBuffer对象,底层的数组长度为16,如果是JDK1.8,那么底层就是char数组,如果是JDK13,那么底层为byte类型的数组
          StringBuffer stringBuffer=new StringBuffer();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    c 底层源码显示(JDK1.8为例子)

    在这里插入图片描述

    在这里插入图片描述

    1.2.3 有参构造(参数为数组容量)

    a 语法
    StringBuffer stringBuffer=new StringBuffer(底层数组容量);
    
    • 1
    b 示例代码
    package Work;
    public class Test05 {
        public static void main(String[] args) {
         //创建一个StringBuffer对象,底层的数组长度为16,如果是JDK1.8,那么底层就是char数组,如果是JDK13,那么底层为byte类型的数组
          //给多少数字,那底层的数组长度就为多少  
          StringBuffer stringBuffer=new StringBuffer(32);
          //此时stringBuffer的底层数组长度为32
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    c 底层源码显示

    在这里插入图片描述

    1.2.4 有参构造(参数为传进去的字符串)

    a 语法
    StringBuffer stringBuffer=new StringBuffer(CharSequence seq);
    //这个字符序列实际上可以传入任意字符串,因为String类实现了CharSequence接口
    //只不过是多态的一种体现罢了
    //得到的底层数组长度=传入的字符串长度+16;
    
    • 1
    • 2
    • 3
    • 4
    b 示例代码
    package Work;
    public class Test05 {
        public static void main(String[] args) {
         //创建一个StringBuffer对象,底层的数组长度为16,如果是JDK1.8,那么底层就是char数组,如果是JDK13,那么底层为byte类型的数组
          StringBuffer stringBuffer=new StringBuffer("abc");
          //此时stringBuffer的底层数组长度为3+16=19
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    c 示例代码运行截图

    在这里插入图片描述

    2 StringBuilder

    2.1 核心

    a 线程不安全

    b. 速度相对于StringBuffer快

    c. 自动扩容(本质还是新开辟一个新的数组(把value的指向改成了这个新的数组))

    2.2 常用方法

    与StringBuffer拥有的方法的使用方式差不多,这里就不赘述了

    3 常用问题

    3.1 字符串拼接我们有+、concat、append这三种,我们应该使用哪种呢?

    对于使用很少的固定不变的量,就使用+

    对于需要频繁拼接的操作,建议用StringBuffer中的append操作,不要用concat

    因为concat能实现的功能append不仅能实现,而且更省空间(StringBuffer只要没有超过容量都不用去开辟新的数组空间)

    3.2 如何提高使用StringBuffer的效率

    解答:预估容量(把底层的数组按照这个长度来),这样就能减少自动扩容的次数(每扩容一次,都会开辟一个新的数组空间,然后还会把原数组的值依次放入新数组中,这些操作都是需要耗费时间的)

  • 相关阅读:
    ESBuild压缩CSS引发的一个兼容性Bug的解决姿势
    transforme学习
    4-python算法常用模块
    C语言中字符串相关操作函数
    Perforce发布《2023游戏开发与设计现状报告》,为游戏开发行业提供参考
    周记之学习总结
    ArcGIS 10.7之 栅格影像裁剪操作
    【人工智能】【Python】Matplotlib基础
    M.2接口电路设计
    windows安装nginx
  • 原文地址:https://blog.csdn.net/SSS4362/article/details/126024534