20200828-牛子良

已解决问题

昨天一直对System.out.println(x==s)输出false和true一直不清楚,通过老师重新讲解。明白了代码执行背后的具体过程;

char [] chars={'a','b','c'};
String s=new String(chars);
s.intern();
String x="abc";
System.out.println(x==s);//true

对于示例1

按规定String实例是保存在字符串池中的。

检查"abc"对应的String实例是否存在于 【字符串池】 中,对于该实例,data在栈中保存的地址指向保存在堆中的字符型数组,而保存在栈中的s保存在的地址指向的是保存在堆中的字符时列的(value,hash,coder),它不是在字符串池中的,执行s.intern();创建"abc"对应的String实例并将其存入到【字符串池】 中,随后返回该实例的地址,所以x中保存的是实例abc的地址.执行String x="abc";时同样是先检查,原因是“abc”已在常量池中存在,直接返回“abc‘该实例的地址,它两保存的都是实例abc的地址,所以返回true;

实例二
String x="abc";
char [] chars={'a','b','c'};
String s=new String(chars);
s.intern();

System.out.println(x==s);//false

在该实例中,”abc“实例直接保存在字符串池中,所以x保存的是实例的地址;接下来执行String s=new String(chars);,此时常量池中已存在实例”abc“,所以不执行intern,直接返回实例地址,但此时x依然指向堆,所以x和s保存的地址不同;

问题二


String s=New String("abc");
String x="abc";
Sysem.out.println(s==x);

特此声明老师讲过这个老师讲了这个问题,但是还是没转过弯来。引用变量s和x两者都指向的是实例abc.string实例不是不可变的吗;

标签

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1