ArrayList
ArrayList
是Java集合框架中使用最为频繁的实现,其本质是一个有序的可自由扩容的对象数组。它实现了RandomAccess
这个标记接口,意味着其在随机访问性能上有一定优势。
ArrayList
是Java集合框架中使用最为频繁的实现,其本质是一个有序的可自由扩容的对象数组。它实现了RandomAccess
这个标记接口,意味着其在随机访问性能上有一定优势。
LinkedList
是基于双向链表实现的有序集合,其不能像ArrayList一样通过索引(index)访问元素,同时LinkedList
还实现了Deque
接口,意味着LinkedList
可以实现双端队列的操作。
Queue(队列),实际开发过程中,在单线程环境下使用的并不多,Queue作为集合框架中重要组成似乎习惯性被忽略。队列总是先持有元素,再处理元素1。
Queue继承关系简图
...Set
是不含重复元素的集,严格来讲,Set
不允许当e1.equals(e2)
为真时, e1 和 e2 同时出现在集合中。Set
最多允许一个null
元素。
将可变对象置入Set
时需要特别小心,当对象的改动影响到了元素之间的equals()
比较的结果,那么Set
的行为就变得不确定了。因此,不能将Set本身作为Set的元素。
由于Map
的键是Set
,因此使用可变对象作为Map
的key时,需要覆盖 equals 和 hashCode 方法,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
(链表散列映射)是HashMap
的导出类,像LinkedHashSet
与HashSet
的关系一样。
其与HashMap
的差别在于其使用LinkedList
来维护键值对插入的顺序,其插入机制和HashMap
是一致的。
LinkedHashMap
和HashMap
的性能相差不大,与HashSet
和LinkedHashSet
一致:
集合 | 特征 |
---|---|
HashMap | HashMap 基于散列表,插入和查询键值对的开销是固定的 |
LinkedHashMap | 和HashMap 类似,不过其使用LinkedList 维护内部次序,因此其迭代顺序是插入顺序或者LRU(最近最少使用)次序,性能稍差于HashMap |
HashMap
基于散列表,散列表中每一个Node节点(桶)是链表,当两个条目(entry)的key的hash值对桶数(capacity)取模的值相等时,这两个entry会存储在同一个链表中。但当链表中元素达到一定数目时,链表结构会转变为树结构。
本文从初始化,扩容,插入,获取,删除这几个方面深入讨论了HashMap
的实现细节。
...此文中没有讨论
HashMap
中涉及到树结构的源码。
集合框架中一个重要的类,其实是Collection接口的伴随类,其中定义了许多实用方法,用来获取集合视图,或提供一些方便的操作集合元素的算法。
由于视图是直接封装的Collection接口,因此其方法有些局限,并且由于特殊的设计,部分操作是不允许的(会抛出 UnsupportedOperationExceptin )。
...