當需要給集合去重時,實現的方式有很多。這裏介紹使用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();規則可靈活改動
運行結果: