标签:
String.intern() 实际上会返回第一次生成该 String 内容的那个实例.
所谓内容就是 "abc", "123" 这个字符串的内容
1.
String s1 = "a"; (String@100)
那么 s1 就是第一次生成内容 "a" 的实例 @100, 所以如果
String s1 = "a"; (String@100)
String s2 = "a"; (String@100)
由于他们的内容相同, 又没有显式的 new, 所以会使用同一个实例, 自然底层的 char[] 也是同一实例的
2.
String s1 = "a"; (String@100) (char[]@200)
String s2 = new String("a"); (String@110) (char[]@210)
但是要注意一点, 这种情况虽然两个 String 实例不同, 他们底层的 char[] 却是同一实例
3.
String s1 = "ab"; (String@100) (char[]@200)
String s2 = "a";
String s3 = s2 + "b"; (String@110) (char[]@210)
用变量拼接字符串, 最终 String 实例不同, char[] 实例也不同
4.
String s1 = "ab"; (String@100) (char[]@200)
String s2 = "a";
String s3 = s2 + "b"; (String@110) (char[]@210)
String i1 = s1.intern(); (String@100)
String i3 = s3.intern(); (String@100)
最后会发现 i1 == i3, 他们是同一个实例, 这就是 intern 的作用, 它会返回第一个实例化这个字符串内容的实例, 在这里就是 s1, 即使 s3 != s1, s3.intern() 也会返回 s1, 因为 s1 是第一个
5.
String s1 = new String("ab"); (String@100)
String s2 = s1.intern(); (String@110)
s1 != s2 要注意, 是因为 s1 使用了 new String(), 实际上在 "ab" 出现的时候, 就已经生成了一个 String 实例, 所以 String s1 = new String("ab"); 这一行程序, 会生成 2 个 String 实例, 虽然他们内部的 char[] 是一样的. 最终, s1.intern() 会返回第一个你看不到的实例
标签:
原文地址:http://www.cnblogs.com/zemliu/p/4349242.html