一、 数组
list: 继承于Collection接口,只用于对单列数据的存储,有序可重复,有多个实现例如下:
ArrayList:底层由数组实现,查询快,增删慢;线程不安全,效率高
扩容机制:初始化的一个ArrayList是一个空数组,当添加第一个元素的时候,内部会调用扩容方法返回最小容量10,当添加第11个元素时开始扩容,新 数组 是旧数组的1.5倍(本质就是计算出新的扩容数组的大小后实例化,并将原有数组内容复制到新数组,然后给予数组对象地址)
LinkedList:底层由链表实现,查询慢,增删快;线程不安全,效率高
Vector:底层由数组实现,查询快,增删慢;线程安全,效率低,线程安全的,因为在其操作函数中带有synchronized
扩容机制:
当使用无参构造方法时,默认初始容量是10,每次扩容为原容量的2倍
当使用的是一个参数的有参构造函数时,初始化容量则为指定的长度,每次扩容为原容量的2倍
当使用的是两个参数的有参构造函数创建Vector对象时,初始化容量则为指定的长度,每次扩容,容量 = 原容量 + 指定的扩容长度
set:
HashSet:底层由哈希表来实现,无序不可重复(唯一性由equals()和hashcode()方法保证)
LinkedHashSet:底层由链表和哈希表来实现,有序不可重复(由链表保证元素有序;由哈希表保证元素唯一)
TreeSet:底层由红黑树来实现,有序不可重复
map:是一个顶层接口,用于对键值对进行存储,值可重复,键不可重复
HashMap:底层实现是数组+链表+红黑树的形式的,同时它的数组的默认初始容量是16、扩容因子为0.75,每次采用2倍的扩容。也就是说,每当我们 数组中的存储容量达到75%的时候,就需要对数组容量进行2倍的扩容。无序,线程不安全,允许null值(键和值都允许)
LinkedHashMap:通过双联表的结构来维护节点的顺序的,每个节点都进行了双向的连接,维持插入的顺序。head指向第一个插入的节点,tail指向最后 一个节点。它是HashMap的子类,继承了HashMap。
TreeMap:底层使用红黑树来实现,有序
Hashtable:无序,线程安全;不允许null值;HashTable相对于HashMap的最大特点就是线程安全,所有的操作都是被synchronized锁保护的
ConcurrentHashMap:这是现阶段使用使用比较多的一种线程安全的Map实现类。在1.7以前使用的是分段锁机制实现的线程安全的。但是在1.8以后使用 synchronized关键字实现的线程安全。