常用的有:HashSet,LinkedHashSet,TreeSet
特点是无序不可重复
HashSet:底层是哈希表(哈希值是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值)。没有带索引的方法,不能使用普通for循环遍历。
LinkedHashSet:底层是哈希表和链表(链表保证元素有序)
TreeSet:有比较器可以排序也可以自然排序。
TreeSet():元素有序(不是存储顺序而是更加元素的自然排序进行排序)
TreeSet(Comparator comparator): 根据指定的比较器进行排序
哈希值
对象的哈希值特点
- 同一个对象多次调用hashCode()方法的哈希值是心相通的
- 默认情况,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同。
哈希表
JDK8之前,底层采用 数值+链表 实现,可以说是一个元素为链表的数组
JDK8以后,在长度比较长的时候,底层实现了优化
存储方式:
比较器Comparator:
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>
() {
@Override
public int compare(Student s1, Student s2) {
//this.age - s.age
//s1,s2
int num = s1.getAge() - s2.getAge();
int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
: num;
return num2;
}