【特地回家找大神】String和StringBuffer效率和内存溢出问题

SevenShy 2015-11-07 06:35:24
如:
有一个80M的文本需要按照一定规则读取拼接;
方法:
【1】以String按照一定规则循环读取拼接,核心代码如下:
while((buffer=reader.readLine())!=null)
{
string+=buffer;
} //导致执行时间巨慢,但是以一个3M的文件为例执行时间20分钟;
【2】以StringBuffer按照规则用其append()方法拼接,核心代码如下:
while((tem=reader.read())!=-1)
{
buffer.append((char)tem);
} //同样以3M文本为例,执行时间为2秒;

那么问题来了:采用了第二种方法虽然很快,但是无法完成80M文件的读取:

【报错】Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space ,内存溢出;
而这个错误并不是文件大的原因,以为用第一种方法是可以执行的(就是慢的没见过出结果)-_-!

【求解决】一下是报错的java源码报错点:

public StringBuilder append(char c) {
super.append(c); //报错点
return this;
}
public AbstractStringBuilder append(char c) {
ensureCapacityInternal(count + 1);//报错点
value[count++] = c;
return this;
}
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0)
expandCapacity(minimumCapacity);//报错点
}
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);//报错点
}
public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength];//报错点
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
...全文
734 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
cwek 2015-11-07
  • 打赏
  • 举报
回复
加大jvm初始化的堆大小 提前将StringBuffer初始化为80M字节。因为StringBuffer的每次扩容会占多自身内部value两倍+2的char[]空间,会造成堆瞬时超载。 不要用String+,这个产生更多中间String,更耗堆和垃圾回收。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧