A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kfcka 中级黑马   /  2015-2-9 19:54  /  1664 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 kfcka 于 2015-2-9 20:03 编辑

String s1="aaa";
String s2=new String("aaa");String s3=“aaa”;
大家说说s1和s2都有什么区别啊?
s1==s3是否为真,为什么?

15 个回复

倒序浏览
s1和s2的内容相同,但内存地址不同。s1和s3不仅内容相同,内存地址也相同。所以s1==s3为真。
回复 使用道具 举报
s1和s3引用的是常量池中"aaa"的地址0x0011
s2需要在堆中开辟新的空间,
“aaa”先指向堆中地址0x0012后0x0012指向栈中s2

无标题.png (101.79 KB, 下载次数: 17)

无标题.png

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

回复 使用道具 举报 2 0
Piaget 发表于 2015-2-9 20:49
s1和s3引用的是常量池中"aaa"的地址0x0011
s2需要在堆中开辟新的空间,
“aaa”先指向堆中地址0x0012后0x00 ...

图画得很好
回复 使用道具 举报
一楼解释得很好了
回复 使用道具 举报
Piaget 发表于 2015-2-9 20:49
s1和s3引用的是常量池中"aaa"的地址0x0011
s2需要在堆中开辟新的空间,
“aaa”先指向堆中地址0x0012后0x00 ...

解释的很到位呀!
回复 使用道具 举报
s1==s3为真,因为s1和s3都是存储在常量池中两者指向同一个地址,而s2new了一下 就是在堆中开辟一块空间存放,s1和s2地址不一样所以不想等。
回复 使用道具 举报
一楼最解释的最好,很深刻。
回复 使用道具 举报
huangchunwei 来自手机 中级黑马 2015-2-9 23:20:16
9#
赞一楼  解释的好  图画的清晰。
回复 使用道具 举报
关于字符串的经典问题啊
回复 使用道具 举报
1楼图画的挺好
回复 使用道具 举报
true ,j建立字符串对象时发现有内存中已经有了相同内容的字符串时,系统不会重新建立,而是用已经存在的字符串
回复 使用道具 举报
s1.equals(s3)是因为它们的引用地址一致,即s1==s3;
s1.equals(s2)虽然s1!=s2,但是它们的字符都一致,所以结果一样但是原因是不同的
ps:顶一下一楼的图,很深刻的说
回复 使用道具 举报
Julie 中级黑马 2015-2-10 20:41:11
14#
String s1 = "aaa";这句话会在方法区分配一块空间放"aaa"字符串,String s2 是在栈中分配的一块空间放"aaa"字符串。当String s3 = "aaa"时,会先检查方法区是否有"aaa"字符串,一看有,s3就指向了那块内存,即s1和s3指向同一块内存!
回复 使用道具 举报
顶一楼的图,经典问题,给更多人看到
回复 使用道具 举报
认真看视频,能懂的。s1,s2是两个String对象,在栈中有两个不同的地址对应,而s1,s3相等。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马