2
public class ConcatenationRuntime {
    public static void main(String[] args) {
        String s1 = "jim";
        String s3 = "j";
        String im = "im";
        s3=s3+= im;
        System.out.println("s3> " +s3);  // jim
        System.out.println(s1==s3);  // line 8
        System.out.println("Hel" + "lo" == "Hello");  // true
    }
}

为什么它在第 8 行打印错误?这些都是文字,两个引用应该指向池中的同一个文字 - 我有点困惑。

4

1 回答 1

3

为什么它在第 8 行返回 false,

因为s3=s3+= im;.
Strings在运行时通过串联计算是objects在堆上新创建的,并有自己的引用。这与keep inreference提供的参考不同。因此提供虚假。 但是,如果您实习字符串,然后检查是否相等,它会给出正确的结果。例如:jimStringPools1==s3
s3

s3.intern() == s1=> 返回真

为什么 ?
因为实习String对象首先检查给定的字符串文字是否存在于StringPool. 如果String文字存在,StringPool则返回对该字符串文字的引用,否则它将该字符串文字的副本存储在 StringPool 中并返回对它的引用。由于jim已经存储在 StringPool 中,所以 s3.intern() 将简单地返回对jim存储在 Stringpool 中的引用。因此我们得到相同的参考。这使得s3.intern() == s1返回真。

于 2013-03-30T14:15:19.673 回答