集合框架

ArrayList

ArrayList是Java集合框架中使用最为频繁的实现,其本质是一个有序的可自由扩容的对象数组。它实现了RandomAccess这个标记接口,意味着其在随机访问性能上有一定优势。

...

LinkedList

LinkedList是基于双向链表实现的有序集合,其不能像ArrayList一样通过索引(index)访问元素,同时LinkedList还实现了Deque接口,意味着LinkedList可以实现双端队列的操作

...

Queue

Queue(队列),实际开发过程中,在单线程环境下使用的并不多,Queue作为集合框架中重要组成似乎习惯性被忽略。队列总是先持有元素,再处理元素1

J7NBrQ.png

Queue继承关系简图

...

Set

Set不含重复元素的集,严格来讲,Set不允许当e1.equals(e2)为真时, e1e2 同时出现在集合中。Set最多允许一个null元素。

可变对象置入Set时需要特别小心,当对象的改动影响到了元素之间的equals()比较的结果,那么Set的行为就变得不确定了。因此,不能将Set本身作为Set的元素

...

HashMap和TreeMap

由于Map的键是Set,因此使用可变对象作为Map的key时,需要覆盖 equalshashCode 方法Map不能使用自身作为key

Java 8对Map接口进行了优化,新增了主要是针对函数式接口默认 方法(方法体被省略):

default V merge (K key, V value,
  BiFunction<? super V, ? super V, ? extends V> remappingFunction) {...}
default V compute (K key,
  BiFunction<? super K, ? super V, ? extends V> remappingFunction) {...}
default V computeIfPresent (K key,
  BiFunction<? super K, ? super V, ? extends V> remappingFunction) {...}
default V computeIfAbsent (K key,
  Function<? super K, ? extends V> mappingFunction) {...}
default V replace (K key, V value) {...}
default boolean replace(K key, V oldValue, V newValue) {...}
default boolean remove (Object key, Object value) {...}
default V putIfAbsent (K key, V value) {...}
default void replaceAll (
  BiFunction<? super K, ? super V, ? extends V> function) {...}
default V getOrDefault (Object key, V defaultValue) {...}

上述方法使用的不多,主要用来对Map键值进行更新,按需查阅API文档。

...

LinkedHashMap

LinkedHashMap(链表散列映射)是HashMap的导出类,像LinkedHashSetHashSet的关系一样。

其与HashMap的差别在于其使用LinkedList来维护键值对插入的顺序,其插入机制和HashMap是一致的。

LinkedHashMapHashMap的性能相差不大,与HashSetLinkedHashSet 一致

集合特征
HashMapHashMap基于散列表,插入和查询键值对的开销是固定的
LinkedHashMapHashMap类似,不过其使用LinkedList维护内部次序,因此其迭代顺序是插入顺序或者LRU(最近最少使用)次序,性能稍差于HashMap
...

HashMap的源码分析

HashMap基于散列表,散列表中每一个Node节点(桶)是链表,当两个条目(entry)的key的hash值对桶数(capacity)取模的值相等时,这两个entry会存储在同一个链表中。但当链表中元素达到一定数目时,链表结构会转变为树结构

本文从初始化,扩容,插入,获取,删除这几个方面深入讨论了HashMap的实现细节。

此文中没有讨论HashMap中涉及到树结构的源码。

...

Collections工具类

集合框架中一个重要的类,其实是Collection接口的伴随类,其中定义了许多实用方法,用来获取集合视图,或提供一些方便的操作集合元素的算法

由于视图是直接封装的Collection接口,因此其方法有些局限,并且由于特殊的设计,部分操作是不允许的(会抛出 UnsupportedOperationExceptin )。

...