【发布时间】:2012-12-21 01:00:20
【问题描述】:
class StringTesting {
public static void main(String args[])
{
String str = "abcd";
String str1 = new String("abcd");
String str2 = str.substring(0,2);
String str3 = str.substring(0,2);
String str4 = str.substring(0,str.length());
String str5 = str1.substring(0,2);
String str6 = str1.substring(0,2);
String str7 = str1.substring(0,str1.length());
System.out.println(str2 == str3);
System.out.println(str == str4);
System.out.println(str5 == str6);
System.out.println(str1 == str7);
}
}
这是我在 java 1.6.0_27 上得到的输出:
false
true
false
true
有人可以解释一下输出吗?我知道Java区分存储在堆中的字符串和存储在字符串“公共池”(可以被实习)中的字符串。在内部,它们的表示方式有何不同。它如何改变子字符串算法。 请在适当的地方引用书籍/文章/博客等。
【问题讨论】:
-
这些问题很多。对于新旧 JDK,它甚至不会是相同的答案。
-
如果您真的想知道它是如何工作的,请阅读源代码。你不会得到更好的参考。注意:这在 Java 7 更新 6 中已更改。;)
-
@dystroy:这就是为什么我在问题中给出了我的 Java 版本。我不介意旧的或最近的 JDK 的答案。
-
它在你的 JDK 中
src.zip下(或者你可以用谷歌搜索它),如果你有一个不错的 IDE,你只需点击 String 的源代码就可以看到它。