简单介绍Java容器(Collection和Map)

Java中常见的容器由两类,Collection和Map,本文就简单叙述下两者。(排版不是太好,等有时间看看怎么排)

1.Collection

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,线程不安全,注意,这里的有序是指自然排序或指定排序规则的有序,非插入顺序 可以对数据指定排序规则,默认升序

2. Map

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,线程安全 线程安全
posted @ 2020-09-27 11:57  iHADream  阅读(199)  评论(0编辑  收藏  举报