当需要给集合去重时,实现的方式有很多。这里介绍使用Set去重(两种方式)
需求:给多个Student对象去重
public class Student {
private int id;
private String name;
public Student() {}
public Student(int id,String name) {
this.id=id;
this.name=name;
}
}
方式一:
public static void main(String[] args) {
Comparator<Student> com=new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getId().compareTo(o2.getId());//自定义条件,我这里只是判断id相等即为同一个对象
}
};
Set<Student> set = new TreeSet<Student>(com);
set.add(new Student(1, "张三"));
set.add(new Student(1, "李四"));
set.add(new Student(1, "张三1"));
System.out.println(set.size());
}
这里我我只是判断id相等几位同一对象,所以即便name不同Set也会判断三个对象相等。即只保存了一个对象
运行结果:
说明:compareTo ()方法->返回0即为两个对象相等
方式二:
拓展:HashSet底层时HashMap,当我满打开源码会发现当new一个HashSet时会默认new一个HashMap
我们一般使用HashMap时是这样使用:
HashMap hashmap=new HashMap<String,Object>();
key是唯一的,String重写了hashCode和equals方法,所以我们可以非常愉快的使用String对象作为key来使用
因为Set存储的是不重复的对象,依据hashCode和equals进行判断,所以可以重写这两个方法自定义Set的唯一策略
进入正题:
public class Student {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student() {}
public Student(int id,String name) {
this.id=id;
this.name=name;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
//return name.hashCode();
return id;//如果没有对象的唯一值,可使用 return name.hashCode()
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
Student stu=(Student) obj;
return this.id==stu.id;
}
}
关于hashCode()说明:由于设定id是对象的唯一标识,所以只是返回id即可,当情况不同是可使用 name.hashCode();规则可灵活改动
运行结果: