字符串实习方法逻辑

时间:2017-01-29 07:12:07

标签: java string

情景1

public static void main(String[] args) throws Exception {
        String s1 = "Testing";
        String s2 = new String("Testing");
        s2.intern();
        if(s1==s2){
            System.out.println("s1 equals to s2");
        }else{
            System.out.println("s1 is not equal to s2");
        }

    }

输出: s1 is not equal to s2

场景2

public static void main(String[] args) throws Exception {       
        String s1 = "Testing";
        String s2 = new String("Testing").intern();
        if(s1==s2){
            System.out.println("s1 equals to s2");
        }else{
            System.out.println("s1 is not equal to s2");
        }
    }

输出: s1 equals to s2

我的问题是new String("Testing")new String("Testing").intern()之间有什么区别?

3 个答案:

答案 0 :(得分:3)

阅读String.intern()的文档:

  

返回字符串对象的规范表示。

您的代码会丢弃返回值,因此没有理由期望任何效果。

答案 1 :(得分:2)

Java String是不可变的,因此您必须更新s2引用。

s2.intern();更改为

s2 = s2.intern();

它将以同样的方式工作。

答案 2 :(得分:1)

阅读intern()的Javadoc:

  

当调用intern方法时,如果池已经包含一个等于此String对象的字符串(由equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。

由于String s1 = "Testing";String引用的s1添加到String池,new String("Testing").intern()会从字符串池中返回一个等于创建的字符串的实例new String("Testing"),与String引用的s1实例相同。

另一方面,在第一个代码段中,s2.intern()无效。 String等于“Testing”已经在String池中,因此String引用的s2不会添加到池中。而您忽略了该方法的返回值,即s1引用的字符串。因此s1s2引用不同的对象。