首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >intern()在Java 6和Java 7中的行为不同

intern()在Java 6和Java 7中的行为不同
EN

Stack Overflow用户
提问于 2011-08-15 21:13:39
回答 5查看 5.8K关注 0票数 55
class Test {
    public static void main(String...args) {
        String s1 = "Good";
        s1 = s1 + "morning";
        System.out.println(s1.intern());
        String s2 = "Goodmorning";
        if (s1 == s2) {
            System.out.println("both are equal");
        }
    }
}

这段代码在Java6和Java7中产生不同的输出。在Java6中,s1==s2条件返回false,而在Java7中,s1==s2返回true。为什么?

为什么这个程序在Java6和Java7中产生不同的输出?

EN

回答 5

Stack Overflow用户

发布于 2011-08-29 07:59:56

让我们从示例中省略不必要的细节:

class Test {
    public static void main(String... args) {
        String s1 = "Good";
        s1 = s1 + "morning";
        System.out.println(s1 == s1.intern()); // Prints true for jdk7, false - for jdk6.
    }
}

让我们把String#intern看作是一个黑盒。根据运行的几个测试用例,我可以得出如下结论:

Java 6:

如果池中包含的对象等于this,则返回对该对象的引用,否则创建新的字符串(等于this),放入池中,然后返回对创建的实例的引用。

Java 7:

如果池中包含的对象等于this,则返回对该对象的引用,否则将this放入池中,并返回this

Java6和Java7都不会破坏contract of the method

似乎新的实习生方法行为是修复这个bug的结果:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6962931

票数 25
EN

Stack Overflow用户

发布于 2011-08-17 11:35:48

在jdk6中:String s1="Good";在常量池中创建一个字符串对象"Good“。

s1=s1+"morning";在常量池中创建了另一个字符串对象"morning“,但这次实际上是这样做的:s1=new StringBuffer().append(s1).append("morning").toString();

现在,由于new操作符在堆中创建了一个对象,因此s1中的引用是堆而不是常量池的,并且String s2="Goodmorning";在常量池中创建了一个字符串对象"Goodmorning“,其引用存储在s2中。

因此,if(s1==s2)条件为false。

但是在jdk7中会发生什么呢?

票数 7
EN

Stack Overflow用户

发布于 2011-08-15 21:15:04

您需要使用s1.equals(s2)。对String对象使用==会比较对象引用本身。

编辑:当我运行你的第二个代码片段时,我没有打印出“两者都相等”。

Edit2:澄清了使用'==‘时会比较引用。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7065337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档