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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔政 中级黑马   /  2012-10-25 17:39  /  1326 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看了一下午的技术论坛,看各位大神==和equals问题解决了不少。
自认也明白了这个问题。可是我又逛了一个帖子,在测试的时候把我搞蒙了。求解答
  1. public class AndTest {
  2.         public static void main(String[] args){
  3.                 String a = "b1";
  4.         String b = "b";
  5.         b += 1;
  6.         System.out.println("a_hashCode:"+a.hashCode());//输出结果3087
  7.         System.out.println("b_hashCode:"+b.hashCode());//输出结果3087
  8.         System.out.println("a==b:"+(a==b));
  9.         System.out.println("a.equals(b):"+a.equals(b));
  10.         
  11.         String c="ab";
  12.         String d="ab";
  13.         String e=new String("ab");
  14.         System.out.println("c==d:"+(c==d));//结果为true,毕老师说,是创建c的时候,把ab放入常量池,
  15.                                              //在创建ab,发现常量池中有,就直接让d指向ab,所以没有new新对象
  16.         System.out.println("c.equals(d):"+c.equals(d));//true,没疑问, String复写了Obejct的equals方法。
  17.         System.out.println("c==e:"+(c==e));//结果为false,是否可以理解为e是重新new的另一个对象,所以不等。但是hashCode相同
  18.         System.out.println("c.equals(e)"+c.equals(e));//和c。equals(d)一样
  19.         
  20.         }

  21. }
复制代码
代码中,hashCode()值都一样,但a==b却是false,我是否可以理解为,hashCode有点类似密码生成机制的意思,
给你个字符串(拿字符串举例),通过一些加密方式返回密码。
现在这个==和equals真心不明白到底怎么比较的,只知道貌似Object的equals就是==
想HashSet还好说点,知道怎么比,先比hashCode,再比equals。
最近看的一些关于==和equals的问题差不多都一样,好像都是不明白怎么比的,求高手解答!

4 个回复

倒序浏览
==是用于比较两个两个变量的值是否相同,即其内存中存的数据是否相同。对应指向对象的引用数据,它们内存中存的是对象的地址值,所以使用==比较的也应该是是否是同一个对象。
equals方法是属于对象的方法,用于比较对象中的内容是否相同,具体比较什么内容则不定,Object中的equals的确是用的==,它是只有比较的两者是同一个对象结果才是true。而String类复写了equals方法,它是比较的对象中的字符序列。
HashCode方法,api上有,由 Object 类定义的 hashCode 方法会针对不同的对象返回不同的整数。这一般是通过将该对象的内部地址转换成一个整数来实现的。但是String对象也复写了HashCode方法,它返回的值是根据字符串中的字符计算的。
回复 使用道具 举报
我也很纠结这个东西啊,不知道怎么去理解更好。

个人比较傻的理解方法就是:== 比较的是栈内存里的东西,就比如说对象把地址值赋给一个变量,像楼主说的:a==b,c==d 一样

                                      equals 比较的是堆内存里的内容,就比如对象中的内容是否相同,

望大神纠正···
回复 使用道具 举报
废话不多说,你的理解是正确的。
“==”比较的是引用的是否是同一对象,
String的equals比较的是引用的对象的值是否相同。
回复 使用道具 举报
这时候举个例子给你听下你就再明白不过了
String a = "b1";
String b = "b";
String bb = b + "1";
String bbb = "b" + "1";
你比较玩这几个值之后相信你有点模糊的就是String bb =b + "1";
这里唯一不同的就是这个表达式中有个b 变量是引用的 ,是不确定的,JVM机处理的时候会直接再创建一个字符串常量。
这个是JVM的对字符串处理的特性。记住就行了 ,别模糊了啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马