根据String#intern(),intern如果在字符串池中找到字符串,则该方法应从字符串池返回字符串,否则,将在字符串池中添加新的字符串对象,并返回此字符串的引用。
String#intern()
intern
所以我尝试了这个:
String s1 = "Rakesh"; String s2 = "Rakesh"; String s3 = "Rakesh".intern(); if ( s1 == s2 ){ System.out.println("s1 and s2 are same"); // 1. } if ( s1 == s3 ){ System.out.println("s1 and s3 are same" ); // 2. }
我期望s1 and s3 are same在s3被实习生时将被打印,并且s1 and s2 are same不会被打印。但是结果是:两行都被打印了。因此,这意味着默认情况下会保留String常量。但是如果是这样,那为什么我们需要这种intern方法呢?换句话说,什么时候应该使用这种方法?
s1 and s3 are same
s1 and s2 are same
String
Java自动实习字符串文字。这意味着在许多情况下,==运算符似乎适用于Strings,其处理方式与ints或其他原始值的用法相同。
Strings
ints
由于Interning对于String文字是自动的,因此该intern()方法将用于使用new String()
Interning
intern()
new String()
使用你的示例:
String s1 = "Rakesh"; String s2 = "Rakesh"; String s3 = "Rakesh".intern(); String s4 = new String("Rakesh"); String s5 = new String("Rakesh").intern(); if ( s1 == s2 ){ System.out.println("s1 and s2 are same"); // 1. } if ( s1 == s3 ){ System.out.println("s1 and s3 are same" ); // 2. } if ( s1 == s4 ){ System.out.println("s1 and s4 are same" ); // 3. } if ( s1 == s5 ){ System.out.println("s1 and s5 are same" ); // 4. }
将返回:
s1 and s2 are same s1 and s3 are same s1 and s5 are same