2013-07-10 28 views
3

谁能解释为什么会出现这种情况?文件大小高达2MB。代码执行时间少于2秒。较大差异读

try { 
    while ((line = br.readLine()) != null) { 
     System.out.println(line); 
} 
catch(Exception e) 
{   
} 

但是,当我的代码更改为:

String temp = ""; 
try { 
    while ((line = br.readLine()) != null) { 
     temp =temp + line; 
} 
catch(Exception e) 
{ 
} 

我明白这将需要相对更长的时间,但它需要470秒,大量的时间。为什么这个区别?

+3

http://stackoverflow.com/questions/1126388/slow-string-concatenation-over-large-input – assylias

+6

字符串连接速度很慢。 – Haile

+0

'StringBuilder'可能是一个选项! – NINCOMPOOP

回答

6
temp =temp + line; 

的AS-是一个字符串的串联。连接要求创建一个新的字符串对象,并可能需要执行,耗费大量时间。相反,请考虑在大多数情况下使用StringBuilder或需要同步的StringBuffer。

StringBuilder sb=new StringBuilder() 

创建一次,追加用:

sb.append(line); 

您可以再与sb.toString()获取数据。

+3

在大多数情况下,首选'StringBuilder'通过'StringBuffer'。 – arshajii

+0

@hexafraction [Yes](http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html) – informatik01

+0

是的,'StringBuffer'是同步的,而'StringBuilder'不是。 – arshajii

1

在Java中,字符串是不可变的。所以,这种说法:

temp =temp + line; 

创建的文件,每行一个新的字符串对象,它会减慢速度。一些更好的选择包括StringBuilderStringBuffer

你可以找到一些基准here比较这3种串联字符串的速度。