3 回答
TA贡献1876条经验 获得超6个赞
也许这有助于您理解:
String literal = "test";String one = new String(literal);String two = "test";System.out.println(literal == two); //trueSystem.out.println(one == two); //false
在您发布的示例中:
String one = new String("test");String two = "test";
由于实习,传递给构造函数的引用与引用String(String)
具有相同的值two
。但是,字符串本身(由这两个引用引用)用于构造分配给引用的新对象one
。
在这个例子中,正好有两个String
用值“test”创建:一个在常量池中维护并"test"
在表达式中使用文字时引用,第二个由“new”运算符创建并分配给参考one
。
编辑
也许你对这句话感到困惑:
当编译器遇到String文本时,它会检查池以查看是否已存在相同的String。
请注意,这可能更明确地说明如下:
当编译器遇到String文本时,它会检查池中是否已存在相同的String 。
字符串只有在明确地实现或通过类使用文字时才放入池中。例如,如果你有这种情况:
String te = "te";String st = "st";String test = new String(te) + new String(st);
然后当一个String
将存在该值时test
,表示字符串将不存在于池中,因为文字"test"
从未发生过。
TA贡献1862条经验 获得超7个赞
//Creates a new object even if one exists in the pool String s1 = new String("Tendulkar"); // makes a new object string and then the reference is available to the pool String s2 = s1.intern(); //this object is not created but references the address present in the pool String s3 = "Tendulkar"; System.out.print(s1==s2); // results in false System.out.print(s2==s3); //very very true !!!
TA贡献1786条经验 获得超11个赞
你的问题 :
因此,当我们使用“new”并基于上面的定义创建对象时,我们还在非池内存和池内存中放置引用。当我们这样做时,JVM是否也应该返回相同的引用?:
Ans:使用new关键字创建新的字符串对象时,生成的地址将是堆地址,而不是字符串常量池地址。两个地址都不同。
问题:
String one = new String("test");
String two = "test";
System.out.println(one.equals(two)); // true
System.out.println(one == two); // false
以前的语句是否意味着它们将被放入池内存中,但在使用new运算符时会被跳过?
答:是的,您的假设是正确的。当程序员使用new关键字时,JVM将忽略关于字符串常量池,并在Heap中创建一个新副本。因此两个地址都不相同。
添加回答
举报