考虑以下代码:
String first = "abc";
String second = new String("abc");
Run Code Online (Sandbox Code Playgroud)
使用new关键字时,Java会abc String再次创建吗?这会存储在常规堆还是String池中?多少人String在将s结尾String池?
在查看在线代码示例时,我有时会通过使用new运算符将String常量赋值给String对象.
例如:
String s;
...
s = new String("Hello World");
Run Code Online (Sandbox Code Playgroud)
当然,这与之相比
s = "Hello World";
Run Code Online (Sandbox Code Playgroud)
我不熟悉这种语法,也不知道目的或效果是什么.由于String常量通常存储在常量池中,然后以JVM处理String常量的任何表示形式存在,甚至还会在堆上分配任何内容?
可能重复:
Java字符串和StringPool
我创建了两个字符串
String s1="MyString";
String s2=new String("MyString");
System.out.println(s1==s2);
Run Code Online (Sandbox Code Playgroud)
它打印"false".我们知道字符串池不会为同一个字符串文字创建两个对象.
那么这里发生了什么?它在字符串池中为相同的字符串文字"MyString"创建了两个不同的字符串对象(文字).
我知道 equals()方法true在这里返回.
但是当我们使用==它时应该比较两个引用,它们应该引用String常量池中的相同String对象.
为什么即使找到匹配项,它也不会引用String池中的现有String对象?