前言 |
在之前的一篇博客中简单介绍过一些集合的知识(点我),有需要的可以简单看看,这次主要是针对集合的Collection中的一些常用的实现类做简单的介绍。
Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法既可以用于操作Set集合,也可用于操作List和Queue集合。
Collection接口和继承树 |
HashSet |
HashSet是Set接口的典型实现,大多数时候使用Set集合时就是使用这个实现类。HashSet按Hash算法来存储集合中的元素,因此有很好的存取和查找性能。
HashSet特点:
- 不能保证元素的排序顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。
- HashSet不是同步的,如果对个线程同时访问一个HashSet,假设有连个或者两个以上线程同时修改了HashSet集合时,则必须通过代码来保证其同步。
集合元素值可以是null。
当向HashSet集合存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。如果有两个元素通过equals()方法比较返回true,但它们的hashCode()方法返回值不相等,HashSet将会把它们存储在不同的位置,依然可以添加成功。即,HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。
TreeSet |
TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。
- HashSet集合采用hash算法决定元素的存储位置。
- TreeSet采用红黑树的数据结构存储集合元素。
TreeSet支持两种排方法:
- 自然排序
- 定制排序
ArrayList和Vector |
ArrayList和Vector是List的两个典型实现,是基于数组实现的List类,二者封装了一个动态的,允许再分配的Object[]数组。
显著区别:
- ArrayList是线程不安全的
- Vector集合则是线程安全的
Vector是一个古老的集合,有很多缺点。Vector是线程安全的,所以Vector的性能比 ArrayList的性能要低。实际上,即时需要保证List集合线程安全,也同样不推荐使用Vector实现类。
Deque接口与ArrayDeque实现类 |
Deque接口是Queue接口的子接口,它代表一个双端队列,Deque接口里定义了一些双端队列的方法,这些方法允许从两端来操作队列的元素。同时Deque还可以当成栈来使用。
Deque接口提供了一个典型的实现类:ArrayDeque,它是一个基于数组实现的双端队列,创建Deque时同样可指定一个numElements参数,该参数用于指定Object[]数组的长度;若不指定,Deque底层数组的长度为16。
当程序需要使用“栈”这种数据结构时,推荐使用ArrayDeque,尽量避免使用Stack—Stack是古老的集合,性能较差。
LinkedList实现类 |
LinkedList类是List接口的实现类,这意味着它是一个List集合,可以根据所引来随机访问集合中的元素。除此之外,LinkedList还实现了Deque接口,可以被当成双端对列来使用,因此即可以被当成“栈”,也可以被当成对列使用。
LinkedList可以作为List集合、双端对列和栈来使用,是一个功能非常强大的集合类。
总结 |
LinkedList与ArrayList、ArrayDeque的实现机制完全不同,ArrayList、ArrayDeque内部以数组的形式来保存集合中的元素,因此随机访问集合元素时有较好的的性能;而LinkedList内部以链表的形式来保存集合中的元素,因此随机访问集合元素时性能较差,但在插入、删除元素时性能比较出色。
总体来说,ArrayList的性能比LinkedList的性能要好,因此大部分时候都应该考虑使用ArrayList。
虽然Vector也是以数组形式存储集合元素,但因为它实现了线程同步的功能(而且实现机制也不好),所以各方面性能都比较差。