Set怎么判别存储对象是否重复的

public class SetTest {

    public static void main(String[] args) {
        Set s = new HashSet();
        Person p = new Person("person-5");
        Person p1 = new Person("person-5");
        s.add(p);
        s.add(p1);
        System.out.println(p.equals(p1));
        System.out.println(p.hashCode() == p1.hashCode());
          System.out.println(s.size());
        for(Object o : s){
            Person pp = (Person) o;
            //System.out.println(pp.hashCode());
            System.out.println(pp.getName());
        }

// String str1 = "xxx";
// String str2 = new String("xxx");
// System.out.println(str1==str2);
// s.add(str1);
// s.add(str2);
// System.out.println(s.size());
// for(Object o : s){
// System.out.println(o);
// }
}

}

class Person{

    private String name;

    public Person(String name){
        setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean equals(Person p){
        if(p != null){
            if(p.getName().equals(this.getName())){
                return true;
            }
        }
        return false;
    }

    public int hashCode(){
        //return new Integer(getName()).hashCode();
        return 100;
    }

}

set 有add 方法返回布尔类型的值

hasset内部通过HashMap维护,HashMap可以知道是否存在

backingMap为HasMap

     public boolean add(E object) {
        return backingMap.put(object, this) == null;
    }

重写hashcode 和equals方法,要两个都不一样才会认为不一样

hashCode和equals方法,在加入的时候判断,加入后就不判断了

if (s.contains(xxx) == true ){skip;}
else{
do work
}

以上是伪代码,请自己修正

虽然这样可以实现,但还是建议在实际应用中不要这样做,因为这样真的欺骗编译器真的不好。。

 import java.util.HashSet;
import java.util.Set;

/**
 * 添加重复值到set
 * <p>
 * <p>
 * <p>
 * Created by puruidong on 2015/07/07.
 */


class Books{
    private String id;
    private String name;

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


    @Override
    public boolean equals(Object obj) {
        return false;
    }

    @Override
    public int hashCode() {
        return (int) (Math.random()*1000);
    }
}

public class Main {
    public static void main(String[] args) {
        Set<Books> set = new HashSet<Books>();
        Books b = new Books("1","abc");
        set.add(b);
        set.add(b);
        set.add(b);
        set.add(b);
        set.add(b);
        System.out.println(set.size());//输出5
    }
}