黑马程序员技术交流社区

标题: 这道题输出的结果为什么是false? [打印本页]

作者: sandyluo    时间: 2015-9-12 22:13
标题: 这道题输出的结果为什么是false?
这道题的输出结果为什么false?
class B
{
        public static void main(String[] args){
                String s1="你", s2="好吗",s3="你好吗";

                System.out.println(s3==(s1+s2));
        }
}
作者: Vincent饭饭    时间: 2015-9-12 22:24
s1 和 s2  和 s3都是指向对象的引用,各站一块内存。  String类有一个方法比较字符串的值是equal.
作者: xiaoxiao147    时间: 2015-9-12 22:31
==比较的是地址值,所以false。String重写了equals方法,比较的是内容是否相同,如果改成s3.equals(s1+s2)输出为true
作者: liufeibo    时间: 2015-9-12 22:37
s1 s2 s3是三个对象,一个对象怎么可能等于两个对象相加。。。。
作者: sandyluo    时间: 2015-9-12 22:38
Vincent饭饭 发表于 2015-9-12 22:24
s1 和 s2  和 s3都是指向对象的引用,各站一块内存。  String类有一个方法比较字符串的值是equal. ...

不过我有测试过,如果s1和s2给的值是一样的,比如说都是“你”,这里输出s1==s2的值就是true,如果s1和s2各占一块儿内存的话,s1==s2的结果不应该也是false么?因为地址值不同

作者: xiaoxiao147    时间: 2015-9-12 22:45
sandyluo 发表于 2015-9-12 22:38
不过我有测试过,如果s1和s2给的值是一样的,比如说都是“你”,这里输出s1==s2的值就是true,如果s1和s2 ...

如果S1="你",S2 = "你",S1==S2 输出为true。
原因是此处S1与S2指向方法区的静态常量池的“你”这个同一对象,地址是一样的,所以true.

作者: gpw    时间: 2015-9-12 22:46
s1+s2相当于new String(”你“+“好吗“),老师课堂讲过的
作者: Doug    时间: 2015-9-12 22:48
因为s1+s2是变量,编译期无法确定。换成常量(s3==("你"+"好吗"))就没问题了。
作者: sandyluo    时间: 2015-9-12 22:56
gpw 发表于 2015-9-12 22:46
s1+s2相当于new String(”你“+“好吗“),老师课堂讲过的

哈哈,三期的,亮身份吧
作者: xiaoxiaofei    时间: 2015-9-12 22:57
顶!!!!!!!!!!!!
作者: sandyluo    时间: 2015-9-12 22:58
gpw 发表于 2015-9-12 22:46
s1+s2相当于new String(”你“+“好吗“),老师课堂讲过的

哈哈,三期的,亮出你的身份
作者: gpw    时间: 2015-9-12 22:58
sandyluo 发表于 2015-9-12 22:56
哈哈,三期的,亮身份吧

都是被黑马币逼得,你黑马币那么多怎么不兑现技术分
作者: sandyluo    时间: 2015-9-12 23:09
gpw 发表于 2015-9-12 22:58
都是被黑马币逼得,你黑马币那么多怎么不兑现技术分

不着急,慢慢来- -,一定次兑完看着爽。
作者: 大头爱傻瓜    时间: 2015-9-12 23:12
地址不同
作者: sandyluo    时间: 2015-9-12 23:18
gpw 发表于 2015-9-12 22:46
s1+s2相当于new String(”你“+“好吗“),老师课堂讲过的

郭鹏伟- -
作者: 小小成很拽    时间: 2015-9-12 23:22
我是来学习的。。。
作者: 不爱念经的小僧    时间: 2015-9-12 23:34
s3和 (s1+s2)本身是两个不同的对象,并且==在String类中就是用来判断两个对象是否指向同一块内存的,当两个String对象字面常量相同且本身内存小于一个char类型所占的内存时,jvm就会默认给这两个对象分配同一个内存空间,叫做享元模式
作者: zzq18217362451    时间: 2015-9-12 23:37
s1+s2就相当于new的一个对象
作者: 且听风_R0pZK    时间: 2015-9-12 23:39
指向的内存地址并不相同啊
作者: hhuxiaolang    时间: 2015-9-12 23:40
==用来比较地址是否相同,你这里明显不同啊
作者: 0825梁磊    时间: 2015-9-12 23:45
坐等大神回复!!!
作者: gpw    时间: 2015-9-13 09:31
sandyluo 发表于 2015-9-12 23:18
郭鹏伟- -

查个人资料就能看到了
作者: 水果牛牛    时间: 2015-9-13 09:57
我是来学习的
作者: 867379393    时间: 2015-9-13 12:19
学习一下
作者: 笑笑精灵    时间: 2015-9-13 12:26
对象地址值不同。s3在常量池,而s1
作者: 王志志志    时间: 2015-9-13 16:50
s1+s2这个字符串拼接以后的内容跟s3是一样的,在内存中就直接指向了s3的引用,所以是一样的
作者: 安仔    时间: 2015-9-13 17:42
路过学习下。。




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