作为输出的实习生方法概念混淆随着不同版本而改变
在Java版本1.6中,输出是false true
,但是在1.8版本中,输出变为true true
。
有人能解释为什么会发生这种情况吗?
Intern方法用于引用堆中创建对象的相应字符串常量池,如果该对象不存在,则会创建一个String常量池。 如果我的理解错误,请纠正我。
public class Intern_String2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = new String("durga"); //object created in heap
String s2 = s1.concat("software");
//object durga software created in heap at runtime
String s3 = s2.intern();
// create durga software object in string constant pool as none exist.
System.out.println(s2==s3);//should be false but print true in 1.8 version.
String s4 = "durgasoftware";
System.out.println(s3==s4);//prints true in both version..
}
String.intern()
返回String的规范实例。 但它确实允许你传递给intern()
的字符串(例如你调用该方法的call receiver / object)被返回 - 如果String尚不在内部表中,这可能会发生 - 现在是规范实例。 同样,如果该String已经在内部String表中,则intern()
会返回它。
String s2 = "web".concat("sarvar");
String s3 = s2.intern();
System.out.println(s2 == s3); // prints "true"
String s4 = "web".concat("sarvar");
String s5 = s4.intern();
System.out.println(s4 == s5); // prints "false"
我会说这发生在JAVA6上,因为字符串池实现了使用PermGen ...稍后,在JAVA7, String.intern()
开始使用HEAP内存...
查看此链接了解更多详情...
jls确定了什么成为常量池的一部分。 字符串文字和由String.intern()检索的东西。
当它成为它的一部分时,没有真正的规范(首次使用,或定义文字的类的加载)。 它也没有说明什么不成为它的一部分,以及其他可能被实施的东西。
所以根据你的实验,我想他们在字符串成为常量池的一部分时改变了这个部分。 基本上将它从装载类改为首次使用。 因此,String.intern()可以返回“this”,同时仍然将这个添加到常量池中,成为与第一次使用的文字相同的实例。
链接地址: http://www.djcxy.com/p/35463.html上一篇: Intern method concept confusion as output changed with different version