如果我跑,
String s1="abc";
那么有什么区别:
String s2=new String(s1);
和
String s2="abc";
这就是我感到困惑的地方:
Head First Java 说:“如果字符串池中已经有一个具有相同值的字符串,那么 JVM 不会创建重复项,它只是将您的引用变量引用到现有条目。”在我看来是s1 已经创建了“abc”,s2 只是引用它。我对吗??
如果我跑,
String s1="abc";
那么有什么区别:
String s2=new String(s1);
和
String s2="abc";
这就是我感到困惑的地方:
Head First Java 说:“如果字符串池中已经有一个具有相同值的字符串,那么 JVM 不会创建重复项,它只是将您的引用变量引用到现有条目。”在我看来是s1 已经创建了“abc”,s2 只是引用它。我对吗??
当您编写String s2="abc";
并且"abc"
已经在池中时,您将不会得到重复 - 您将获得对现有String
.
但是如果你写new String(something)
,你会得到一个新String
的,无论池中是否有匹配String
。
在这种情况下,字符串常量池就出现了,如下面的屏幕截图所示。
我认为这将有助于您从视觉上理解它。
String s1="abc"; // s1 will go to String constant pool
String s2=new String(s1); // any object created by "new" keyword will go to Heap
String s2="abc"; // s1 and s2 both will refer to same string in constant pool
new 关键字将强制在堆中创建一个新的字符串对象,即使它已经存在于字符串池中