昨天在用hashSet的时候 想起了几个问题,set是不可以重复,当往一个set里面添加对象的时候怎么判断的呢?
测试了一下 觉得是 先取得hashcode 如果相同就比较equals
如下(简写了):

Collection<User> coll = new HashSet<User>(); for (int i = 0; i < 2; i++) {
User u = new User(i, "name" + i);
coll.add(u);
}
User u = new User(0, "name0");
coll.add(u);
coll.add(u); Iterator<User> it = coll.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}这里在循环中添加的对象处理过程是比较hashcode,(这里都是相同的1),然后通过equals,我觉得是因为引用的不同 就是不同的对象,所谓的不重复
但是在下面 coll.add(u);的时候,仅仅取得hashcode就返回了,并没有添加进去,按照上面不是应该进行equals判断吗? 有人硕士因为两个u == 相等的缘故,这样更糊涂了,什么时候用equals 什么时候用==??ps:
一个对象杂新建的时候就有一个hashcode ,这个hashcode是固定的还是可以人为指定的?,比方上面的hashCode方法返回一个4,是不是说该对象的hashcode已经被改成4了?

解决方案 »

  1.   

    不好意思 上面没有写完整User类重写了hashcode 和 equals方法如下“
    [code]
    public User(int id,String name) {
    this.name=name;
    this.id=id;
    }

    @Override 
    public String toString() {
    return "[id="+id+" name="+name+"]";
    }
    @Override
    public boolean equals(Object obj) {
    if(!(obj instanceof User)){
    return false;
    }
    User u=(User)obj;
    if(id==u.getId()){
    return true;
    }
    return false;

    }
    @Override
    public int hashCode() {
    return 4;
    }[/code]
      

  2.   

    public User(int id,String name) {
    this.name=name;
    this.id=id;
    }

    @Override 
    public String toString() {
    return "[id="+id+" name="+name+"]";
    }
    @Override
    public boolean equals(Object obj) {
    if(!(obj instanceof User)){
    return false;
    }
    User u=(User)obj;
    if(id==u.getId()){
    return true;
    }
    return false;

    }
    @Override
    public int hashCode() {
    return 4;
    }
      

  3.   

    equals和hashCode方法满足的关系如下:
    a.equals(b)==True     ==>      a.hashCode()==b.hashCode()
    a.hashCode()==b.hashCode()对equals方法无要求
    a.equals(b)==False对hashCode方法无要求
    a.hashCode()!=b.hashCode()      ==>      a.equals(b)==False
      

  4.   

    hashcode 如果相同就比较equals
      

  5.   

    先检查hashCode,然后在检查equals 如果相同,则抛弃