Java中常见的容器由两类,Collection和Map,本文就简单叙述下两者。(排版不是太好,等有时间看看怎么排)
Collection是集合的根接口,所有集合都是继承该接口而来,其下有List和Set子类,根据官方文档描述,不同的子类对于有序性、重复性、null、线程同步都有不同的策略,下边说明时主要也会从这四个方面说明。List主要包含ArrayList,LinkedList ,Vector,Set下主要包含HashSet,LinkedHashSet,TreeSet。
类型 | 名称 | 底层数据结构 | 扩容方式 | 优缺点 | 特点 |
---|---|---|---|---|---|
List | ArrayList | 动态数组 | 默认初始化容量是10,扩容1.5n | 因为底层结构是数组,所以存储的数据是有序,重复,可以存null(多个),没有加锁,线程不安全的 | 就是随机访问效率高,但是增删慢,需要修改影响到的下标 |
List | LinkedList | 双向链表 | 同上 | 存储的数据是有序,重复,可以存null(多个),没有加锁,同样线程不安全 | 增删快,因为只影响到了相邻的两个节点,随机访问慢,因为需要全部遍历一遍。 |
List | Vector | 动态数组 | 底层数组的默认初始化容量是10,默认扩容方式是2n | 存储的数据是有序,重复,可以存null(多个),大部分方法都被synchronized关键字修饰,线程安全 | 线程安全,效率较低 |
Set | HashSet | 是由HashMap包装实现的,其方法也是由HashMap的方法实现 | 同HashMap | 存储数据时,放在了HashMap的Key的位置上(所有的Value都是PRESENT,伪值),所以HashSet存储的值不能重复,而且无序,只能存一个null,没有加锁,线程不安全 | 一般的增删查用的都是它 |
Set | LinkedHashSet | 由LinkedHashMap包装而来,其方法也是LinkedHashMap的方法实现 | 同HashMap | 存储数据时,和以上HashSet基本相同,不同点因为底层是LinkedHashMap包装实现,所以它存储数据的是有序的 | 有序,但是效率不高 |
Set | TreeSet | 底层是TreeMap包装实现,TreeMap底层数据结构是红黑树,而且继承了SortSet接口 | - | 存储的数据时唯一,不重复,有序,不为null,线程不安全,注意,这里的有序是指自然排序或指定排序规则的有序,非插入顺序 | 可以对数据指定排序规则,默认升序 |
Map是java种另一种重要的数据结构,主要包含HashMap,HashLinkedMap,TreeMap,HashTable。
名称 | 底层数据结构 | 扩容方式 | 优缺点 | 特点 |
---|---|---|---|---|
HashMap | 用的哈希表,在1.7版本时由数组+链表组成,在1.8种由数组+链表+红黑树组成 | 初始化容量(DEFAULT_INITIAL_CAPACITY)1 << 4 = 16,扩容(resize)2n,负载因子(LOAD_FACTOR)0.75,当Map的存储的元素数量(size)大于 容量(CAPACITY)*负载因子(LOAD_FACTOR) 时,会进行扩容,最大容量是(MAXIMUM_CAPACITY)1 << 30;当链表的长度大于8且数组的长度大于64时,链表会转换成红黑树,当链表长度小于6时,会由红黑树转换成链表 | 存储数据时无序,k值不重复,可以为null(k-v,null-null,k-null,null-v),线程不安全 | 增删查效率都比较高 |
LinkedHashMap | 哈希表,同上 | 同上 | 数据存储时有序,不重复,可以为null,线程不安全 | 存储数据的插入顺序 |
TreeMap | 红黑树 | - | 存储数据时有序,k值不重复,不为null,线程不安全,该处有序是指自然排序货指定排序规则的有序,非插入顺序 | 可以指定排序规则,默认升序 |
HashTable | 哈希表 | 初始化容量11,扩容2n+1 | 存储时无序,k值不重复,不为null,线程安全 | 线程安全 |
原文:https://www.cnblogs.com/thePeaceOftheLord/p/13737276.html