`
yutinglong
  • 浏览: 64179 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

String与StringBuffer的区别

    博客分类:
  • J2SE
阅读更多

      String是一个final Class StringBuffer不是。所以对于 String a = "yacht" ,String b = "yacht1" String c = a + b ; 存在一个对象拷贝构造和解析的消耗问题;对于一个StringBuffer来说,StringBuffer sb = new StringBuffer()sb.append("yacht") ; sb.append("yacht1"); 因为StringBuffer是一个可以实例化的类,而且它的内建机制是维护了一个capacity大小的字符数组,所以它的append操作不存在对象的消耗问题,所以我觉得如果存在String连接这种事情,StringBuffer来做会好很多。

         但事情并不是这么简单,看下面代码

         String a = "yacht1" + "yacht2" + "yacht3" + "yacht4";

         StringBuffer sb = new StringBuffer();

         sb.append("yacht1") ;

         sb.append("yacht2");

         sb.append("yacht3") ;

         sb.append("yacht4");   

         String a = sb.toString();

         如果按照我先前说的看法,红色的效率肯定比蓝色的低,但经过测试不是这样,为什么?这里,我们需要理解程序过程的两个时期,一个是编译时,一个是运行时,在编译时,编译器会对你的程序做出优化,所以红色的String a会被优化成yacht1yacht2yacht3yacht4,而蓝色的StringBuffer只会在运行时才处理。所以效率是不一样的。

         如果代码是这样的:

         String a ;

         for(int i = 0; i< 100000;i++){ a += String.valueOf(i) ;}

         StringBuffer sb = new StringBuffer();

         for(int i = 0; i< 100000;i++){ sb.append(i) ;}

         String a = sb.toString();

         如果是这种情况的话,红色的效率就大大不如蓝色,区别在哪里,就在于运行时和编译时的优化问题上!

         我在想,我们要做一个好的writer,不仅要知道怎么用,还要知道怎么用好,这需要内功的修练,花拳绣腿是招架不住的!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics