美文网首页
进阶:StringBuffer和StringBuilder

进阶:StringBuffer和StringBuilder

作者: 雪上霜 | 来源:发表于2020-04-29 14:43 被阅读0次
package com.Hanjiangxue.javase.stringbuffer;

//实际字符串中频繁的拼接会有什么问题?
//字符串是不可变的,每一次拼接都会产生新字符串,这样占用大量的方法区内存,造成内存空间的浪费。


public class StringBufferTest01 {
    public static void main(String[] args) {
        String s = "";

        //这样做会给字符串常量池带来很大的空间浪费。
        for(int i = 0;i < 100;i++){
            s += i;
        }
    }
}

package com.Hanjiangxue.javase.stringbuffer;

public class StringBufferTest02 {
    public static void main(String[] args) {

        //创建一个初始化容量为16个byte[] 数组。(字符串缓冲区对象)
        StringBuffer sb = new StringBuffer();
        //往StringBuffer里面放实际上是放入一个byte数组中

        //append追加
        //append在追加的时候,如果满了会自动扩容。
        sb.append("a");
        sb.append("b");
        sb.append(3949);


        //如何优化StringBuffer的性能:在创建StringBuffer的时候尽可能给定一个初始化容量,最好减少底层数组的自动扩容。
        //预估一下,给定一个合适的初始化容量。

        StringBuffer sb1 = new StringBuffer(100);

        sb1.append("hifno");

    }
}

package com.Hanjiangxue.javase.stringbuffer;

//java.lang.StringBuilder

//StringBufferh和StringBuilder的区别:
    //StringBuffer中方法都有synchronized关键字修饰,表示StringBuffer在多线程环境下运行时安全的。
    //StringBuilder中方法都没有sycnhronized关键字修饰,表示StringBuilder在多线程环境下运行时不安全的。

    //StringBuffer是线程安全的。
    //StringBuilder是非线程安全的。


public class StringBufferTest03 {
    public static void main(String[] args) {
        //使用StringBuilder也可以进行字符串扩容。
        StringBuilder sb = new StringBuilder();

        sb.append(10);
        sb.append("jwef");

    }
}

package com.Hanjiangxue.javase.stringbuffer;

//面试题:String为什么不可变?
    //String类中有一个byte[]数组,这个byte[]数组采用了final装饰,因为引用一旦创建长度不可变。并且被final修饰的引用一旦指向某个对象之后,不可指向
    //其他对象,所以String不可变。

//StringBuilder、StringBuffer为什么可变呢?
    //StringBuffer、StringBuilder内部实际上是一个byte[]数组,这个byte[]数组没有被final修饰,StringBuffer、StringBuilder的初始化容量为16,
    //当存满了之后就会进行扩容,底层调用了数组拷贝的方法System.arraycopy(),所以StringBuilder、StringBuffer适用于频繁的拼接。

public class StringBuffer04 {
    public static void main(String[] args) {
        //字符串不可变是字符串字面量在方法区常量池创建了就不可变了。

    }
}


相关文章

网友评论

      本文标题:进阶:StringBuffer和StringBuilder

      本文链接:https://www.haomeiwen.com/subject/ozngwhtx.html