重复元素消除
TreeSet是利用了Compare接口实现了重复元素的判断,但是Set集合的整体特征就是不允许保存重复元素。但是HashSet判断重复的元素的方式并不是利用Compareble接口完成的,它利用的是Object类中提供的方法实现的。
- 对象编码:public int hashCode()
- 对象比较:public boolean equals(Object obj)
在进行重复元素判断的时候,首先利用hashCode()进行编码的匹配,如果该编码不存在则表示数据不存在,如果该编码存在了,则进一步进行对象比较处理,如果发现重复了,则此数据是不允许保存的。
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class SetDemo {
public static void main(String[] args) {
//进行Set集合数据的保存,并且有重复内容
Set<Person> all = new HashSet<>();
all.add(new Person("张三",19));
all.add(new Person("李四",18));
all.add(new Person("赵六",18));
all.add(new Person("王五",21));
all.add(new Person("王五",21)); //重复数据
all.forEach((Person person)->{
System.out.println(person);
});
}
}
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Person{name='王五', age=21}
Person{name='王五', age=21}(重复)
Person{name='李四', age=18}
Person{name='张三', age=19}
Person{name='赵六', age=18}
利用开发工具自动生成hashCode()与equals()方法以后:
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class SetDemo {
public static void main(String[] args) {
//进行Set集合数据的保存,并且有重复内容
Set<Person> all = new HashSet<>();
all.add(new Person("张三",19));
all.add(new Person("李四",18));
all.add(new Person("赵六",18));
all.add(new Person("王五",21));
all.add(new Person("王五",21)); //重复数据
all.forEach((Person person)->{
System.out.println(person);
});
}
}
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = 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 age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
Person{name='张三', age=19}
Person{name='王五', age=21}
Person{name='赵六', age=18}
Person{name='李四', age=18}
此时便没有了重复元素,在Java程序之中真正的重复元素的判断处理利用的就是hashCode()与equals()两个方法共同作用完成,而只有在排序要求的情况下(TreeSet)才会用Comparable接口来实现。