Java集合(一):开篇

Catalogue
  1. 1 List
  2. 2 Map
  3. 3 Set

注意
本系列文章是笔者在参考了大量优秀文章的基础上的理解,由于水平有限,难免会出现错误,望批评指正,同时我也会把自己最新的理解及时更新到文章中去。最后,我会在文中注明参考文章,特别感谢这些无私奉献的作者。

Java 的集合类在开发中被使用的频率非常高,本系列的文章将重点介绍日常开发中常用的集合类,对于一些比较冷门的或者被废弃的,则会用稍微短一点的篇幅介绍他们。下面是Java中常见的集合类(重要的后面我用 * 标出来了,也是本系列文章将重点介绍的内容)。

1 List

  • ArrayList(*)
  • Vector
  • LinkedList(*)
  • CopyOnWriteArrayList(*)

2 Map

  • HashMap(*)
  • LinkedHashMap(*)
  • HashTable
  • TreeMap
  • ConcurrentHashMap(*)

3 Set

  • HashSet
  • TreeSet
  • LinkedHashSet
  • CopyOnWriteArraySet

上面的集合中 List 类别下的CopyOnWriteArrayList、Map类别下的ConcurrentHashMap以及Set类别下的CopyOnWriteArraySet在 java.util.concurrent 包下,其余全部都在 java.util 包下。

在看完本系列所有关于集合的分析文章后,可以回过头来看下这篇总结性的文章

但是对于链文中提到的几个观点,笔者不赞同:

1、文章说 LinkedList 的底层是双向循环链表,实际看源码发现无论是 JDK 1.7 还是 JDK 1.8 的 LinkedList 底层只是双向链表而已,链文中讲述的可能是之前的老版本代码。

2、链文中讲到:“LinkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响,都是近似 O(1)”,这是错误的,插入、删除时依然需要遍历链表,只是 LinkedList 可以决定遍历方向(从头开始,还是从尾部开始)节省了部分时间而已。

3、链文中提到:“HashMap 如果定位到的数组包含链表,对于添加操作,其时间复杂度依然为 O(1),因为最新的 Entry 会插入链表头部,只需要简单改变引用链即可”,这是错误,看下JDK 1.7 的源码就会发现,在插入链表头部之前还会遍历完当前桶位置的链表,没有找到对于的key值才会插入到链表头部。

最后,提醒大家一定不要去背链文中的知识点,应该在看完本系列的文章后,再拐回来看这篇链文,用它来加深对 Java 集合的整体印象(其实是不完整的,建议还是要以源码和后面的文章为重点去理解)。