集合框架总结-序
集合框架初步学习后,打算写下此系列文章总结
本文只做总的概述,不对某个集合进行详细解析
详细解析请移步同系列其他文章
Java Map遍历方式的选——TreeMap、HashMap的key、value遍历与效率分析
目录
-
集合框架体系
(图源传智播客 侵删)
Collection(单列集合)
|--List 有序,可重复
|--ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高
|--Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低
|--LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高
|--Set 无序,唯一 (只能用迭代器 没有了get方法)
|--HashSet
底层数据结构是哈希表
如何保证元素唯一性
依赖两个方法:hashCode()和equals()
开发中自动生成这两个方法即可
|--LinkedHashSet
底层数据结构是链表和哈希表
由链表保证元素有序 (存储与取出顺序一致)
由哈希表保证元素唯一
|--TreeSet
底层数据结构是红黑树
如何保证元素排序
自然排序 泛型重写实现Comparable接口 重写compare(T o1, T o2)方法
比较器排序 构造函数实现Comparator接口 重写CompareTo(T o)方法
如何保证元素唯一性
根据比较的返回值是否是0来决定
Map(双列集合)
|--HashMap
底层数据结构是哈希表(数组+链表)和红黑树 PS:JDK8之前只是哈希表 没有红黑树 JDK8中红黑树也只是作为补充
由哈希表保证键唯一 注意只是键唯一 值并不唯一
元素以键值对方式存储,通过键可以映射到值 习惯上将HashMap<K,V>的对象称为散列映射
|--LinkedHashMap
底层数据结构是哈希表+链表
由哈希表保证键唯一 链表保证元素有序 (存储与取出顺序一致)
元素以键值对方式存储,通过键可以映射到值
|--TreeMap
底层数据结构是哈希表(数组+链表)和红黑树
由哈希表保证键唯一 红黑树实现排序
-
如何选择集合的使用
集合框架体系庞大,要想合理的使用集合必须先了解集合的特点,而各自的特点其实通过集合的名字就已经可以了解大概
- ArrayXxx:底层数据结构是数组,查询快,增删慢
- LinkedXxx:底层数据结构是链表,查询慢,增删快
- HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
- TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序
通过命名规律,我们便可以在特定的场景选择合适的集合了
当难以判断用Collection体系还是Map体系时 用Collection体系
Collection
唯一吗?
是:Set
排序吗?
是:TreeSet
否:HashSet
要存储与取出顺序一致: LinkedHashSet
如果你知道是Set,但是不知道是哪个Set,就用HashSet
否:List
要线程安全吗?
是:Vector
否:ArrayList或者LinkedList
查询多:ArrayList
增删多:LinkedList
如果你知道是List,但是不知道是哪个List,就用ArrayList
如果需要以键值对方式存储对象 则使用Map体系
Map
要线程安全吗?
是:Hashtable(注意! Hashtable不属于Map体系 只是用法相似 其继承自java.util.Dictionary<K,V>)
否: HashMap/TreeMap
要排序吗?
是:TreeMap
否: HashMap
要存储与取出顺序顺序一致: LinkedHashMap
如果你知道是Map,但不知道用哪个Map,就用HashMap
一般情况下,用ArrayList足以应对大多数情况了,因为我们可以使用Collections工具来对集合进行进一步操作
- public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。
- public static <T> void sort(List<T> list,Comparator<? super T> c): 使用比较器指定的排序方式进行排序
- public static <T> int binarySearch(List<?> list,T key):二分查找
- public static <T> T max(Collection<?> coll):最大值
- public static void reverse(List<?> list):反转
- public static void shuffle(List<?> list):随机置换
- public static <T> List<T> synchronizedList(List<T> list):返回由指定列表支持的同步(线程安全)列表
值的一提的是 使用 synchronizedList方法返回的线程安全集合,并对其迭代时要加上同步锁 否则可能会有不可预料的结果
以下源自API
在迭代时,用户必须在返回的列表上手动同步:
List list = Collections.synchronizedList(new ArrayList());
...
synchronized (list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}