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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

根据毕老师讲的Hashset添加新元素时,做如下的操作
1:判断hashcode是否一样,如果不一样,存入;如果一样,转入步骤 2。
2:判断equals方法,如果为真,就是相同,不存入;    如果为假,就是不同,存入;
现在我重写hashCode()方法如下
  1. public int hashCode() {
  2.                 System.out.println("hashCode : >>"+this.name+"---"+this.age);
  3.                 return 60;
  4.         }
复制代码
重写equals()方法如下,其实就是在原来equals方法里面加了一些打印语句,核心的判断语句   return (this == obj);没有改变
  1. public boolean equals(Object obj) {
  2.                 System.out.println("this:"+this);
  3. //                System.out.println(">>>>>");
  4.                 System.out.println("obj:"+obj);
  5.                 System.out.println(this == obj);
  6.         return (this == obj);
  7.     }
复制代码

现在做如下的操作:
  1. HashSet hs=new HashSet();
  2.                 Person4 p1=new Person4("a",1);
  3.                 Person4 p2=new Person4("b",2);
  4.                 sop("====");
  5.                 hs.add(p1);
  6.                 sop("====");
  7.                 hs.add(p2);
  8.                 sop("------------------打印Hashset----------");
  9.                 for (Iterator iterator = hs.iterator(); iterator.hasNext();) {
  10.                         Person4 object = (Person4) iterator.next();
  11.                         sop(object.getAge()+"---"+object.getName());
  12.                 }
复制代码
输出结果为:
====
hashCode : >>a---1
====
hashCode : >>b---2
hashCode : >>b---2
this:day14Collection.Person4@3c
hashCode : >>a---1
obj:day14Collection.Person4@3c
false
------------------打印Hashset----------
2---b
1---a
现在我的问题是:
我重写hashCode()之后,Person4 的对象的hash值都是  60;
也就是步骤一转入了 步骤  2;
而在equal是方法中
this 和 obj 打印都是  day14Collection.Person4@3c
但为什么
System.out.println(this == obj);  结果是  false 呢?
求解答!!!


下面给出全部代码:
  1. package day14Collection;

  2. import java.util.HashSet;
  3. import java.util.Iterator;

  4. public class HashSetTest2 {
  5.         public static void main(String[] args) {
  6.                 HashSet hs=new HashSet();
  7.                 Person4 p1=new Person4("a",1);
  8.                 Person4 p2=new Person4("b",2);
  9.                 sop("====");
  10.                 hs.add(p1);
  11.                 sop("====");
  12.                 hs.add(p2);
  13.                 sop("------------------打印Hashset----------");
  14.                 for (Iterator iterator = hs.iterator(); iterator.hasNext();) {
  15.                         Person4 object = (Person4) iterator.next();
  16.                         sop(object.getAge()+"---"+object.getName());
  17.                 }
  18.         }
  19.         static void sop(Object o){
  20.                 System.out.println(o);
  21.         }

  22. }
  23. class Person4{
  24.         private String name;
  25.         private int age;
  26.         public Person4(String name,int age) {
  27.                 this.name=name;
  28.                 this.age=age;
  29.         }
  30.         public String getName() {
  31.                 return name;
  32.         }
  33.         public int  getAge() {
  34.                 return age;
  35.         }
  36. //        public boolean equals(Object object) {
  37. //                System.out.println(this.name+"---->equals"+this.age);
  38. //                if(!(object instanceof Person4)) {
  39. //                        return false;
  40. //                }
  41. //                Person4 p=(Person4) object;
  42. //                return this.name.equals(p.getName())&&this.name==(p.getName());
  43. //        }
  44.         public boolean equals(Object obj) {
  45.                 System.out.println("this:"+this);
  46. //                System.out.println(">>>>>");
  47.                 System.out.println("obj:"+obj);
  48.                 System.out.println(this == obj);
  49.         return (this == obj);
  50.     }
  51.         public int hashCode() {
  52.                 System.out.println("hashCode : >>"+this.name+"---"+this.age);
  53.                 return 60;
  54.         }
  55. }
复制代码



12 个回复

倒序浏览
顶一下,求解答
回复 使用道具 举报
顶一下,别沉了
回复 使用道具 举报
  你这个问题开始我也不懂    自己查了些资料这样理解的

            可以说两个对象相同  哈希值一定相同,但反过来,哈希值相同,对象并不一定就相同。 哈希值只是通过一种算法得出来的   两人对象地址可能不同,通过算法得出的哈希值是有可能相等的。
     this== obj 比较的是对象的地址   而不是只哈希值   所以我们通常判断对象是不是相同都不用==号  而是重写equals的方法 从逻辑上判断是否相等。
     Object 的equals 直接就是用的== 所以我们如果直接用的话比较的也是两个对象的地址值,不是哈希值


回复 使用道具 举报
谢建平 发表于 2014-9-19 08:15
你这个问题开始我也不懂    自己查了些资料这样理解的

            可以说两个对象相同  哈希值一定相 ...

"this== obj 比较的是对象的地址   而不是只哈希值"
我复写了hashCode(){
        return 60;
}所以地址都是一样的呀
回复 使用道具 举报
就像两个地点      门牌号可以换成一样的  但你不能说这两个地址是一样的   不会重写了hashCode  事实的地址就一样了
回复 使用道具 举报
careit 中级黑马 2014-9-19 10:11:03
7#
谢建平 发表于 2014-9-19 09:00
就像两个地点      门牌号可以换成一样的  但你不能说这两个地址是一样的   不会重写了hashCode  事实的地 ...

可是为什么
  1.      public boolean equals(Object obj) {
  2.                 System.out.println("this:"+this);
  3. //                System.out.println(">>>>>");
  4.                 System.out.println("obj:"+obj);
  5.                 System.out.println(this == obj);
  6.         return (this == obj);
  7.     }
复制代码

this打印的地址  和obj打印的地址一样
可是 System.out.println(this == obj); 为false呢?
回复 使用道具 举报
孤鸢 中级黑马 2014-9-19 10:45:22
8#
楼主被迷惑了,打印对象的toString就是:对象所属类的字节码+哈希值。p1,p2都属于Person4类,而哈希值又都是3C,所以打印的值是一样的,但是对象间"=="是比较对象在堆内存中的地址,这是java底层的实现(通俗点就是乌龟的屁股)JAVA中不允许操作符重载和覆盖(C++中可以),不然你给==覆盖了,按对象的toString返回值来比较,肯定是true。
回复 使用道具 举报
zhappy 中级黑马 2014-9-19 10:51:30
9#
过来学习一下
回复 使用道具 举报
顶一下。。
回复 使用道具 举报
孤鸢 发表于 2014-9-19 10:45
楼主被迷惑了,打印对象的toString就是:对象所属类的字节码+哈希值。p1,p2都属于Person4类,而哈希值又都 ...

哈希值  不等于 内存地址 对吧
回复 使用道具 举报
careit 发表于 2014-9-19 15:22
哈希值  不等于 内存地址 对吧

嗯,正是因为不等于,this == obj,才是false,你纠结不就是为什么打印的对象时名称相同,而比起来是false么,因为打印的名称不是内存地址,是所属类的字节码+哈希值,而this == obj比的就是堆内存中地址值。
回复 使用道具 举报
孤鸢 发表于 2014-9-19 17:02
嗯,正是因为不等于,this == obj,才是false,你纠结不就是为什么打印的对象时名称相同,而比起来是fals ...

明白了,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马