考虑以下代码:
str1
的情况下创建new String()
对象?str1
和str2
对象引用相同的内存位置?
String str1 = "hello";
String str2 = "hello";
答案 0 :(得分:5)
这一切都在java语言规范中描述。
每个字符串文字都是实例的引用(第4.3节)(§4.3.1, 类String的§12.5)(§4.3.3)。 String对象具有常量值。 字符串文字 - 或者更一般地说,是字符串的值 常量表达式(§15.28) - “实习”以便分享唯一的 实例,使用String.intern。方法。
答案 1 :(得分:3)
在java中,您可以在不调用新运算符的情况下创建String对象。因此,String str1 = "hello"
等同于String str1 = new String("hello")
。这样做是为了使字符串声明类似于原始数据类型。
关于他们为什么提到相同的记忆位置:
在java中有一个String literal pool的概念。为了减少在JVM中创建的String对象的数量,String类保留了一个字符串池。每次代码创建字符串文字时,JVM首先检查字符串文字池。如果池中已存在该字符串,则返回对池化实例的引用。如果池中不存在该字符串,则新的String对象将实例化,然后放入池中。
String str1 = "Hello";
String str2 = "Hello";
System.out.print(str1 == str2);
打印True
。
如果你这样做:
String str1 = "Hello";
String str2 = new String("Hello");
System.out.print(str1 == str2);
打印False
。
因为,String对象是从String文字池中创建的。
答案 2 :(得分:1)
“hello”是Java中的字符串文字。 Java创建了一个字符串文字池,因为字符串是不可变和可重用的。通过new String("hello")
,您将创建一个额外的字符串对象,即使池中已存在等效文字。
答案 3 :(得分:0)
正如string javadoc建议
String str1 = "hello";
相当于
char data[] = {'h', 'e', 'l', 'l', 'o'};
String str = new String(data);
As Java Language Specification建议常量字符串(在本例中为"hello"
)为String.intern,意味着它们共享相同的内存并引用相同的引用。所有interend字符串都存储在String常量池中(有关详细信息,请参阅此帖子Identify library file/Source that contains native method implementation)
作为常量表达式(§15.28)-are的值的字符串 “interned”以便使用
方法共享唯一的实例
但是,如果您自己使用new String()
创建它,则会分配新的内存
String str = "hello";
String str1 = new String(str);
String str2 = new String(str);
assert: str1 != str2;
//Force strings into constant pool
String str3 = str1.intern();
String str4 = str2.intern();
assert: str == str3;
assert: str3 == str4;