用Java初始化字符串

时间:2012-01-18 00:43:09

标签: java string

考虑以下代码:

  1. 如何在不使用str1的情况下创建new String()对象?
  2. 为什么str1str2对象引用相同的内存位置?
  3. String str1 = "hello";
    String str2 = "hello";
    

4 个答案:

答案 0 :(得分:5)

这一切都在java语言规范中描述。

请参阅3.10.5 String Literals

  

每个字符串文字都是实例的引用(第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;