根据String#intern(),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
Java 自动实习生字符串文字。这意味着在许多情况下,== 运算符对字符串的工作方式与它对整数或其他原始值的工作方式相同。
由于 String 文字的实习是自动的,因此该intern()方法将用于构造的字符串new String()
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
在变量之外的所有情况下,一个值是使用运算符s4显式创建的,并且没有在其结果上使用方法,它是一个不可变的实例,它被返回JVM 的字符串常量池。new``intern
s4
new``intern
有关详细信息,请参阅JavaTechniques“字符串相等和实习”。