黑马程序员技术交流社区

标题: 字符串S1和s2的区别 [打印本页]

作者: kfcka    时间: 2015-2-9 19:54
标题: 字符串S1和s2的区别
本帖最后由 kfcka 于 2015-2-9 20:03 编辑

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

作者: 龙行无忌    时间: 2015-2-9 20:47
s1和s2的内容相同,但内存地址不同。s1和s3不仅内容相同,内存地址也相同。所以s1==s3为真。
作者: Piaget    时间: 2015-2-9 20:49
s1和s3引用的是常量池中"aaa"的地址0x0011
s2需要在堆中开辟新的空间,
“aaa”先指向堆中地址0x0012后0x0012指向栈中s2

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

无标题.png

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

图画得很好
作者: 关山明月    时间: 2015-2-9 23:00
一楼解释得很好了
作者: 张思语    时间: 2015-2-9 23:06
Piaget 发表于 2015-2-9 20:49
s1和s3引用的是常量池中"aaa"的地址0x0011
s2需要在堆中开辟新的空间,
“aaa”先指向堆中地址0x0012后0x00 ...

解释的很到位呀!
作者: 许慎誉    时间: 2015-2-9 23:07
s1==s3为真,因为s1和s3都是存储在常量池中两者指向同一个地址,而s2new了一下 就是在堆中开辟一块空间存放,s1和s2地址不一样所以不想等。
作者: coolmiao13    时间: 2015-2-9 23:10
一楼最解释的最好,很深刻。
作者: huangchunwei    时间: 2015-2-9 23:20
赞一楼  解释的好  图画的清晰。
作者: Jaybor    时间: 2015-2-10 11:55
关于字符串的经典问题啊
作者: d342784178    时间: 2015-2-10 14:24
1楼图画的挺好
作者: 枪杆不如笔杆    时间: 2015-2-10 16:23
true ,j建立字符串对象时发现有内存中已经有了相同内容的字符串时,系统不会重新建立,而是用已经存在的字符串
作者: Jaybor    时间: 2015-2-10 18:03
s1.equals(s3)是因为它们的引用地址一致,即s1==s3;
s1.equals(s2)虽然s1!=s2,但是它们的字符都一致,所以结果一样但是原因是不同的
ps:顶一下一楼的图,很深刻的说
作者: Julie    时间: 2015-2-10 20:41
String s1 = "aaa";这句话会在方法区分配一块空间放"aaa"字符串,String s2 是在栈中分配的一块空间放"aaa"字符串。当String s3 = "aaa"时,会先检查方法区是否有"aaa"字符串,一看有,s3就指向了那块内存,即s1和s3指向同一块内存!
作者: 奔跑的猴子    时间: 2015-2-11 09:35
顶一楼的图,经典问题,给更多人看到
作者: franksight    时间: 2015-2-11 09:55
认真看视频,能懂的。s1,s2是两个String对象,在栈中有两个不同的地址对应,而s1,s3相等。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2