java中字符串的问题,两个字符串常量池里的字符串拼接在一起为什么结果和我想的不一样

Stringa="helloworld";Stringp="world";Stringb="hello"+p;Stringc="hello"+"world";System... String a="helloworld";
String p="world";
String b="hello"+p;
String c="hello"+"world";
System.out.println(a==b);
System.out.println(a==c);

输出为:
false
true
请问第一个输出为什么是false,想了很久都不懂
展开
 我来答
miaoch
推荐于2018-05-06 · TA获得超过1204个赞
知道小有建树答主
回答量:814
采纳率:83%
帮助的人:343万
展开全部
首先比较的是 引用地址 而不是里面的值。如果想比值就用equals。
字符串常量:由相同序列的字符组成的两个字符串属于同一对象,位于内存中的同一个位置。
所以在编译期间a 是字符串常量"helloworld"的地址。

因为String c="hello"+"world";在编译期间也能直接执行,故也是指向字符串常量"helloworld"的地址。
而b是在运行期间创建,这两条语句所创建的"helloworld"字符串作为String对象存储在内存中的一个独立位置。
所以才有这个现象
百度网友7d2580b
2016-09-27 · TA获得超过118个赞
知道答主
回答量:88
采纳率:50%
帮助的人:12.5万
展开全部
对象a保存的是字符串"helloworld"的内存地址,对象b保存的是字符串"hello"的内存地址和对象p的值,而对象p的值是字符串"world"的内存地址,对象c保存的是字符串"hello"和"world"拼接后的字符串的地址,而java虚拟机会判断拼接后的字符串在内存中是否已存在,如果有,将现有的字符串的地址返回给对象c,也就是说对象a和对象c指向同一个地址;java中的==是判断对象本身保存的值是否相等,显然,a和b不相等,a和c相等;另外,字符串是否相等的判断一般都是调用方法equals
追问
我知道equals,我是故意用的==,
您说的“对象b保存的是字符串"hello"的内存地址和对象p的值”是什么意思,我不太懂,b不是应该指向"helloworld"这个字符串吗
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
仙女龙妈妈
2016-09-27 · TA获得超过375个赞
知道小有建树答主
回答量:194
采纳率:0%
帮助的人:93.3万
展开全部
讲道理,字符串作比较应该用a.equals(b)这样的。这才是标准的字符串比较。
追问
我知道,我这个就是故意用的==,我想看看是不是指向同一个地址
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式