面试的时候碰到这样一个问题,不太明白User u1 = new User();
u1.name="aa";
u1.password = "11";
User u2 = new User();
u2.name = "bb";
u2.password = "22";
Set sets = new HashSet();
sets.add(u1);
sets.add(u2);是类似这样的去重复吗?

解决方案 »

  1.   

    如果这样的话,需要将USer类的equals方法和HashCode方法重写吧?
    等高手,O(∩_∩)O~
      

  2.   

    需要重写User的equals和hashCode方法,Set才能够去除重复元素
      

  3.   

    Sure, you could refer to source code of Set's add method.
      

  4.   

    override了 equals hashCode方法的类使用Set去重复
      

  5.   


    public class User{  @Override
      public String toString(){
        return this.name;
      }  @Override String hashCode(){
        return User.class.toString()+toString();
      }  @Override boolean equals(Object object){
        if(object==null) return this==null;
        return object.toString().equals(toString());
      }
    }
      

  6.   

    这里给出User类的方法,主要是hashCode 和equals方法 class User{
    String name;
    String password;
    User(String name,String password){
    this.name=name;
    this.password=password;
    }
    public String toString(){
    return "Name :"+name+"  "+"Password:"+password;
    }
    public boolean equals(Object obj){
     if(obj instanceof User){
     User user=(User)obj;
     return (name.equals(user.name))&&(password.equals(user.password));
         }
     return super.equals(obj);
     }
     public int hashCode(){
     return name.hashCode();
     }
    }
      

  7.   

    。。看源码啊set 中 add 的实现。。是根据 map中 put 方法 来的map 中的 key 不能重复。。比较的就是 hashcode 如果 hashcode 就认为是。。同一个对象就不在保存
      

  8.   

    上面给出了部分代码,现在给出set的全部代码,中间有代码的验证部分。试验结果是
    1
    [Name :bb  Password:22]
     import java.util.*;
    public class TestSet {
    public static void main(String[] args) {
    User u1 = new User("aa","11");
     
    User u2 = new User("bb","22");
    Set sets = new HashSet();
    sets.add(u1);
    sets.add(u2);
    sets.remove(u1);//删除点一个User对象,然后进行验证  试验结果成功
    System.out.println(sets.size());
    System.out.println(sets);
    }
    }
    class User{
    String name;
    String password;
    User(String name,String password){
    this.name=name;
    this.password=password;
    }
    public String toString(){
    return "Name :"+name+"  "+"Password:"+password;
    }
    public boolean equals(Object obj){
     if(obj instanceof User){
     User user=(User)obj;
     return (name.equals(user.name))&&(password.equals(user.password));
         }
     return super.equals(obj);
     }
     public int hashCode(){
     return name.hashCode();
     }
    }
      

  9.   

    sets.remove(u1);//删除点一个User对象,然后进行验证  试验结果成功
    你都remove了,那set中肯定就留一个对象啊
    下面的重写equals和hashcode又有什么意义
      

  10.   

    已经给出hashCode 和equals的代码,你可以多在User中添加对象实例。然后比较
      

  11.   

    Set集合是依赖于Map接口实现的,因为Map不允许有元素重复,所以Set集合也就不允许元素重复...
    实现机制就是这样的。具体可以看一下Map的机制就行了...
      

  12.   

    首先比较hashcode,如果相等,继续比较equals,如果相等就是相等,否则不等