论坛首页 Java企业应用论坛

10万个字符串相加会发生什么??

浏览 19337 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-31  
其实
String a = "1" + ..... + ...



StringBuffer sbuff = new StringBuffer();
sbuff.append(..).append(..)

是一样的..


String a = "1";
a += "b";
就不一样了。。

0 请登录后投票
   发表时间:2010-02-01  
没必要用线程安全,StringBuilder效率更高。
0 请登录后投票
   发表时间:2010-02-01  
如果是要设计多线程的话,建议使用StringBuffer,否则尽量使用StringBuilder
0 请登录后投票
   发表时间:2010-02-01  
RednaxelaFX 写道
mengke 写道
楼主应该学习了解一下String的类型,这样的频繁拼接应该用StringBuffer

楼主的描述似乎表明这段代码并不是楼主自己写的,而是楼主接手维护的。这种状况让人同情……
而且原本那段代码要表达的意图大概是这样:
List<String> mobilenumber = new ArrayList<String>();
while((fileLine = in.readLine()) != null) {
  line_num++;
  if(CTools.checkMobileValid(fileLine)!=0) {
    text_error = "error";
    send_hash.put(String.valueOf(hash_num), line_num + "_" + "您输入的手机号码无效!");
    hash_num++;
  }
  else {
   mobilenumber.add(fileLine);
  }
}
String[] mobilenumber_arry = mobilenumber.toArray(new String[mobilenumber.size()]);

楼主显然也知道这点……只是提醒一下大家说别像顶楼代码那样乱搞而已,吧?


建议楼主看看mobilenumber_arry下面究竟是要做什么用的,当mobilenumber的记录达到一定条数之后,就做一次处理,否则等到字符串都读完了再toArray,可能会OOM!
0 请登录后投票
   发表时间:2010-02-01  
mobilenumber += fileLine + ",";

String[] mobilenumber_arry = mobilenumber .split(",");
这两个地方都很要命。
字符串相加,会把内存吃光的,谁写的,太有才了。
还有第二行,性能很有问题。数据库设计的方式就有问题。
像这样的大数据量,用分割成数组效率很低的。
0 请登录后投票
   发表时间:2010-02-01  
fish2007 写道
JDK5之后,完全可以用“+”操作符来连接字符串,因为在JDK5之后,java会用StringBuilder来处理

真的吗?头一次听到...
0 请登录后投票
   发表时间:2010-02-01  
引用
while((fileLine = in.readLine()) != null) { 


你这样如果有一万行,那需要进行10000次的IO,需要考虑Buffer,减少IO才是提升性能的王道.

  另外,即使用StringBuilder了,也要给其提供合适的capability才合适.
0 请登录后投票
   发表时间:2010-02-01  
mazzystar 写道
蜗牛创业网 写道
append太多了会溢出。
我的意思是 buffer append太多,在很久以前这件事在我面前发生了

能说说最后怎么解决的吗?


ByteArrayOutputStream
0 请登录后投票
   发表时间:2010-02-01  
不说别的,光说这10W次循环@_@
0 请登录后投票
   发表时间:2010-02-01  
听哥一句用数组吧..先弄个足够大的数组...一行一行放.弄个数字记录.到了数组哪行了.如果不够数组扩容..至于那个需求..list和map都不行..容易内存溢出
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics