User类,必须要重写hashCode、equals方法
public class User {
private String userId;
private String name;
private Integer age;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((userId == null) ? 0 : userId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (userId == null) {
if (other.userId != null)
return false;
} else if (!userId.equals(other.userId))
return false;
return true;
}
@Override
public String toString() {
return "User [userId=" + userId + ", name=" + name + ", age=" + age + "]";
}
}
1、对User对象的去重
Set<User> set = new HashSet<>();
User
user = new User();
user.setUserId("11");
user.setName("aa");
user.setAge(11);
set.add(user);
user = new User();
user.setUserId("11");
user.setName("aa");
user.setAge(11);
set.add(user);
System.out.println(set.size());
set = new HashSet<>();
user = new User();
user.setUserId("11");
user.setName("aa");
user.setAge(11);
set.add(user);
user = new User();
user.setUserId("111");
user.setName("aa");
user.setAge(11);
set.add(user);
System.out.println(set.size());
执行结果:1、2
第一个部分两个对象的属性值一样,第二个部分第二个user对象的id改变,结果证明可以对对象去重。
2、对List的去重
Set<List<User>> setList = new HashSet<>();
List<User>
list = new ArrayList<>();
user = new User();
user.setUserId("11");
user.setName("aa");
user.setAge(11);
list.add(user);
user = new User();
user.setUserId("22");
user.setName("bb");
user.setAge(22);
set.add(user);
list.add(user);
setList.add(list);
list = new ArrayList<>();
user = new User();
user.setUserId("11");
user.setName("aa");
user.setAge(11);
list.add(user);
user = new User();
user.setUserId("22");
user.setName("bb");
user.setAge(22);
set.add(user);
list.add(user);
setList.add(list);
System.out.println(setList.size());
输出结果:1
两个list的两个user对象全部一样,可以去重复
3、改变其中一个属性的值
Set<List<User>> setList = new HashSet<>();
List<User>
list = new ArrayList<>();
user = new User();
user.setUserId("11");
user.setName("aa");
user.setAge(11);
list.add(user);
user = new User();
user.setUserId("22");
user.setName("bb");
user.setAge(22);
set.add(user);
list.add(user);
setList.add(list);
list = new ArrayList<>();
user = new User();
user.setUserId("11");
user.setName("aa");
user.setAge(11);
list.add(user);
user = new User();
user.setUserId("22");
user.setName("bb");
user.setAge(222);
set.add(user);
list.add(user);
setList.add(list);
System.out.println(setList.size());
输出结果:2
3、改变第二个list里user的顺序
Set<List<User>> setList = new HashSet<>();
List<User>
list = new ArrayList<>();
user = new User();
user.setUserId("11");
user.setName("aa");
user.setAge(11);
list.add(user);
user = new User();
user.setUserId("22");
user.setName("bb");
user.setAge(22);
set.add(user);
list.add(user);
setList.add(list);
list = new ArrayList<>();
user = new User();
user.setUserId("22");
user.setName("bb");
user.setAge(22);
set.add(user);
list.add(user);
user = new User();
user.setUserId("11");
user.setName("aa");
user.setAge(11);
list.add(user);
setList.add(list);
System.out.println(setList.size());
输出结果:2
可知:Set对List的去重,保证三个条件:
(1)、重写hashCode、equals方法
(2)、List里边对象的值一致
(3)、List里边的对象的顺序一致