2 yuwanqi1991 Yuwanqi1991 于 2015.07.07 17:25 提问

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;
    }

}

6个回答

bdmh
bdmh   Ds   Rxr 2015.07.07 17:39

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

backingMap为HasMap

     public boolean add(E object) {
        return backingMap.put(object, this) == null;
    }
Yuwanqi1991
Yuwanqi1991 看了下源码,HashMap.put()方法也是比较复杂,你知道put是怎么比较的吗
2 年多之前 回复
baidu_26883817
baidu_26883817   2015.07.07 17:34

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

maoweijie98
maoweijie98   2015.07.07 17:55

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

ltw518726
ltw518726   2015.07.07 17:56

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

frank_20080215
frank_20080215   2015.07.07 18:07

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

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

dcxy0
dcxy0   Ds   Rxr 2015.07.07 22:11

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

 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
    }
}

dcxy0
dcxy0 return (int) (Math.random()*1000);//我运行的时候后面的1000是10,竟然还出现了一次重复,改为1000,重复的几率很小很小了。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片