黑马程序员技术交流社区

标题: 关于“==”和 equals的区别 [打印本页]

作者: 静默小和尚    时间: 2015-4-5 10:29
标题: 关于“==”和 equals的区别
{:3_47:}昨晚为了做那个抢分题,弄了半夜,结果论坛半夜居然上不去!{:3_55:}闲话不扯,来说说这个吧!
先看下面这个:
             String str1 = "abc";
             String str2 = "abc";
             
             System.out.println(str1.equals(str2));
             System.out.println(str1==str2);
             
             System.out.println("-------------------------------------------------------");
             
             String str3 = new String("abc");
             String str4 = new String("abc");
             
             System.out.println(str3.equals(str4));
             System.out.println(str3==str4);


有兴趣可以自己运行一下,这个结果是
TRUE TRUE TRUE FALSE
{:3_51:}有没有很郁闷!哈哈哈

其实是因为==是判断的地址啦,equala是判断的变量内容 ,所以看上面的代码能清楚发现,str1  str2 地址是一样的,而str3 str4都是new 新建的地址,不一样的啦,这样说应该比较容易理解吧,至于内容,{:3_51:}同一个地址,能存同时存两个不同的内容吗?答案当然是不能啦!
然后说下昨晚那个陷阱题目  
{:3_60:}Integer i1 = 122;
      Integer i2 = 122;
     System.out.println(i1.equals(i2));(输出1)
     System.out.println(i1 == i2);(输出2)
     Integer i3 = 128;
     Integer i4 = 128;
     System.out.println(i3.equals(i4));(输出3)
     System.out.println(i3 == i4);(输出4)


陷阱在于  Integer有范围啊,-128到127,所以122是可以,128就是新建地址,类似于str3 str4{:3_55:}最讨厌陷阱神马的,明明很简单,不懂的时候就纠结要死。这个给我们新学的童鞋们来探讨啦,欢迎留贴心得!{:3_51:}{:3_51:}

作者: 帆风顺    时间: 2015-4-5 10:54
==比较的是地址值,equals比较的是内容,integer和byte范围一样吗,都是-128到127?
作者: 吴飞飞    时间: 2015-4-5 11:17
9494,,,你讲的耶不太清楚!我从新看了视频的,128是因为超出了byte 范围,而byte的值是在常量池里。即使从新new了,也是在常量池复制一份过来!故是一样的,
前面的题也是一样,String也在先在常量池找(把3的abc一边再复制一份给赋值4的abc,其实abc的引用是一样的),但是他们在堆内存的地址是不一样的!
作者: 王振光    时间: 2015-4-5 11:19
帆风顺 发表于 2015-4-5 10:54
==比较的是地址值,equals比较的是内容,integer和byte范围一样吗,都是-128到127? ...

Integer和byte  是2个概念   
只有覆写了Object的equals才比较的是自定义的。  没有覆写源码里默认用的是==。通过比较我们知道Integer是覆写了的。  -128 到127.是有这么个缓冲区里存储了这个范围的数字。如果数值没有超过这个范围。就直接在缓冲里取。所以地址才会一样
作者: 帆风顺    时间: 2015-4-5 11:21
王振光 发表于 2015-4-5 11:19
Integer和byte  是2个概念   
只有覆写了Object的equals才比较的是自定义的。  没有覆写源码里默认用的 ...

哇 学得 好强啊,你技术分都28了!
作者: 栗子木头    时间: 2015-4-5 11:29
多看看视频吧
作者: 黑马:二师兄    时间: 2015-4-5 11:30
楼主很强大!
作者: 小龟    时间: 2015-4-5 15:16
一起学习学习~~!
作者: 尚巾仁杰    时间: 2015-4-5 15:50
这道题,昨天老师刚讲了一下。再巩固巩固
作者: 罗韬    时间: 2015-4-5 15:56
==比较的是地址值,equals判断两个字符串是否相等
作者: 小七28    时间: 2015-4-5 23:44
好好学习天天向上。
作者: liuzhen    时间: 2015-4-6 00:18
好好学习天天向上。
作者: guoqingaa    时间: 2015-4-6 00:37
你这,好吧,谢谢了
作者: z小怪兽    时间: 2015-4-6 07:18
学习一下
作者: minliang    时间: 2015-4-6 09:51
学习了,不错!




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