Set系列
无序:存取顺序不一致
不重复:可以去除重复
无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素
Set集合的实现类
HashSet:无序、不重复、无索引
LinkedHashSet:有序、不重复、无索引
TreeSet:可排序、不重复、无索引
HashSet
底层原理:
HashSet集合底层采取哈希表存储数据
哈希表组成:
JDK8之前:数组+链表
JDK8开始:数组+链表+红黑树
当链表长度大于8而且数组长度大于等于64时,数组下挂载的链表会自动变成红黑树。
LinkedList
底层依旧是哈希表,只是每个元素额外的多了一个双链表的机制记录存储的数据。
TreeSet
底层基于红黑树 可排序
这里提一下数组的工具类Arrays
Arrays.sort()底层是数组,数组的类型必须是引用数据类型,如果是基本数据类型需要转换;就以自定义对象举例子,这里不需要在自定义类里实现比较规则,而是直接在测试类里创建对象,使用Arrays.sort(new comparator)重写方法,在里面指定规则即可。
而TreeSet<自定义对象>,需要在自定义对象中实现comparable<自定义对象>接口,然后重写comparable中的接口方法compareto(),然后再里面指定比较规则,这样子在测试类使用add()添加元素,然后打印才不会报错。
HashSet()和LinkedHashSet()对于自定义对象只要重写equals方法和hashcode方法即可,
HashSet存取是无序,LinkedHashSet存取是一致的。
而TreeSet,它的排序需要指定排序规则,否则存入不了。当然对于String、Interger它这个类本身就已经实现Comparable接口和重写了compareTo方法,可以直接存入。
注意的是在类里面重写comparable接口是重写的compareTo方法,而如果在创建对象是重写compartor接口是重写的compare方法。