Java集合个人笔记整理

在这里插入图片描述

总体概括

-Map/Collection/Queue接口是所有集合框架的父接口
-List接口和Set接口都继承Collection接口
-List接口实现类只要有:ArrayList/LinkedList/Vector/CopyOnWriteArrayList/Stack
-Set接口实现类只要有:HashSet/TreeSet/LinkedHashSet
-Map接口实现类主要有:HashMap/LinkedHashMap/TreeMap/ConcurrentHashMap/HashTable

List

ArrayList

-ArrayList底层数据结构是Object数组
-ArrayList线程不安全
-ArrayList有序可重复
-ArrayList随机访问效率高
-ArrayList尾部添加删除时间复杂度O(1),指定位置添加和删除需要移动数组,时间复杂度O(n-1)
-ArrayList默认大小是10个元素,扩容后新容量为旧容量的1.5倍
-ArrayList支持序列化

LinkedList

-LinkedList底层使用的是双向链表数据结构(JDK1.6之前为循环链表,JDK1.7取消了循环)
-LinkedList线程不安全
-LinkedList有序可重复
-LinkedList适合插入和删除时间复杂度O(1),指定位置插入和删除需要移动位置时间复杂度O((n))
-LinkedList不支持高效的随机元素访问
-LinkedList采用的是尾插法

Vector

-Vector底层数据结构是Object数组
-Vector线程安全
-有序可重复
-随机访问效率高
-尾部添加删除时间复杂度O(1),指定位置添加和删除需要移动数组,时间复杂度O(n-1)
-Vector默认初始化容量是10,扩容为原来的2倍
-Vector不支持序列化

CopyOnWriteArrayList

-是一个线程安全的ArrayList,内部使用了重入锁(ReetrantLock)使用System.arraycopy()方法实现写时复制,写
删改操作加锁,而读无锁
-底层数据结构是volatile修饰的Object数组
-适合读多写少的场景使用
-初始化容量是1
-有序可重复
-随机访问效率高
-尾部添加删除时间复杂度O(1),指定位置添加和删除需要移动数组,时间复杂度O(n-1)

Stack

-底层数据结构是Object数组,继承自Vector
-线程安全
-先进后出

Set

HashSet

-底层是HashMap,key是值,value是Object静态常量
-无序不可重复
-非线程安全
-无参的构造方法,默认初始容量是16,加载因子是0.75
-通过HashCode和equals判断相等
-迭代器,增强for循环遍历
-集合元素可以是null,但只能放入一个null

TreeSet

-底层通过treeMap(红黑树结构)实现
-有序默认自然升须排序
-不可重复
-线程不安全
-集合元素不可以为null

LinkedHashSet

-LinkedHashSet底层实际上是一个LinkedHashMap(数组+双向链表)
-有序不可重复
-非线程安全
-集合元素不可以为null
-初始化容量16,负载因子是0.75

CopyOnWriteArraySet

-底层是通过CopyOnWriteArrayList实现的,也是动态数组结构
-线程安全
-无序不可重复
-适合读多写少

Map

HashMap

-底层由数组+链表+红黑树(jdk1.8增加)实现
-初始长度是16,加载因子是0.75
-HashMap链表转红黑树的条件是:链表长度大于8,数组容量大于64,如果数组不大于64会先扩容
-HashMap允许空的key-value键值对
-每次扩容为原来的2倍,将原集合的元素重新映射到新集合中

ConcurrentHashMap

-线程安全
-jdk1.7中的实现是引入了段的概念,把集合中的数据分成若干个段,每个段其实就是一个小的HashTable,给段进行加锁
-jdk1.8利用CAS+Synchronized来实现

LinkedHashMap

-LinkedHashMap是HashMap+LinkedList(数组+双向链表)的实现。
-key,value允许为空、key重复会覆盖,value允许重复、有序、非线程安全。

TreeMap

-TreeMap底层是红黑树实现的,红黑树结构天然支持排序,默认情况下通过key值的自然顺序进行排序
-key不能为null,单允许多个value为null
-线程不安全

HashTable

-Hashtable也是一个哈希散列表,Hashtable继承于Dictionary
-HashTable不允许空的key和value值
-线程安全
-HashTable的put和get增加了synchronized锁性能较差
-初始容量是11,扩容为原来的2n+1

ThreadLocal

1.每个Thread都有一个属于自己的ThreadLocalMap,这个ThreadLocalMap是ThreadLocal的一个内部类,类似于一个
HashMap集合
2.每次存取值都是通过ThreadLocalMap存取,key值为ThreadLocal实例,value是需要存放的值
ThreadLocal中的嵌套内部类ThreadLocalMap,这个类本质上是一个map,和HashMap之类的实现相似,依然是key-
value的形式,其中有一个内部类Entry,其中key可以看做是ThreadLocal实例,但是其本质是持有ThreadLocal实例的
弱引用。而线程本身Tread中会有threadLocals这个局部变量,这个局部变量就是ThreadLocalMap的实例存放数据是需
要先初始化这个变量每次保存时都是以一个ThreadLocal实例作为key值,存放的数据作为value值进行存放。一个
ThreadLocal只能存放一种指定的类型的数据。其所有功能都是通过ThreadLocalMap这个内部类实现的。

Guess you like

Origin blog.csdn.net/xiaowanzi_zj/article/details/121668278