使用Literal和new关键字的Java String构造

时间:2016-09-05 13:44:53

标签: java string

    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”?

2 个答案:

答案 0 :(得分:2)

new总是会创建一个新实例...从而规避所有缓存和池化。因此new String("name")将创建一个包含字符串"name"的新字符串对象。

但是,当找到文字"name"时,字符串"name"已生成并放置在池中。因此,甚至在调用new之前。

出于同样的原因,你应该总是这样做:

Long.valueOf(42L);

而不是

new Long(42L);

因为new可以保证返回一个新实例。没有办法解决这个问题。

答案 1 :(得分:1)

在Java中,当您说new时,您将获得一个新对象。文字“name”后面的实例位于常量池中,它由构造函数访问,复制并从new表达式返回。