一、比较三个类
1.HashSet:最常使用
HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取、查找、删除性能。
在内存中的存取是无序且不连续的,不是线程安全的,集合元素可以是null
判断的过程是先通过hashCode方法看在不在一个内存位置,在看equals方法看是不是一个对象。是的话就不添加,不是的话就七上八下的添加在列表里面。(因此在jdk7中底层都是数组+链表的实现)
2.LinkedHashSet:
其实是HashSet的子类,就是多了个链表维护存入的顺序
LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能,也就是频繁遍历选择linked的。
3.TreeSet
底层是红黑树,和前面两个其实都不一样。(大小堆)
TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。
有两种排序:如果return 0 则判断为相等,不会重复添加
1.自然排序其实就是放进treeset中的元素继承了comparable接口,重写compareTo方法。
2.定制排序就是new一个comparetor类重写compare方法,然后把这个对象放到treeset(com)的构造函数中。
新增的方法如下: (了解)
Comparator comparator()
Object first()
Object last()
Object lower(Object e)
Object higher(Object e)
SortedSet subSet(fromElement, toElement)
SortedSet headSet(toElement)
SortedSet tailSet(fromElement)
二、必须符合的条件
像set中加元素必须重写equals方法和hashCode方法
treeSet的话还必须继承comparable接口重写compareTo方法,并且treeSet里面由于要排序所以一定得放同样的元素