特点:无序,无下标、元素不可重复。
全部继承collection方法。
1、HashSet
存储结构:数组+链表+红黑树
存储过程:1、根据hashCode计算存储位置,如果位置为空,择直接保存,如果不为空执行第二步
2、再执行equals方法,如果equals为true则认为重复,否则形成链表。
在对象中可以重写equals和hashCode方法,达到更多的防止重复的效果。
Set<String> set = new HashSet<String>();
@Override //重新equals方法
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;
Student student = (Student) o;
return getAge() == student.getAge() && Objects.equals(getName(), student.getName()) && Objects.equals(getSex(), student.getSex());
}
@Override //重新hashCode方法
public int hashCode() {
return Objects.hash(getName(), getSex(), getAge());
}
2、TreeSet 红黑树
基于排列顺序实现元素不重复
实现了SortedSet接口对集合元素自动排序。
元素对象的类型必须实现Comparable接口,指定排列顺序,compareTo() 返回0,认为重复。
通过CompareTo方法确定是否为重复元素。
(1)使用Comparable接口实现比较
implements Comparable<Student> //实现接口
@Override //重写方法,添加判断条件
public int compareTo(Student o) {
int n1=this.getName().compareTo(o.getName());
int n2=this.getSex().compareTo(o.getSex());
int n3=this.getAge()-o.getAge();
return n1==0?(n2==0?n3:n2):n1;
}
(2)使用Comparator 实现定制比较(比较器)
1、创建集合并指定比较规则,优先级高于Comparable接口,可以定制化比较规则,自己定义。
Set<Student> set = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int n1=o1.getName().compareTo(o2.getName());
int n2=o1.getSex().compareTo(o2.getSex());
int n3=o1.getAge()-o2.getAge();
return n1==0?(n2==0?n3:n2):n1;
}
});
自定义比较规则,按照字符串长度排序。
Set<String> set = new TreeSet<String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int n1 = o1.length()-o2.length();
int n2 = o1.compareTo(o2);
return n1==0?n2:n1;
}
});