String str = new String("SOME")
和String str="SOME"
这两个声明是否会影响性能?Java String声明
回答
String str = new String("SOME")
总是在堆上创建一个新的对象
String str="SOME"
试试这个小例子:
String s1 = new String("hello");
String s2 = "hello";
String s3 = "hello";
System.err.println(s1 == s2);
System.err.println(s2 == s3);
为了避免在堆上使用创建unnecesary对象第二种形式。
两者之间有一个小的差异。
第二声明assignates关联到恒定SOME
到可变str
首先声明参考创建具有用于值恒定SOME
的值的新的字符串和其assignates参照可变str
。
在第一种情况下,创建了第二个字符串,其值与SOME
的值相同,这意味着更多的初始化时间。因此,你应该避免它。此外,在编译时,所有常量SOME
都被转换成相同的实例,这使用的内存少得多。
因此,总是比较喜欢第二种语法。
为了记录,有些情况下'new String(String)'是有意义的,就像你有一个非常大的字符串一样,而你只关心保留一个小的子字符串。 'substring'方法只返回原始字符串的flyweight视图,所以使用'new String(hugeString.substring(a,b))'强制一个副本,并让GC在它退出时回收'hugeString'的内容范围。他们不应该让它成为构造函数,尽管... – gustafc 2010-09-06 15:16:32
确实有趣的优化案例,但在完成一些分析器检查之前我不会走这条路(我想你会这样)。 – Riduidel 2010-09-06 15:41:38
第一个将在堆中创建新的String对象,str将引用它。另外文字也将被放置在字符串池中。这意味着将创建2个对象并创建1个参考变量。
第二个选项将只在池中创建String文字,str将引用它。因此只会创建1个对象并创建1个引用。该选项将始终使用String pool中的实例,而不是在每次执行时都创建一个新实例。
- 1. Char * string []声明错误
- 2. 声明String s = new String(“abc”)。intern(); over String s =“abc”(反之亦然)
- 3. java stringbuffer声明
- 4. Java ArrayList声明
- 5. Java类声明
- 6. Java IF声明
- 7. Java声明
- 8. “When”声明与Java“switch”声明
- 9. Java的声明在方法调用一个String数组
- 10. 在Scala中声明Java Map <String,Object>参数?
- 11. 必须声明PL/SQL标识符'string'
- 12. GPathResult为String没有XML声明
- 13. Java类型声明
- 14. Java声明变量
- 15. Int Def声明Java
- 16. Java - 参数声明
- 17. Java变量声明
- 18. Java界面声明
- 19. java bufferedreader,声明readline
- 20. 如果声明JAVA
- 21. java变量声明
- 22. 在JavaScript中声明hashmap与<String,String array>
- 23. 如何声明HashMap <String,ArrayList <ArrayList <String> >>?
- 24. 声明一个String并将其声明为final有什么区别?
- 25. 在Java中声明集合
- 26. Java通用方法声明
- 27. 的Java class.forClass()VS类声明
- 28. java类声明<T>
- 29. bash grep查找java声明
- 30. Java泛型方法声明
另请参阅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