Set接口的实现类:
共同的特点:
1.都不允许元素重复
2.都不是线程安全的类.
//解决方案:
Set s = Collection.synchronizedSet(Set对象);
- HashSet:
不保证元素的先后添加顺序.底层才有哈希表算法,查询效率极高.
判断两个对象是否相等的规则:
- equals比较为true.
- hashCode值相同.
要求:要求存在哈希中的对象元素都得覆盖equals和hashCode方法.
- LinkedHashSet:
HashSet的子类,底层也采用的是哈希表算法,但是也使用了链表算法来维持元素的先后添加顺序.
判断两个对象是否相等的规则和HashSet相同.
因为需要多使用也链表来记录元素的顺序,所以性能相对于HashSet较低.
一般少用,如果要求一个集合既要求保证元素不重复,也需要记录添加先后顺序,才选择使用LinkedHashSet.
- TreeSet:
不保证元素的先后添加顺序,但是会对集合中的元素做排序操作.底层才有红黑树算法,(树结构,比较擅长做范围查询).
TreeSet要么使用自然排序,要么使用定制排序.
自然排序:要求在TreeSet集合中的对象必须实现java.lang.Comparable接口,并覆盖comparaTo方法.
定制排序:要求在构建TreeSet对象的时候,传入一个比较器对象(必须实现java.lang.Comparator接口).在比较器中覆盖compare方法,并编写比较规则.
如何选用:
HashSet做等值查询效率高,TreeSet做范围查询效率高
而我们更多的情况,都做等值查询,在数据库的索引中做范围查询较多,所以数据结构主要用于做索引,用来提高查询效率.