黑马程序员技术交流社区

标题: 最简单的代码看看你能答对吗? [打印本页]

作者: ciying88    时间: 2017-3-11 01:20
标题: 最简单的代码看看你能答对吗?
public class Test1 {
        public static void main(String[] args) {
                String s1 = "ab" + "c";
                String s2 = "abc";
               
                System.out.println(s1 == s2 + " : " + s1.equals(s2));
    }
}
作者: xiaoxiaoyuxie    时间: 2017-3-11 01:24
==是指内存地址相同 两个变量占用两个内存地址 肯定false equals是指值相同所以为true

作者: 小T    时间: 2017-3-11 02:00
结果就是true:true啦

作者: 烟雨清寒时    时间: 2017-3-11 08:29
一楼正解

作者: auloveagbb    时间: 2017-3-11 09:12
一楼正解

作者: mrwalker    时间: 2017-3-11 09:58
有陷阱,我也中招了。正确答案是false
作者: Mr_Maty    时间: 2017-3-11 12:27
两个都true,具体知识点请参考常量折叠(编译器的一种优化技术),一下也说不清楚,自己百度吧

作者: DCS    时间: 2017-3-11 13:13
true吧,没错吧

作者: xiaoxiaoyuxie    时间: 2017-3-11 13:37
Mr_Maty 发表于 2017-3-11 12:27
两个都true,具体知识点请参考常量折叠(编译器的一种优化技术),一下也说不清楚,自己百度吧
...

确实是在编译阶段就做了运算并将两个变量指向同一内存地址了,但如果不用自动装载两个地址就不同了 new String(“abc”)==new String(“abc”) 值为false 。另外“abc”==“abc”==“a”+“bc”==“ab”+“c” 学习了

作者: 陈大仙…    时间: 2017-3-11 13:47
感觉就是个陷阱

作者: Mr_Maty    时间: 2017-3-11 18:15
xiaoxiaoyuxie 发表于 2017-3-11 13:37
确实是在编译阶段就做了运算并将两个变量指向同一内存地址了,但如果不用自动装载两个地址就不同了 new S ...

new是用来创建对象的,对象存在于堆中,你new了两次,当然两个对象了,两个对象的内存地址当然是不一样的了,所以hashcode也就不相同,equals也就不相同了

作者: 旧时光9527    时间: 2017-3-11 19:17
应该是true true吧,==是比较的地址值,而equals是在object类已经被重写了,比较的是内容,String s1他们在常量池中开辟三个空间,一个是"ab",第二是"c",第三个是他们相加后的空间"abc",二String s2则是把第三个空间的"abc"地址赋给s2,所以s1和 s2的地址值相同,内容也是相同的
作者: 崔然    时间: 2017-3-11 19:18
测试结果是一个false。可是如果分开来输出就是两个true.谁能解释一下?

作者: 崔然    时间: 2017-3-11 19:37
崔然 发表于 2017-3-11 19:18
测试结果是一个false。可是如果分开来输出就是两个true.谁能解释一下?

false是因为没加括号,结果还是true true

作者: 雪飞舞舞    时间: 2017-3-11 22:56
陷阱一个





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