zoukankan      html  css  js  c++  java
  • Java学习笔记 -StringBuffer & StringBuilder

    StringBuffer

    如果频繁进行字符串拼接,会有什么问题?

    因为Java中字符串是不可变的,每一次拼接都会产生新的字符串,这样会占用大量的字符串常量池内存,造成浪费
    例如:

    String s = "Hello";    
    s += " World";
    

    以上两行代码就在方法区内存中创建了3个字符串对象"Hello"," World"和"Hello World".

    StringBuffer进行拼接

    • String底层是一个不可修改的byte[]数组(final byte[] value),final修饰数组对象,所以字符串对象一旦创建不可变,但是引用是可以变的
      - 如:String s = "xy"; s = "add"; 对象"xy"不可变,但是引用s可变
    • 与之区别,StringBhffer底层实际上是一个"可修改"的数组 (byte[] value)

    因为数组的长度不可变,所以StringBuffer进行字符串拼接的底层操作:

    • 新建一个更大的数组用来存储
    • System.arraycopy()后,释放原数组内存
    • 引用指向新的数组

    因此,想要提高StringBuffer的性能:

    在创建StringBuffer的时候尽可能给定一个合适的初始化容量,以减少底层数组扩容的次数

    示例:

    public class StringBufferTest01 {
        //使用拼接的方法,会浪费字符串常量池的内存
        public static void main(String[] args) {
            //无参构造:创建一个初始化容量为16个byte[]数组,字符串缓冲区对象
            StringBuffer stringBuffer = new StringBuffer();
    
            //使用方法append()进行字符串拼接
            stringBuffer.append("abc");
            stringBuffer.append(true);
            stringBuffer.append(3.14);
            System.out.println(stringBuffer);
    
            //有参构造:可以指定初始化容量的构造方法
            StringBuffer stringBuffer1 = new StringBuffer(50);
            stringBuffer1.append("Hello World");
            System.out.println(stringBuffer1);
        }
    }
    

    StringBuilder

    • StringBuffer中的方法都有:synchronized 关键字修饰,而StringBuilder中的方法都没有。
    • synchronized 关键字:表示在多线程环境下运行是安全的
    • StringBuffer是线程安全的,StringBuilder是非线程安全的,其他方面二者都是一样的

    示例:

    public class StringBuilderTest01 {
        public static void main(String[] args) {
            //使用StingBuilder也可以完成字符串的拼接
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("abc");
            stringBuilder.append(true);
            stringBuilder.append(3.14);
            System.out.println(stringBuilder);
        }
    }
    
    
  • 相关阅读:
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    set IDENTITY_INSERT on 和 off 的设置
    导入本地Excel到DataSet中
    SQL结果统计 GROUP BY
    算法:10幢房子分给3个人
  • 原文地址:https://www.cnblogs.com/zy200128/p/12889266.html
Copyright © 2011-2022 走看看