锁定老帖子 主题:10万个字符串相加会发生什么??
精华帖 (0) :: 良好帖 (3) :: 新手帖 (7) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-31
其实
String a = "1" + ..... + ... 和 StringBuffer sbuff = new StringBuffer(); sbuff.append(..).append(..) 是一样的.. 和 String a = "1"; a += "b"; 就不一样了。。 |
|
返回顶楼 | |
发表时间:2010-02-01
没必要用线程安全,StringBuilder效率更高。
|
|
返回顶楼 | |
发表时间:2010-02-01
如果是要设计多线程的话,建议使用StringBuffer,否则尽量使用StringBuilder
|
|
返回顶楼 | |
发表时间: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! |
|
返回顶楼 | |
发表时间:2010-02-01
mobilenumber += fileLine + ",";
String[] mobilenumber_arry = mobilenumber .split(","); 这两个地方都很要命。 字符串相加,会把内存吃光的,谁写的,太有才了。 还有第二行,性能很有问题。数据库设计的方式就有问题。 像这样的大数据量,用分割成数组效率很低的。 |
|
返回顶楼 | |
发表时间:2010-02-01
fish2007 写道 JDK5之后,完全可以用“+”操作符来连接字符串,因为在JDK5之后,java会用StringBuilder来处理
真的吗?头一次听到... |
|
返回顶楼 | |
发表时间:2010-02-01
引用 while((fileLine = in.readLine()) != null) { 你这样如果有一万行,那需要进行10000次的IO,需要考虑Buffer,减少IO才是提升性能的王道. 另外,即使用StringBuilder了,也要给其提供合适的capability才合适. |
|
返回顶楼 | |
发表时间:2010-02-01
mazzystar 写道 蜗牛创业网 写道 append太多了会溢出。
我的意思是 buffer append太多,在很久以前这件事在我面前发生了 能说说最后怎么解决的吗? ByteArrayOutputStream |
|
返回顶楼 | |
发表时间:2010-02-01
不说别的,光说这10W次循环@_@
|
|
返回顶楼 | |
发表时间:2010-02-01
听哥一句用数组吧..先弄个足够大的数组...一行一行放.弄个数字记录.到了数组哪行了.如果不够数组扩容..至于那个需求..list和map都不行..容易内存溢出
|
|
返回顶楼 | |