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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邱成 中级黑马   /  2012-9-8 22:41  /  1072 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邱成 于 2012-9-8 23:50 编辑

class A
{
int count;
public A(){};
public A(int count)
{
  this.count=count;
}
public String toString()
{
  return this.count+"";
}
public boolean equals(Object obj)
{
  if(this==obj)
  {
   return true;
  }
  if(obj!=null&&obj.getClass()==A.class)
  {
   A a=(A)obj;
   if(this.count==a.count)
   {
    return true;
   }
  }
  return false;
}
public int hashCode()
{
  return (int)this.count;
}
}
public class TestHashSet
{
public static void main(String[]args)
{
  A Second=new A();
  HashSet hs=new HashSet();

  hs.add(new A(1));
  hs.add(new A(2));
  hs.add(new A(3));
  System.out.println("输出的集合元素为->"+hs);       //①这里输出 1,2,3
  Iterator it=hs.iterator();         //迭代集合元素
  A first=(A)it.next();            //迭代第一个元素
  first.count=2;                     
  A second=(A)it.next();           
  System.out.println("输出的集合元素为->"+hs); //②这里输出2,2,3
  /*
         先比较②中第一个元素和②中第二个元素的equals和hashCode()
  */
          System.out.println("first和second是一个对象吗?"+first.equals(second)); //③返回true,表示是一个对象
   
    System.out.print("first和second的hashCode相等吗?----->");
    System.out.print(((int)(first.count))==((int)(second.count)));//④返回true,表示在一个位置保存

    /*
为什么④处的hashCode是相等的?我的理解应该是②中的第一个元素hashCode==①中第一个元素,
     还有②中第一个元素的hashCode!=②中第二个元素。否则只能出现一个元素,可是现实 ②处输出了2,2,3
     则表示②中的第一个元素和②中第二个元素有不同的hashCode值,可是为什么我④处比较后都是相等的呢??返回true..
     这是为什么????

2 个回复

正序浏览

关于hashcode的问题,由于你是令hashcode等于自身的count,所以哪几个对象hashcode相等与否是很明白;
其次这里你要知道,next返回的应该是对象的引用,而不是对象的副本.
开始时你存了三个对象,他们的count都不同,即hashcode也不行,所以都存进去了没有问题;
然后,你调用next返回的first是第一个对象的引用,你又用first.count = 2改变了第一个对象的count也即改变了其hashcode,此时,第一个对象与第二个对象hascode就相同了,都等于他们的count,此时虽然hashcode重复,但已经存储了,不会自动删除hashcode重复的对象
回复 使用道具 举报
  1. import java.util.HashSet;
  2. import java.util.Iterator;

  3. class A {
  4.         int count;

  5.         public A() {
  6.         };

  7.         public A(int count) {
  8.                 this.count = count;
  9.         }

  10.         public String toString() {
  11.                 return this.count + "";
  12.         }

  13.         public boolean equals(Object obj) {
  14.                 if (this == obj) {
  15.                         return true;
  16.                 }
  17.                 if (obj != null && obj.getClass() == A.class) {
  18.                         A a = (A) obj;
  19.                         if (this.count == a.count) {
  20.                                 return true;
  21.                         }
  22.                 }
  23.                 return false;
  24.         }

  25.         public int hashCode() {
  26.                 return (int) this.count;
  27.         }
  28. }

  29. public class TestHashSet {
  30.         public static void main(String[] args) {
  31.                 A Second = new A();
  32.                 HashSet hs = new HashSet();

  33.                 hs.add(new A(1));
  34.                 hs.add(new A(2));
  35.                 hs.add(new A(3));
  36.                 System.out.println("输出的集合元素为->" + hs); // ①这里输出 1,2,3
  37.                 Iterator it = hs.iterator(); // 迭代集合元素
  38.                 A first = (A) it.next(); // 迭代第一个元素
  39.                 first.count = 2;
  40.                 A second = (A) it.next();
  41.                 System.out.println("输出的集合元素为->" + hs); // ②这里输出2,2,3
  42.                
  43.                
  44.                 System.out.println("first和second是一个对象吗?"+ (first == second)); //③返回false,表示不是一个对象
  45.                 System.out.println("first和second是相等吗?"+first.equals(second)); //③返回true,表示是相等的,相等并不是说一个对象
  46.                 System.out.print("first和second的hashCode相等吗?----->" + (first.hashCode() == second.hashCode())); //④返回true,表示在hashcod相等,注意此时hashcode是存储以后改变了存的元素的hashcode后的结果
  47.                
  48.         }
  49. }
复制代码
关于hashcode的问题,由于你是令hashcode等于自身的count,所以哪几个对象hashcode相等与否是很明白;
其次这里你要知道,next返回的应该是对象的引用,而不是对象的副本.
开始时你存了三个对象,他们的count都不同,即hashcode也不行,所以都存进去了没有问题;
然后,你调用next返回的first是第一个对象的引用,你又用first.count = 2改变了第一个对象的count也即改变了其hashcode,此时,第一个对象与第二个对象hascode就相同了,都等于他们的count,此时虽然hashcode重复,但已经存储了,不会自动删除hashcode重复的对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马