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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我一直搞不懂,这个一个求解字符串相是否相等的问题的问题,第一处为何是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 个回复

倒序浏览
System.out.println(s3 == s1 + s2);因为s1,s2是变量,虚拟机时不知道它为字符串常量的,所以会另外给它开辟空间。
回复 使用道具 举报
这里的s1 , s2 都是对象 ,所以s3 == s1 + s2 只是判断s3与( s1 + s2 )是否是同一个内存地址。
判断内容是否相同应该用s3.equals(s1 + s2)  。
回复 使用道具 举报
s3是一个对象,s1,与s2是两个对象,肯定不等呀
回复 使用道具 举报
natsu647 发表于 2015-3-28 23:13
这里的s1 , s2 都是对象 ,所以s3 == s1 + s2 只是判断s3与( s1 + s2 )是否是同一个内存地址。
判断内容 ...

没有new  应该都在常量池里吧
回复 使用道具 举报
hhh233 发表于 2015-3-28 23:26
没有new  应该都在常量池里吧

String是一个类,所以s1和s2都在堆内存中,比较的是默认地址值,2楼正解
回复 使用道具 举报
hhh233 中级黑马 2015-3-29 08:46:56
7#
复仇的撒旦 发表于 2015-3-28 23:37
String是一个类,所以s1和s2都在堆内存中,比较的是默认地址值,2楼正解
String s1 ="a";String s2 ="a";
s1==s2  这个结果为true  是说明他们默认的地址是一样的吗?
回复 使用道具 举报
hhh233 发表于 2015-3-29 08:46
String s1 ="a";String s2 ="a";
s1==s2  这个结果为true  是说明他们默认的地址是一样的吗?
...

是的,字符串的常量,都是用的同一个。
s3=s1+s2实际上是new了一个String出来的
你去先把s3赋值s1+s2,s3=s1+s2,然后再判断s3==s1+s2试试就知道了,它还是不同的,都是new出来的。
回复 使用道具 举报
翰墨 中级黑马 2015-3-29 11:33:04
9#
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的地址是否相同
回复 使用道具 举报
哥们你还没懂啊
回复 使用道具 举报
        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
_etc 中级黑马 2015-3-29 19:43:02
12#
哥们今天问同学了,感谢各位。
回复 使用道具 举报
同题。。。。
回复 使用道具 举报
不能直接用==运算符来直接判断对象
回复 使用道具 举报
我想问的是s3==“a”+“b”为什么true啊
第一个倒是明白。。。
回复 使用道具 举报
_etc 中级黑马 2015-3-29 20:09:14
16#
P李勇 发表于 2015-3-29 20:00
我想问的是s3==“a”+“b”为什么true啊
第一个倒是明白。。。

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

a+b没有构造新的字符串哈,是去之前构造中找的,找到了所以返回的和s3的地址一样,所以true哈?
回复 使用道具 举报
_etc 中级黑马 2015-3-29 20:19:11
18#
P李勇 发表于 2015-3-29 20:17
a+b没有构造新的字符串哈,是去之前构造中找的,找到了所以返回的和s3的地址一样,所以true哈? ...

对的           
回复 使用道具 举报
godot 中级黑马 2015-3-30 11:22:58
19#
== 判断地址值
回复 使用道具 举报
切记 String 是一个类就好理解了。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马