A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

黑马伍哲沂 发表于 2013-5-5 16:29
String、StringBuilder、StringBuf ...
  1. package cn.itcast.problem;

  2. public class StringBufferTest {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 long begin=System.currentTimeMillis();
  8.                 testStringBuilder();
  9.                 long end=System.currentTimeMillis();
  10.                 System.out.println("cost.."+(end-begin));
  11.         }

  12.         private static void testString() {
  13.                 String str=new String();
  14.                 //这里循环不能太大,否则会耗时很久,甚至内存溢出;
  15.                 for(int i=0;i<20000;i++){
  16.                         //这样最垃圾的操作,每次都会有很多的new String();对象;
  17.                         str+=" * "+i+" * ";
  18.                 }
  19.         }
  20.        
  21.         private static void testStringBuffer(){
  22.                 StringBuffer sb=new StringBuffer();
  23.                 for(int i=0;i<20000;i++){
  24.                         //这样用+号,每次+都会有一个StringBuilder创建出来
  25.                         sb.append(" * "+i+"  * ");
  26.                 }
  27.                 String str=sb.toString();
  28.         }
  29.        
  30.         private static void testStringBuffer2(){
  31.                 StringBuffer sb=new StringBuffer();
  32.                 for(long i=0;i<100000;i++){
  33.                         //注意和上面+有所不同,这样虽然更麻烦,但是更加高效;他只有一个StringBuffer;
  34.                         sb.append(" * ");
  35.                         sb.append(i);
  36.                         sb.append(" * ");
  37.                 }
  38.                 String str=sb.toString();
  39.         }
  40.        
  41.         private static void testStringBuilder(){
  42.                 StringBuilder sb=new StringBuilder();
  43.                 //这里为了看到效果设置大一点:
  44.                 for(long i=0;i<100000;i++){
  45.                         //这是最高效的方式。推荐使用;
  46.                         sb.append(" * ");
  47.                         sb.append(i);
  48.                         sb.append(" * ");
  49.                        
  50.                 }
  51.                 String str=sb.toString();
  52.         }
  53.        
  54.         private static void testStringBuilder2(){
  55.                 StringBuilder sb=new StringBuilder();
  56.                 for(long i=0;i<100000;i++){
  57.                         //这样不推荐使用,跟上面的一样。。。
  58.                         sb.append(" * "+i+"  * ");
  59.                 }
  60.                 String str=sb.toString();
  61.                
  62.         }

  63. }
复制代码
结论:使用StringBuilder而不是StringBuffer和String;
使用多个append而不是+号;
ps:看了你的帖子回去查了下资料,虽然试验了下,如书上所说,可是我找不到原因,悲剧啊。。
建议版主加精。。。
回复 使用道具 举报
我注释的地方是书上说的,可是我不知道为什么,看源代码也找不到为什么。。。
这几天跟你的贴,学到了好多东西,真幸运。。。谢谢哥们了。。。
回复 使用道具 举报
Miss小强 发表于 2013-5-8 20:19
结论:使用StringBuilder而不是StringBuffer和String;
使用多个append而不是+号;
ps:看了你的帖子回去 ...

使用append而不使用+号  是可以理解的。  因为+号就是用来连接字符串的。
你在append方法里用+号,就是两个字符串的链接。两个字符串串联会产生很多多余对象。
之前好像看到有资料说+是调用了concat方法。但我不确定。
回复 使用道具 举报
追问:突然想到,如果这样的话,

用char数组存多个中文字符 比用string好在哪?
这个问题的答案应该是使用字符数组更高效了??
回复 使用道具 举报
Miss小强 发表于 2013-5-8 20:21
我注释的地方是书上说的,可是我不知道为什么,看源代码也找不到为什么。。。
这几天跟你的贴,学到了好多 ...

客气了。多交流,相互学习。更容易进步。其实我也只是菜鸟。。。  不过我整理帖子会比较认真。所以,别的人看起来就好像我懂很多一样。。  都是假象  哈哈  努力中。。。  
回复 使用道具 举报
Miss小强 发表于 2013-5-8 20:27
追问:突然想到,如果这样的话,

用char数组存多个中文字符 比用string好在哪?

这个问题。我表示没有研究,不清楚就不乱说了。  但String类这里其实有个设计模式,叫做不变模式。  如果你想深究,你可以参考下不变模式,然后再找找字符数组与String的比较资料。  这个我暂时不想深究了。  因为还有很都多基础任务没完成。
回复 使用道具 举报
黑马伍哲沂 发表于 2013-5-8 20:32
这个问题。我表示没有研究,不清楚就不乱说了。  但String类这里其实有个设计模式,叫做不变模式。  如果 ...

好吧,哥们加油。。。我在看看源代码去。。
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马