您的位置:首页 > Web前端

String、StringBuilder和StringBuffer

2019-04-17 14:00 120 查看

一、认识String
被final修饰,不可被继承;
底层实现原理是通过char数组来保存字符串的;
对String对象的任何操作(如concat、replace等)都不会改变原对象,而是生成新的String对象(分析源代码可以发现,这些操作最后都是通过new String返回了一个新的对象);
如:

[code]public String concat(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
        return this;
    }
    int len = value.length;
    char buf[] = Arrays.copyOf(value, len + otherLen);
    str.getChars(buf, len);
    return new String(buf, true);
}

二、有了String,为何还需要StringBuffer和StringBuilder?
目的在于减少资源的使用。下面我们以字符串拼接为例来简单看一下。

demo1:

[code]/**
 * 会产生100个String对象
 */
public class StringLoopMain1 {
    public static void main(String[] args) {
        String s = "";
        for(int i=0;i<100;i++){
            s += "hello";
        }
    }
}

对应的字节码分析结果如下:

demo2:

[code]/**
 * 产生一个对象,append操作都是基于原对象操作的
 
 单线程环境使用
 */
public class StringLoopMain2 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<100;i++){
            sb.append("hello");
        }
    }
}

对应的字节码分析结果如下:

demo3:

[code]/**
 * 产生一个对象,append操作都是基于原对象操作的
 
 同StringBuilder的区别:线程安全,每个方法都加了synchronized关键字。
 
 多线程环境使用
 */
public class StringLoopMain3 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<100;i++){
            sb.append("hello");
        }
    }
}

对应的字节码分析结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: