无法计算HashSet的输出?

时间:2014-04-23 11:12:14

标签: java collections hashset

这是我的第一堂课

  public class MainClass {

  public static void main(String args[])
   {
    java.util.Set s=new java.util.HashSet();
    s.add(new Integer(10));
    s.add(new Integer(1));
    s.add(new Integer(5));
    s.add(new Integer(3));
    s.add(new Integer(6));
    s.add(new Integer(9));
    s.add(new User("John",25));
    s.add(new User("John",25));
    java.util.Iterator it=s.iterator();
    while(it.hasNext())
    {
        System.out.println(it.next());
    }
   }

   }

这是我的第二堂课

  public class User {

  String name;
  int age;

  public User(String name,int age)
  {
    System.out.println("I am in constructor");
    this.name=name;
   this.age=age;
   }

  @Override
  public boolean equals(Object obj)
   {
     System.out.println("I am in equals");
    User u=(User)obj;
    if(this.age==u.age)
    {
        return this.name.equals(u.name);
    }
    else
    {
        return false;
    }
      }

    @Override
    public int hashCode()
     {
    System.out.println("I am in hash code");
    return this.name.hashCode()+this.age;
    }

   @Override
   public String toString()
   {
     System.out.println("I am in to String");
    return String.format("Name: %s", this.name);
   }
   }

输出

 I am in constructor
 I am in hash code
 I am in constructor
 I am in hash code
 I am in equals
 1
 I am in to String
 Name: John
 3
 5
 6
 9
 10

我的问题是如何比较这些元素?

2 个答案:

答案 0 :(得分:3)

这是顺序:

  
      
  1. 第一个输出在User构造函数中。
  2.   
  3. 然后计算哈希以将对象存储在HashSet结构中,因此您有一个来自hashCode方法的输出
  4.   
  5. 它与数字1相同,但对于第二个用户。
  6.   
  7. 与第2位相同,但第二位用户。
  8.   
  9. 因为User中的hashCode方法是按用户的年龄计算的,所以两个用户都有相同的哈希值,所以equals方法必须是   调用以验证对象是否相同。 (这是因为Java中的2个对象即使它们具有相同的哈希码也不必相同)
  10.   
  11. 现在您正在打印HashSet中不包含任何顺序的所有对象,因此您可以随机获取所有元素   订购。 (请记住,任何Set中的对象都是唯一的)
  12.   
  13. 因为您覆盖了toString方法,所以它会打印User对象的内容。
  14.   

作为提示:从1.5版开始,在Java中使用原始类型的任何数据结构并不是一个好主意。看看泛型。

答案 1 :(得分:1)

每个对象都从java.lang.Object继承hashCode()equals()的默认实现。这就是为什么每个对象都可以用在基于散列的集合中的原因。

Object中这两个函数的实现显然非常基础,但确保hashCode()equals()的契约得到满足,特别是a.equals(b) ==> a.hashCode() == b.hashCode()语句。