java难题 为什么会输出false,求大神解释

如题所述

有一块内存叫内置池,java会将字符串直接量(在编译时可确定其值的字符串)和final字符串(即常量字符串)分配在内置池中(一定要是字符串直接量和字符串常量才分配在内置池中),只要当前内置池中无值与此字符串直接量或常量相同的字符串对象。

对于String s="a";会在内置池中创建一个String类的对象(其值等于"a"),s引用了这个对象。如果接着有String s2="a";因为内置池中已有一个"a",则不会再创建新的String类的对象,s2与s引用的是同一个对象。同理,如果内置池中已有"ab",则String s3="a"+"b";也不会再创建新的String类的对象,s3引用的是这个内置池中的对象;如果内置池中无"ab",则会在内置池中创建一个String类的对象(其值等于"ab"),s3引用了这个对象。

需要指出的是,如果内置池中已有"ab",接着又有String s1="a";String s2="b";String s3="a"+"b";String s4="ab";String s5=s1+s2;则只有s3和s4引用的是内置池中的"ab"对象,而s5引用的是一个新的String类的对象(其值也等于"ab"),且它创建在堆(一块内存,对象一般都创建在堆中)中,即s3和s4引用的是同一个对象(位于内置池中),s5引用的是另一个对象(位于堆中),尽管这两个对象的值都是"ab"。为什么s5不引用内置池中的对象呢?因为String s5=s1+s2;s1+s2不是字符串直接量(因为s1和s2是变量,则s1+s2的值是不确定的),编译器无法在编译时确定s1+s2的值,也就无从知晓在内置池中是否有String类的对象,其值是否等于s1+s2。但如果s1和s2是常量字符串,即如果有final String s1="a";final String s2="b";String s3="a"+"b";String s4="ab";String s5=s1+s2;,则s3、s4、s5引用的都是内置池中的"ab",同时,内置池中有3个String类的对象:"a","b","ab"。

另外,==是进行引用的比较,即比较是否引用的是同一个对象。如果有final String s1="a";final String s2="b";String s3="a"+"b";String s4="ab";String s5=s1+s2;
则s3、s4、s5、"a"+"b"、"ab",进行两两的==比较都是相等的,因为它们引用的都是内置池中的String类的对象"ab"。

到此,你的问题已有答案,不需要回答了。追问

谢谢大神,给您加10倍悬赏

追答

不用谢

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-07-05

    s1和s2里面存的是内存地址,地址指向的是“hello”,"world",所以说他们是不相等的。

追问

那这个和上面的有什么不同?一直分不清

第2个回答  2019-07-05
java是编程语言里比较难学的一门,如果有心从事编程方向的工作,最好到专业机构多实践,更贴近市场,这样更有利于将来的发展。
相似回答