由於業務需求,需要進行List數據去重,list中存的是一個pojo,根據網上使用HashSet進行去重,發現去重失敗。通過一下博文發現原因,引用一下,原文地址→Java中list去重(用set元素不重複性)
定義一個對象:
public class User{
public User(String name, int age) {
this.name = name;
this.age = age;
}
String name;
int age;
//省略getter&setter
}
測試數據:
ArrayList<User> arrayList = new ArrayList<>();
arrayList.add(new User("111",10));
arrayList.add(new User("111",10));
arrayList.add(new User("222",20));
arrayList.add(new User("111",10));
arrayList.add(new User("222",20));
arrayList.add(new User("333",30));
arrayList.add(new User("111",10));
arrayList.add(new User("111",10));
arrayList = new ArrayList<>(new HashSet<User>(arrayList));
輸出結果:
arrayList [0] = 111 , 10
arrayList [1] = 111 , 10
arrayList [2] = 222 , 20
arrayList [3] = 111 , 10
arrayList [4] = 333 , 30
arrayList [5] = 111 , 10
arrayList [6] = 222 , 20
arrayList [7] = 111 , 10
去重失敗。
在User類中加入
//hshset中使用equals和hascode方法進行對象比較
@Override
public boolean equals(Object o) {
if(this == o){
return true;
}
if(o == null){
return false;
}
if(getClass() != o.getClass()){
return false;
}
User user = (User) o;
if(age != user.age){
return false;
}
if(name == null){
if(user.name !=null){
return false;
}
}else{
if(!name.equals(user.name)){
return false;
}
@Override
public int hashCode() {
return 1;
}
加入重寫的equals和hashConde方法,測試成功;
hashCode()方法給對象返回一個hash code值。這個方法被用於hash tables,例如HashMap等。
它的性質是:
- 在一個Java應用的執行期間,如果一個對象提供給equals做比較的信息沒有被修改的話,該對象多次調用hashCode()方法,該方法必須始終如一返回同一個integer。
- 如果兩個對象根據equals(Object)方法是相等的,那麼調用二者各自的hashCode()方法必須產生同一個integer結果。
- 並不要求根據equals(java.lang.Object)方法不相等的兩個對象,調用二者各自的hashCode()方法必須產生不同的integer結果。然而,程序員應該意識到對於不同的對象產生不同的integer結果,有可能會提高hash table的性能。
大量的實踐表明,由Object類定義的hashCode()方法對於不同的對象返回不同的integer。因此在自定義對象中加入hashCode可以實現List利用HashSet去重