Java有关字符串相等的问题,请看图?

为什么a==c输出是false呢... 为什么a==c输出是false呢 展开
 我来答
澈丶233
2019-10-21 · TA获得超过169个赞
知道小有建树答主
回答量:446
采纳率:94%
帮助的人:101万
展开全部

java中String的+运算实际上是创建了StringBuilder对象来实现的,也就是在+这个过程中会有新的对象生成,其内存地址也就发生了改变。楼上说的没错,==比较的是字符串的地址,但是我自己也实际运行了一下,发现:

可以看出a和b都是指向JVM栈中"ABC"这个地址,因此a==b。a和d比较时还能解释为+过程中产生了新的对象,导致a和d的内存地址不一致。但是a和e比较居然也是相等的,这个我也不理解了,可能我理解的a和d也是错的。

借楼向高手请教一下。

更多追问追答
追问
e那个也是存在于常量池里的吧,就跟a一样了
追答
jvm堆存对象,栈存变量,另外还有个方法区,所以你们说的常量池是在哪块内存里?(/哭
搜搜361
2019-10-21 · 超过17用户采纳过TA的回答
知道答主
回答量:75
采纳率:12%
帮助的人:9.4万
展开全部
字符串不能用 "==" 判断, 要用 a.equals(c) 来判断, 如果是 "ab" + "c"的话, 由于是常量间运算, 所以会从常量池中直接寻找"abc", 有的话, 直接引用其地址, 没有的话新建一个.
但此处 b 是一个对象, b + 字符串是对象间运算, 是在内存中, 而不是常量池里 "abc" 的引用, 所以不相等!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2019-10-21
展开全部
因为c是通过字符串引用+字符串常亮的方法连接产生的,那么c就是独立的新开辟的内存地址,所以==结果为false,当且仅当,==两端的字符串都是来自字符串常量池的时候,才可以用==得到true的结果
String a = "ABC";
String b = "AB";
String c = b + "C"; // C来自常量池,"AB"来自引用b
String d = b.concat("C"); // C来自常量池,"AB"来自引用d
String e = "AB" + "C"; // AB和C都来自常量池
System.out.println(a == c); // false
System.out.println(a == d); // false
System.out.println(a == e); // true
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友495d8a8
2019-12-31 · 超过11用户采纳过TA的回答
知道答主
回答量:75
采纳率:80%
帮助的人:18.3万
展开全部

网页链接

我之前写的笔记,有很详细的说明= =|||

只说你这个问题:

==是比较内存地址, .equal是比较数值。

java中字符串变量的拼接本质是新建了一个String,所以地址不同了。

另外如果你String c = "AB" + "C";

那么就是true了,因为在编译的时候常量拼接会直接拼好然后才运行。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
跟我一起学编程
2019-12-24 · 学编程,做程序猿,我是认真的,一起来吧!
跟我一起学编程
采纳数:802 获赞数:2152

向TA提问 私信TA
展开全部
在实际运算中,a==c也有可能出现相等的时候,但是对于字符串的比较,一般都要用equals来比较,因为==比较的是地址,而equals比较的才是内容。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式