根据字符串#intern() https://docs.oracle.com/javase/9/docs/api/java/lang/String.html#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
将不会被打印。但结果是:两行都被打印出来。这意味着,默认情况下,字符串常量是被保留的。但如果是这样的话,那我们为什么还需要intern
方法?换句话说,我们什么时候应该使用这个方法呢?
Java 自动实习字符串文字。这意味着在许多情况下,== 运算符对字符串的作用与对整数或其他原始值的作用相同。
由于字符串文字的实习是自动的,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
变量,使用显式创建的值new
运算符和位置intern
方法未用于其结果,它是返回的单个不可变实例JVM的字符串常量池 https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html#jvms-5.1.
参考JavaTechniques“字符串相等和实习” http://javatechniques.com/blog/string-equality-and-interning/了解更多信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)