MyException - 我的异常网
当前位置:我的异常网» J2SE » StringBuilder被过于神话,包括java,net2个阵营小弟

StringBuilder被过于神话,包括java,net2个阵营小弟我都看见有人神话他

www.MyException.Cn  网友分享于:2013-01-29  浏览:22次
StringBuilder被过于神话,包括java,.net2个阵营我都看见有人神话他
Java code

        long startTime = System.currentTimeMillis();
        String aaa = "aaa";
        String ccc = "ccc";
        String ddd = "ddd";
        String eee = "ddd";
        String fff = "ddd";
        String ggg = "ddd";
        String hhh = "ddd";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10000000; i++) {
            sb.append(aaa);
            sb.append("accc");
            sb.append(ccc);
            sb.append("vvvc");
            sb.append(ddd);
            sb.append(eee);
            sb.append(fff);
            sb.append(ggg);
            sb.append(hhh);
            sb.delete(0, sb.length());
        }
//1.................
        System.out.println(System.currentTimeMillis() - startTime);
        
        try {
            Thread.sleep(1000);
        }
        catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            String acc = aaa+"accc"+ccc+"vvvc"+ddd+eee+fff+ggg+hhh;
        }
//2.................
        System.out.println(System.currentTimeMillis() - startTime);
        
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            String add = "a";
            for (int j = 0; j < 1000; j++) {
                add += aaa;
            }
        }
//3.................
        System.out.println(System.currentTimeMillis() - startTime);



测试之后结果很明显:
1 和 2时间差不多. 1显得稍微高效一点. 
  -- 但是你别忘记了,很多时候你都是new的StringBuilder对象而不是 写StringBuilder.delete 进行重复使用.
如果把new StringBuilder 的代码换到循环体里面,你会发现 StringBuilder 的效率还不如 String = +..+..+

3的时间花费令人叹服. -- 太慢了.
这也是传统意义上不停有人叫嚷 别用 String 拼接字符串 要使用 StringBuilder 的最根本性原因.
但是你有没有发现他的独特性? ---> '+='

总结一下吧:
1,如果你的需求仅仅是: String = int变量+"ccc"+String变量+String变量+String变量 的话; 那么,不要使用StringBuilder 
  -- 你是不是经常看见 有人在拼接一个明显不需要for循环的 url 的时候 采取StringBuilder 方式,并且还是和new的StringBuilder临时变量?
  -- 你是不是经常看见 有人在拼接一个明显不需要for循环的 log 输出字符串的时候 采取StringBuilder 方式?


2,如果你要用一个for循环来拼接一个 String 的话. 那么,不要使用String ;

3,出于线程并发考虑,我同时也不推荐使用StringBuilder作为全局变量.

------解决方案--------------------
1 基本没看见过你说的这情况,我都是String直接拼

------解决方案--------------------
特地跑去找了些东西
Optimization of String Concatenation 

An implementation may choose to perform conversion and concatenation in one step to avoid creating and then discarding an intermediate String object. To increase the performance of repeated string concatenation, a Java compiler may use the StringBuffer class (§20.13) or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression. 

String的+本来就是用StringBuilder(JDK 5或以上)或StringBuffer(JDK 1.4或以下)实现的。 
关键问题是:是不是同一个StringBuilder/StringBuffer。

在循环里用+=之类的方式来拼接字符串的问题就出在每轮循环里都new了一个StringBuilder/StringBuffer来做拼接,然后toString()完就抛弃了,等下轮循环进来又再new一个。 

以上全部从RednaxelaFX博客里面翻出来的东西
http://rednaxelafx.iteye.com/blog/1042464
神不神话什么的完全看你怎么用.
------解决方案--------------------
Java code
public class Example {
    public static void main(String[] args) {
        String aaa = "aaa";
        String ccc = "ccc";
        String ddd = "ddd";
        String eee = "ddd";
        String fff = "ddd";
        String ggg = "ddd";
        String hhh = "ddd";
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            String acc = aaa+"accc"+ccc+"vvvc"+ddd+eee+fff+ggg+hhh;
        }
        System.out.println(System.currentTimeMillis() - startTime);               
    }
}

文章评论

如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
Java程序员必看电影
Java程序员必看电影
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
漫画:程序员的工作
漫画:程序员的工作
我的丈夫是个程序员
我的丈夫是个程序员
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
如何成为一名黑客
如何成为一名黑客
那些争议最大的编程观点
那些争议最大的编程观点
每天工作4小时的程序员
每天工作4小时的程序员
鲜为人知的编程真相
鲜为人知的编程真相
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
 程序员的样子
程序员的样子
老程序员的下场
老程序员的下场
我是如何打败拖延症的
我是如何打败拖延症的
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
总结2014中国互联网十大段子
总结2014中国互联网十大段子
一个程序员的时间管理
一个程序员的时间管理
程序员应该关注的一些事儿
程序员应该关注的一些事儿
中美印日四国程序员比较
中美印日四国程序员比较
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
旅行,写作,编程
旅行,写作,编程
程序员必看的十大电影
程序员必看的十大电影
程序员的鄙视链
程序员的鄙视链
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有