2010-09-06 80 views
14

String str = new String("SOME")String str="SOME" 这两个声明是否会影响性能?Java String声明

+0

另请参阅http://stackoverflow.com/questions/334518/java-strings-string-s-new-stringsilly和http://stackoverflow.com/questions/390703/what-is-the-purpose-of -the-expression-new-string-in-java – polygenelubricants 2010-09-06 17:41:59

回答

29
String str = new String("SOME") 

总是在堆上创建一个新的对象

String str="SOME" 

使用String pool

试试这个小例子:

 String s1 = new String("hello"); 
     String s2 = "hello"; 
     String s3 = "hello"; 

     System.err.println(s1 == s2); 
     System.err.println(s2 == s3); 

为了避免在堆上使用创建unnecesary对象第二种形式。

9

两者之间有一个小的差异。

第二声明assignates关联到恒定SOME到可变str

首先声明参考创建具有用于值恒定SOME的值的新的字符串和其assignates参照可变str

在第一种情况下,创建了第二个字符串,其值与SOME的值相同,这意味着更多的初始化时间。因此,你应该避免它。此外,在编译时,所有常量SOME都被转换成相同的实例,这使用的内存少得多。

因此,总是比较喜欢第二种语法。

+3

为了记录,有些情况下'new String(String)'是有意义的,就像你有一个非常大的字符串一样,而你只关心保留一个小的子字符串。 'substring'方法只返回原始字符串的flyweight视图,所以使用'new String(hugeString.substring(a,b))'强制一个副本,并让GC在它退出时回收'hugeString'的内容范围。他们不应该让它成为构造函数,尽管... – gustafc 2010-09-06 15:16:32

+0

确实有趣的优化案例,但在完成一些分析器检查之前我不会走这条路(我想你会这样)。 – Riduidel 2010-09-06 15:41:38

0

第一个将在堆中创建新的String对象,str将引用它。另外文字也将被放置在字符串池中。这意味着将创建2个对象并创建1个参考变量。

第二个选项将只在池中创建String文字,str将引用它。因此只会创建1个对象并创建1个引用。该选项将始终使用String pool中的实例,而不是在每次执行时都创建一个新实例。