Set接口判断重复元素依靠Object类中的俩个方法:
- hash码:
public native int hashCode()
- 对象比较:
public boolean equals(Object obj)
在Java中进行对象比较的操作有两步:
- 通过一个对象的唯一编码找到一个对象的信息
- 当编码匹配之后再调用equals()方法进行内容的比较
class Person implements Comparable<Person>{
private String name;
private Integer age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(name, person.name) &&
Objects.equals(age, person.age);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public int compareTo(Person o) {
if (this.age > o.age){
return 1;
}else if (this.age <o.age){
return -1;
}else {
return this.name.compareTo(o.name);
}
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
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;
}
}
public class TestDemo {
public static void main(String[] args) {
Set<Person> set = new HashSet<>();
set.add(new Person("Jack",20));
//重复元素
set.add(new Person("Jack",20));
set.add(new Person("Tom",20));
set.add(new Person("Marry",18));
System.out.println(set);
}
}
如果想要标识出对象的唯一性,一定需要equals()与hashCode()方法共同调用。
例:
如果两个对象的hashCode()相同,equals()结果不同时,能否消除?
不能消除
如果两个对象的equals()结果相同,hashCode()不同时,能否消除?
不能消除
对象判断必须俩个方法equals()、hashCode()返回值都相同才能判断为相同。
小tips:
- 保存自定义对象的时候使用List接口
- 保存系统类信息时候使用Set接口(避免重复)