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

 我来答
microroom
科技发烧友

2019-07-06 · 智能家居/数码/手机/智能家电产品都懂点
知道大有可为答主
回答量:7118
采纳率:83%
帮助的人:1596万
展开全部
有一块内存叫内置池,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倍悬赏
追答
不用谢
匿名用户
2019-07-05
展开全部
  1. s1和s2里面存判孙的是内存地址,地址指向的是“hello”,"world",所以说他们是竖稿不掘纤链相等的。

追问

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

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

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式