java难题 为什么会输出false,求大神解释
3个回答
展开全部
有一块内存叫内置池,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"。
到此,你的问题已有答案,不需要回答了。
对于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倍悬赏
追答
不用谢
2019-07-05
2019-07-05 · IT职业教育领导品牌
AAA软件教育
AAA软件教育隶属于河南梦工厂教育信息咨询有限公司,从事高端计算机职业教育工作,是国内知名的教育品牌。自07年创建以来,依托先进的办学理念,AAA培养出了数万名专业型、实战型高端技术人才。
向TA提问
关注
展开全部
java是编程语册培言里比较难学的一门,如喊姿搏果有心从事郑祥编程方向的工作,最好到专业机构多实践,更贴近市场,这样更有利于将来的发展。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询