黑马程序员技术交流社区

标题: 小弟是初学者,弱弱的问一句,为毛是这样啊??? [打印本页]

作者: 苏乞儿    时间: 2014-9-7 01:58
标题: 小弟是初学者,弱弱的问一句,为毛是这样啊???
String s1="世界杯";
String s2="世界";
String s3=“杯”;
为毛s1=“世界”+“杯”;为true;而s1=s2+s3;为false;
这个问题困扰好几天了都。。。想不明白始终。。。:'(,感觉没希望了呢。。。求鼓励,求安慰。。。:Q

1jpg.jpg (50.48 KB, 下载次数: 18)

阅读权限: 1

1jpg.jpg

1jpg.jpg (50.48 KB, 下载次数: 22)

没看出什么不同啊...

没看出什么不同啊...

作者: fantacyleo    时间: 2014-9-7 02:20
本帖最后由 fantacyleo 于 2014-9-7 12:10 编辑

这个说复杂也复杂,说简单也简单。像"世界杯"、"世界"+"杯"这些叫做字符串字面值,其本质是常数,是你用javac编译时就能确定下来的值。也就是说javac编译时就可以知道"世界"+"杯"的值是"世界杯"。Java语言规范要求:相同的字符串字面值必须指向同一个String对象,因此s1和“世界”+“杯”都指向同一个String对象——"世界杯",s1==“世界”+“杯”自然也就是true啦。而s2+s3呢?s2和s3都是变量,s2+s3的值在编译时无法确定,必须等到程序运行时才能通过相应的指令计算出来,而运行时计算出来的s2+s3,虽然它的值也是"世界杯",可这个String对象和编译时的String对象不是同一个,存储的内存位置不同,因此s1==s2+s3为false
作者: 彭卫红    时间: 2014-9-7 07:20
看一楼,回答的很详细了
作者: 家进    时间: 2014-9-7 09:15

看一楼,回答的很详细了,还有比较两个字符串是否相等,可以用equals方法,==号比较的是对象的地址值
作者: 张周飞    时间: 2014-9-7 09:33
因为他们指向的内存地址不一样,,,所以......................
作者: zhangxun    时间: 2014-9-7 10:14
一楼搞得真明白
作者: daoqin    时间: 2014-9-7 10:20
你这种对比字符串的方式不对。
如果是C++的话可以直接对比(string1==string2)
但在java中,这个代码即使在两个字符串完全相同的情况下也会返回false
Java中必须使用string1.equals(string2)来进行判断
如果:
string s1=new String("Hello");
string s2=new String("Hello");
则(s1==s2)=false 如果:
string s1="Hello";
string s2="Hello";
则(s1==s2)=true;
因为他们指向的同一个对象。
如果把其他变量的值赋给s1和s2,即使内容相同,由于不是指向同一个对象,也会返回false。所以建议使用equals(),因为equals比较的才是真正的内容

作者: 粺¹³¼畅    时间: 2014-9-7 10:23
一楼说得好!
作者: MR.Sun    时间: 2014-9-7 12:08
一楼很厉害!不错!很清楚!
作者: 默默丶    时间: 2014-9-7 12:23
s1=“世界”+“杯”这是代表字符串世界和杯相加就是世界杯
所以为true
但是s2+s3=指向的对象和s1指向的对象是不一样的所以是false
作者: 沙拉很好吃    时间: 2014-9-7 12:34
一楼回答果然专业,虽然有点没看懂;P
作者: 戏言丶    时间: 2014-9-7 12:51
1楼乃真大神也
作者: 卖艺人    时间: 2014-9-7 13:15
一楼解释的已经很清楚了。
作者: 陈永赛    时间: 2014-9-7 13:22
一楼威武···学习了
作者: liqiaohui    时间: 2014-9-7 13:31
一楼厉害
作者: bullfrog    时间: 2014-9-7 15:45
你把
s2和s3都加上final就可以了。
作者: clh    时间: 2014-9-7 15:58
学学习习
作者: 袁枭飞    时间: 2014-9-7 16:10
一楼的回答貌似很高深啊
作者: 孤鸢    时间: 2014-9-7 16:14
fantacyleo 发表于 2014-9-7 02:20
这个说复杂也复杂,说简单也简单。像"世界杯"、"世界"+"杯"这些叫做字符串字面值,其本质是常数,是你用jav ...

说的明白,学习了
作者: 中华教书人    时间: 2014-9-7 18:06
String 类型作为引用数据类型,在使用(==)进行比较时,比较的是对象的引用(这一点和基本数据类型不一样),如果要比较字符串的值是否相等,应该使用equals 方法。(“世界”+“杯”)是在编译期间完成的)。所以s1==(“世界”+“杯”);而s2+s3,是在运行期间完成的,表面上看起来其值也为“世界杯”,但这个“世界杯”是s2+s3两个变量运算的结果,是需要在内存地址中重新分配空间的。一旦从新分配内存空间,肯定对象引用的值也就会发生改变,所以s1==(s2+s3)的结果为false。如果还不是很明白,可以参看这篇文章:http://blog.csdn.net/kofsky/article/details/1882626
作者: MichaelRodman    时间: 2014-9-7 19:10
学习。。其实主要就是字符串的比较方法和new的问题
作者: sunny~    时间: 2014-9-7 21:35
{:3_67:}、、、
作者: 恣意的豆腐    时间: 2014-9-7 22:02
  地址问题吧
作者: lhtwm1    时间: 2014-9-7 22:11
还没看到你那呢




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