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区分存储在堆中的String和存储在字符串“公共池”(可以被嵌入)中的String。在内部,它们的表示形式有何不同。它如何更改子字符串算法。请在适当的地方引用书籍/文章/博客等。
查看评论:
String str = "abcd"; // new String LITERAL which is interned in the pool String str1 = new String("abcd"); // new String, not interned: str1 != str String str2 = str.substring(0,2); // new String which is a view on str String str3 = str.substring(0,2); // same: str3 != str2 String str7 = str1.substring(0,str1.length()); // special case: str1 is returned
笔记:
str1.substring(0,str1.length());
public String substring(int beginIndex, int endIndex) { //some exception checking then return ((beginIndex == 0) && (endIndex == value.length)) ? this : new String(value, beginIndex, subLen); }
编辑
什么是观点?
在Java 7u6之前,String基本上是a char[],其中包含带有偏移量和计数的字符串count字符(即,字符串由从中的offset位置开始的字符组成char[])。
char[]
count
offset
调用子字符串时,将创建一个具有相同char[]但不同的偏移量/计数的新字符串,以有效地在原始字符串上创建视图。(如上所述,当count =length和offset = 0时除外)。
由于Java 7u6,新char[]创建的每个时间,因为没有更多的count还是offset外地的字符串类。
公用池到底存储在哪里?
这是特定于实现的。池的位置实际上已在最新版本中移动。在较新的版本中,它存储在堆中。
如何管理游泳池?
主要特征:
new String("abc").intern();
S
intern()
equals
"abc" == "abc"