黑马程序员技术交流社区

标题: 碰到一个自己知识解释不了的问题,求解 [打印本页]

作者: 我是新生    时间: 2015-7-16 19:07
标题: 碰到一个自己知识解释不了的问题,求解
String s1 = "a";
String s2 = "b";
String s3 = "ab";
sop(s1+s2)//ab
sop(s3)//ab
sop(s3 == s1+s2)//false这里为什么是false
sop(s3 =="a"+"b")//true

作者: spike_az    时间: 2015-7-16 19:23
String是引用数据类型吧,但也还是搞不清问题所在,同求解
作者: 白马程序猿    时间: 2015-7-16 19:44
例如
String s = “a”
a是在堆内存的对象,s只是指向a的地址空间,
所以s1+s2不知道会指向哪里
第二个,就是简单的字符串连接
作者: 朝花夕拾7    时间: 2015-7-16 19:49
==在引用数据类型比较是的地址值
作者: wrnlksblk    时间: 2015-7-16 19:56
我也有点疑问,我也知道==比较的是地址值,所以s3==s1+s2我false,但是为什么s3=“a”+”b“是true?指向哪里呢???????(我的疑惑好像很楼主刚好相反)
作者: CLTDEZHUCE    时间: 2015-7-16 20:57
本帖最后由 CLTDEZHUCE 于 2015-7-16 20:59 编辑

sop(s3 == s1+s2)//false这里为什么是false,比的是地址,s1+s2指向的是地址值

sop(s3 =="a"+"b")//true   s3指向的是常量池,"a"+"b"指向的也是常量池。//不保证答案正确

作者: CLTDEZHUCE    时间: 2015-7-16 20:59
s1,s2单独指向也是常量池,加起来链接后指向地址值。//不保证答案正确
作者: Love丶cd    时间: 2015-7-16 21:17
因为字符串是个特殊的变量,他一旦被赋值就不会再变化。所以当你把s1,s2赋完值后,他们在内存中都有自己的地址值。s1+s2和“a”+“b”表达的不是一个意思。
作者: 花千骨    时间: 2015-7-16 21:58
Java中每个字符串都是一个String类的匿名对象,属于引用类型,这里比较的是地址值,每个实例化的对象地址值是不一样的。
作者: 小p    时间: 2015-7-16 23:04
并没有看懂
作者: longbao    时间: 2015-7-16 23:07
其实s3表示一个对象,写法:String s3=new String("ab");
作者: Sparky    时间: 2015-7-16 23:31
可是我并没有看懂
作者: micro_hx    时间: 2015-7-17 00:10
内存常量区,自己可以理解一下,,,,,
作者: Haunis    时间: 2015-7-17 00:20
自古人才出二楼
作者: _Rain    时间: 2015-7-17 02:06
首先要知道这里的字符都是String类对象,引用类型。==是比较两个对象的地址值。s1+s2中的加号是连接符。s3输出的是该对象,而不是该对象的地址值是因为在引用类型中输出都有个默认的toString()方法。s3==s1+s2出现错误是因为这两个对象的地址值不同。s3=="a"+"b"右边连接起来是ab字符串。再看下String s3="ab";java中有堆内存,栈内存还有方法区,方法区中有常量池,s3首先会在常量池中去找有没有ab,如果没有则会自动的创建ab。"a"+"b"又为ab,系统为了优化内存,所以这两个ab是同一个。你可以去看看内存介绍
作者: 蔡锐    时间: 2015-7-17 08:42
字符串相加先拼接再赋给内存值,有了不创建
变量则是先创建再赋值
作者: fantianfei    时间: 2015-7-17 08:59
本帖最后由 fantianfei 于 2015-7-17 09:02 编辑

sop(s3 == s1+s2)这里s1和s2应该打括号 因为这里s3是一个对象 而s2和s3是两新的对象 自然是false, 下面的s3的值本身就是"ab",而字符串"a"+"b"等于"ab",答案是true


作者: dragonsoull    时间: 2015-7-17 10:17
_Rain 发表于 2015-7-17 02:06
首先要知道这里的字符都是String类对象,引用类型。==是比较两个对象的地址值。s1+s2中的加号是连接符。s3 ...

正解,说得太详细了
作者: 122125241    时间: 2015-7-17 11:25
,"a"+"b"这个在反编译里面就是"ab"   就像int a = 3+4;   
作者: _Rain    时间: 2015-7-17 13:04
[quote]longbao 发表于 2015-7-16 23:07
其实s3表示一个对象,写法:String s3=new String(

不对,,你这样子写的话,是有两个对象存在的。而那个只有一个对象,这是有区别的。
作者: 紫夜灵魂    时间: 2015-7-17 13:52
sop(s3 == s1+s2)//false这里为什么是false
“==”比较的是变量的地址值,这个应该没啥问题,,S1+S2的结果有一个地址值,,肯定不和S3的地址值相等
所以结果false


sop(s3 =="a"+"b")//true
String s3 = "ab";
s3的地址指向是“ab”t它在字符串常量池里。
“a”+ "b"  的结果会在常量池里寻找,因为已经存在“ab” 所以“a”+"b"结果的地址就和S3的地址是一样的
所以嘛,sop(s3 =="a"+"b")//true
不知道这样解释对不对

作者: 伯爵公子    时间: 2015-7-17 14:13
确实比较复杂,建议一点一点用代码尝试
作者: 野驴少东    时间: 2015-7-17 15:58
有点蒙,建议看内存分析




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