请选择 进入手机版 | 继续访问电脑版

重载“+”与StringBuilder

[复制链接]
admin 发表于 2020-2-8 22:31:13 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
String对象是不可变的。涉及String值的操作都是创建了一个全新的String对象,原来的String值一点也没有变。用于String的“+”与“+=”是Java中仅有的两个重载过的操作符,并不允许程序员重载任何操作符。
操作符“+”可以用来连接String:
public class Concatenation{
    public static void main(String args[]){
       String mango =  "mango";
       String s = "abc" + mango + "def" + 47;
       System.out.println(s);                 
    }   
}
接着我们用JDK自带的工具javap进行反编译以上代码,命令如下:
javac Concatenation.java
javap -c Concatenation
从上图可以看出编译器创建了一个StringBuilder对象,用以构造最终的String,并为每一个字符串调用了一次StringBuilder的append()方法,总计四次。最后调用toString()生成结果。
编译器对String的优化public class WhitherStringBuilder {  
    public String implicit(String[] fields) {
        String result = "";  
        for (int i = 0; i < fields.length; i++)   
            result += fields;   
        return result;  
    }


    public String explicit(String[] fields) {  
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < fields.length; i++)  
            result.append(fields);  
        return result.toString();  
    }  
}
接着用反编译器进行编译一下,首先是implicit()方法:
从上图可以注意到从第8行到第35行是一个循环体,每循环一次,都会创建一个新的StringBuilder对象。接着来看下explicit()方法对应的字节码:
从上图可以看出不仅循环部分的代码更简短、更简单,而且它只生成了一个StringBuilder对象。
StringBuilder特点
可以为StringBuilder预先指定大小,如果知道最终的字符串长度,可以预先指定StringBuilder的大小,以避免多次重新分配缓冲。
如果要在toString()方法中使用循环的话,最好自己创建一个StringBuidler对象。
StringBuidler提供了丰富而全面的方法,包括insert(),replace(), substring(),reverse(),最常用的方法是append()和toString()方法。
StringBuilder线程不安全,效率高,StringBuffer 线程安全,效率低。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝8

帖子753

发布主题
关闭

站长推荐 上一条 /1 下一条

这里有你想要的资源,懂您所要!

扫描二维码关注我们

© 2019 YOU友共享资源网版权所有 ( 蜀ICP备19016380号-1 )