【发布时间】:2023-03-12 09:21:01
【问题描述】:
String str = new String("SOME") 和 String str="SOME" 有什么区别
这些声明是否会产生性能变化。
【问题讨论】:
String str = new String("SOME") 和 String str="SOME" 有什么区别
这些声明是否会产生性能变化。
【问题讨论】:
两者之间存在细微差别。
第二个声明将与常量SOME关联的引用分配给变量str
第一个声明创建一个新字符串,其值为常量SOME 的值,并将其引用分配给变量str。
在第一种情况下,创建了第二个字符串,其值与SOME 相同,这意味着更多的初始化时间。因此,您应该避免它。此外,在编译时,所有常量 SOME 都被转换为同一个实例,从而使用更少的内存。
因此,总是更喜欢第二种语法。
【讨论】:
new String(String) 是有意义的,例如如果您有一个非常大的字符串并且您只对保留一个小子字符串感兴趣。 substring 方法只返回原始字符串的享元视图,因此使用 new String(hugeString.substring(a, b)) 强制复制并让 GC 在超出范围时回收 hugeString 的内容。不过,他们不应该将其设为构造函数……
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);
为避免在堆上创建不必要的对象,请使用第二种形式。
【讨论】:
第一个将在堆中创建新的 String 对象,str 将引用它。此外字面量也将被放置在字符串池中。这意味着将创建 2 个对象和 1 个引用变量。
第二个选项将仅在池中创建字符串文字,str 将引用它。所以只会创建 1 个对象和 1 个引用。此选项将始终使用字符串池中的实例,而不是每次执行时都创建一个新实例。
【讨论】:
String s1 = "Welcome"; // Does not create a new instance
String s2 = new String("Welcome"); // Creates two objects and one reference variable
【讨论】: