Java 字符串内部方法逻辑

Java 字符串内部方法逻辑,java,string,Java,String,情景1 输出:s1不等于s2 情景2 输出:s1等于s2 我的问题是new StringTesting和new StringTesting.intern之间有什么区别?Java字符串是不可变的,因此必须更新s2引用 改变2.实习;到 它也会以同样的方式工作。阅读intern的Javadoc: 调用intern方法时,如果池中已包含一个字符串,该字符串等于equalsObject方法确定的该字符串对象,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用 因为字符串s1=

情景1

输出:s1不等于s2

情景2

输出:s1等于s2

我的问题是new StringTesting和new StringTesting.intern之间有什么区别?

Java字符串是不可变的,因此必须更新s2引用

改变2.实习;到

它也会以同样的方式工作。

阅读intern的Javadoc:

调用intern方法时,如果池中已包含一个字符串,该字符串等于equalsObject方法确定的该字符串对象,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用

因为字符串s1=测试;将s1引用的字符串添加到字符串池中,new StringTesting.intern从字符串池中返回一个实例,该实例等于new StringTesting创建的字符串,该字符串与s1引用的字符串实例相同


另一方面,在第一个代码片段中,s2.intern没有效果。等于Testing的字符串已经在字符串池中,因此s2引用的字符串不会添加到该池中。您将忽略该方法的返回值,即s1引用的字符串。因此,s1和s2指的是不同的对象。

阅读以下文档:

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


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

不是重复的@TimBiegeleisen。这是为了给变量赋值,而不是字符串比较。@DavidWallace抱歉…关闭得太快:-找到了更好的:-实际上,@CKing,答案的关键是更新引用。字符串的不变性完全是一个骗局——即使字符串是可变的,OP也会有同样的问题。第一个代码段失败,因为OP没有将内部引用分配回s2。我觉得埃利奥特比你更清楚地说明了这一点。但说实话,在我投票给这个答案的时候,你的答案还没有出现在我的屏幕上。@DavidWallace我在我的回答中确实说过,你需要重新分配任何修改,并详细阐述了我的意思。我明白了,这个答案更好,我不否认。但我的答案保持在0会更好吗?我一般认为这种情况在这里经常发生。我的大多数被接受的答案的票数比同一问题上未被接受的答案的票数少:。更高的代表要求更多的选票。那只是我的看法。我不希望有人同意。无论如何,这是一个更适合meta的主题,并且已经在那个里讨论过了,所以我离开了。祝您有愉快的一天。作为附录,有时代码不分配intern的结果似乎是可行的,因为在字符串上调用intern可能会产生副作用,使该实例成为规范实例。由于前面的赋值,这里不会发生这种情况,字符串s1=Testing;,换句话说,字符串测试的规范实例已经存在,并且由s1引用,这与s2引用的实例明显不同。因此,后一个实例不能成为规范实例,intern必须返回不同的引用,即s1中的引用。当然,即使是新的StringTesting也足以确保规范实例和新构造的实例是不同的。理论上,如果不存在其他引用,可能会有一个运行时在intern调用之前收集规范实例,但实际上没有真正的JVM会这样做…
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");
        }

    }
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");
        }
    }
s2 = s2.intern();