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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public class Test1 {
        public static void main(String[] args) {
                String s1 = "ab" + "c";
                String s2 = "abc";
               
                System.out.println(s1 == s2 + " : " + s1.equals(s2));
    }
}

14 个回复

正序浏览
回复 使用道具 举报
崔然 发表于 2017-3-11 19:18
测试结果是一个false。可是如果分开来输出就是两个true.谁能解释一下?

false是因为没加括号,结果还是true true
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
测试结果是一个false。可是如果分开来输出就是两个true.谁能解释一下?
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
应该是true true吧,==是比较的地址值,而equals是在object类已经被重写了,比较的是内容,String s1他们在常量池中开辟三个空间,一个是"ab",第二是"c",第三个是他们相加后的空间"abc",二String s2则是把第三个空间的"abc"地址赋给s2,所以s1和 s2的地址值相同,内容也是相同的
回复 使用道具 举报
xiaoxiaoyuxie 发表于 2017-3-11 13:37
确实是在编译阶段就做了运算并将两个变量指向同一内存地址了,但如果不用自动装载两个地址就不同了 new S ...

new是用来创建对象的,对象存在于堆中,你new了两次,当然两个对象了,两个对象的内存地址当然是不一样的了,所以hashcode也就不相同,equals也就不相同了
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
回复 使用道具 举报
Mr_Maty 发表于 2017-3-11 12:27
两个都true,具体知识点请参考常量折叠(编译器的一种优化技术),一下也说不清楚,自己百度吧
...

确实是在编译阶段就做了运算并将两个变量指向同一内存地址了,但如果不用自动装载两个地址就不同了 new String(“abc”)==new String(“abc”) 值为false 。另外“abc”==“abc”==“a”+“bc”==“ab”+“c” 学习了
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
DCS 中级黑马 2017-3-11 13:13:17
8#
回复 使用道具 举报
两个都true,具体知识点请参考常量折叠(编译器的一种优化技术),一下也说不清楚,自己百度吧
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
有陷阱,我也中招了。正确答案是false
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
==是指内存地址相同 两个变量占用两个内存地址 肯定false equals是指值相同所以为true
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马