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

我一直搞不懂,这个一个求解字符串相是否相等的问题的问题,第一处为何是flase,在线跪等高人解答。。



public static void main(String[] args) {
        String s1 = "a";
        String s2 = "b";
        String s3 = "ab";
        System.out.println(s3 == s1 + s2);//这个地方
        System.out.println(s3 == "a" + "b");
}

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1 很给力!

查看全部评分

27 个回复

正序浏览
谢谢分享
回复 使用道具 举报
这里的s1 , s2 都是对象 ,所以s3 == s1 + s2 只是判断s3与( s1 + s2 )是否是同一个内存地址。
判断内容是否相同应该用s3.equals(s1 + s2)  。,这个地方好像是错的啊,,,兄弟

评分

参与人数 1黑马币 +20 收起 理由
_etc + 20

查看全部评分

回复 使用道具 举报
可以按楼上说的试着用equals一下。。。。
回复 使用道具 举报
受教了,感谢楼主分享
回复 使用道具 举报
当我们使用字符串的时候,==是比较的两个字符串是不是指向同一个对象。程序在运行的时候会创建一个字符串缓冲池,程序会把字符串常量(比如说,题目中的“a”,“b”“ab”)放入字符串缓冲池中。现在我们将题中的“a”+“b”赋值给String 类型的s4,我们在创建字符串的时候,程序会首先在这个stirng缓冲池中寻找是否有相同值得对象,所以在进行“a”+“b”的时候,程序找到了“ab”,这时我们就将s4指向了“ab”,所以,现在“ab”就与s4指向了同一个对象,所以就会输出“true”。
但是,我们在进行变量的运算时,就不一样了,在进行s1 + s2的时候,他们会将得到的字符串对象储存在各自的内存中,而不是放在缓冲池中。尽管结果是一样的,但是因为不是指向同一个对象的原因,所以就有了两个不同的结果。我记得在视频中有涉及到类似的问题啊!
回复 使用道具 举报
这里的s1 , s2 都是对象 ,所以s3 == s1 + s2 只是判断s3与( s1 + s2 )是否是同一个内存地址。
回复 使用道具 举报
本帖最后由 xj刘博 于 2015-3-31 13:36 编辑
  1. <div class="blockcode"><blockquote>

  2. public class Text {
  3.         public static void main(String[] args) {
  4.                 String s1 = "a";// s1是一个类的类型变量,“a”是一个对象
  5.                 // 初始化后要为a在内存中开辟一个空间
  6.                 String s2 = "b";
  7.                 String s3 = "ab";
  8.                 System.out.println(s3 == s1 + s2);// 这里比较的是内存地址,所以为false
  9.                 System.out.println(s3 == "a" + "b");// 这里比较的是常量的值,因为a和b已经在常量池中存在了,
  10.                                            //所以就不会为s3中的ab单独开辟空间了,a和b会直接指向ab,所以相等
  11.         }                                   
  12. }
复制代码


回复 使用道具 举报
这里的s1 , s2 都是对象 ,所以s3 == s1 + s2 只是判断s3与( s1 + s2 )是否是同一个内存地址。

评分

参与人数 1黑马币 +20 收起 理由
Captain_Jack_Sp + 20

查看全部评分

回复 使用道具 举报
切记 String 是一个类就好理解了。
回复 使用道具 举报
godot 中级黑马 2015-3-30 11:22:58
18#
== 判断地址值
回复 使用道具 举报
_etc 中级黑马 2015-3-29 20:19:11
17#
P李勇 发表于 2015-3-29 20:17
a+b没有构造新的字符串哈,是去之前构造中找的,找到了所以返回的和s3的地址一样,所以true哈? ...

对的           
回复 使用道具 举报
_etc 发表于 2015-3-29 20:09
字符串的值不能改变。存在内存中就不能改变,"ab"早就存在在内存中了。

a+b没有构造新的字符串哈,是去之前构造中找的,找到了所以返回的和s3的地址一样,所以true哈?
回复 使用道具 举报
_etc 中级黑马 2015-3-29 20:09:14
15#
P李勇 发表于 2015-3-29 20:00
我想问的是s3==“a”+“b”为什么true啊
第一个倒是明白。。。

字符串的值不能改变。存在内存中就不能改变,"ab"早就存在在内存中了。
回复 使用道具 举报
我想问的是s3==“a”+“b”为什么true啊
第一个倒是明白。。。
回复 使用道具 举报
不能直接用==运算符来直接判断对象
回复 使用道具 举报
同题。。。。
回复 使用道具 举报
_etc 中级黑马 2015-3-29 19:43:02
11#
哥们今天问同学了,感谢各位。
回复 使用道具 举报
        String s1 = "a";
        String s2 = "b";
        String s3 = "ab";
        System.out.println(s3 == s1 + s2);//这个地方
        System.out.println(s3 == "a" + "b");
s3 == s1 + s2:
s1,s2是变量,在字符串连接时,如果有变量的出现,JVM不会把它进行宏替换的,也就是说在池里去找对应的字符串来代替。也就是不能在编译时就确定连接后的值。所以一个输出返回的是false

s3 == "a" + "b":在编译时期就已经可以将s3所指向的值确定了,所以返回的是true
回复 使用道具 举报 1 0
哥们你还没懂啊
回复 使用道具 举报
翰墨 中级黑马 2015-3-29 11:33:04
8#
String s4=s1+s2;
System.out.println(s4);//ab
System.out.println(s4==s3);//false
楼主我验证了一下,比较s4==s3,结果还是false,说明s3 == s1 + s2在比较的时候做了两次运算,先把s1+s2赋值给s4,在比较s4==s3,即比较s4和s3的地址是否相同
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马