public class Example{
public static void main(String args[]){
String s1=new String("name");
String s2="name";
System.out.println(s1==s2);
}}
为什么上面的代码会返回false
?当创建一个新的字符串“name”时,它会在字符串常量池和堆中创建。接下来当使用文字“name”创建另一个字符串时,它是否应该引用在堆中创建的同一个对象,因为字符串常量池中已经存在文字“name”?
答案 0 :(得分:2)
new
总是会创建一个新实例...从而规避所有缓存和池化。因此new String("name")
将创建一个包含字符串"name"
的新字符串对象。
但是,当找到文字"name"
时,字符串"name"
已生成并放置在池中。因此,甚至在调用new
之前。
出于同样的原因,你应该总是这样做:
Long.valueOf(42L);
而不是
new Long(42L);
因为new
可以保证返回一个新实例。没有办法解决这个问题。
答案 1 :(得分:1)
在Java中,当您说new
时,您将获得一个新对象。文字“name”后面的实例位于常量池中,它由构造函数访问,复制并从new
表达式返回。