目录
- List 接口
- Set 接口
- Queue 接口
- Map 接口
- 集合遍历
- 集合算法
说明
从应用的角度只需关注两个问题:
(1)如何操作集合,主要涉及增删查改,排序和遍历。
(2)如何选择集合,主要考虑应用场景和集合的内部实现方式。
1. List 接口
- 接口特性:保持元素插入位置;可通过索引访问元素;允许重复元素。
-
实现类:
(1)ArrayList:采用动态数组实现。
(2)LinkedList:采用双向链表实现。 - 常用方法:add,get,set,remove,iterator,toArray,forEach,sort。
- 备注:只有在列表头部位置增删元素时,ArrayList 才会明显比 LinkedList 低效,因为 ArrayList 需要搬动大量元素。在其它位置增删查改元素时,ArrayList 大部分情况下会明显优于 LinkedList,因为增删改都要建立在查的基础上,而 LinkedList 在随机位置上查的效率是很低的,且调整双向指针和开辟新空间也会消耗不少时间。因此,在实际应用中一般使用的是 ArrayList (以实测为主,不要教条主义)。
2. Set 接口
- 接口特性:不包含重复元素。
-
实现类:
(1)HashSet:无序集;采用链表数组实现。
(2)TreeSet:有序集;采用红黑树实现;要求元素实现 Comparable 接口。
(3)LinkedHashSet:保序集;在链表数组的基础上采用双向链表记录位序。
(4)EnumSet:枚举集;采用位序列实现。 - 常用方法:add,remove,iterator,toArray,forEach。
- 备注:在实际应用中一般使用 HashSet 比较多。
3. Queue 接口
- 接口特性:限定在列表的头部/尾部位置进行插入/删除元素。
-
实现类:
(1)ArrayQueue:双端队列;采用循环数组实现。
(2)PriorityQueue:优先级队列;采用堆实现;要求元素实现 Comparable 接口。
(3)LinkedList:采用双向链表实现。 - 常用方法:add,offer,remove,poll,element,peek。
- 备注:在实际应用中使用多线程队列比较多。
4. Map 接口
- 接口特性:不能包含重复键。
-
实现类:
(1)HashMap:无序映射表;实现方式类似于HashSet。
(2)TreeMap:有序映射表;实现方式类似于TreeSet。
(3)LinkedHashMap:保序映射表;实现方式类似于LinkedHashMap。
(4)EnumMap:枚举映射表;采用值数组实现。
(5)WeakHashMap:弱引用映射表。
(6)IdentityHashMap:基于等号比较键值的映射表。 - 常用方法:get,put,replace,remove,keySet,entrySet,values。
- 备注:在实际应用中一般使用 HashMap 比较多。
5. 集合遍历
- 优先采用 for-each 循环遍历,其次采用迭代器遍历。
- 如果要对集合内的元素进行某种统一的操作,可以使用 forEach 方法。
- 虽然 List 接口支持 for 循环遍历,但要注意用 for 循环遍历 LinkedList 要比用 for-each 循环或迭代器慢得多。
6. 集合算法
- Collections 是集合类的辅助类,用于提供操作集合的各种方法,如排序,混排和二分查找等。有的方法要求集合实现某种接口,如排序算法要求集合实现 Comparable 接口;二分查找算法要求集合实现 Comparable 接口,且实现 RandomAccess 接口(否则会退化成线性查找算法)。