1.ArrayList
Object[] 数组实现,默认大小为 10(底层先创建了一个长度为0的数组,当添加第一个元素的时候,初始化容量为10),支持随机访问,连续内存空间,插入末尾时间复杂 度 o(1),插入第 i 个位置时间复杂度 o(n - i)。扩容,大小变为 1.5 倍,Arrays.copyOf(底层 System.ArrayCopy),复制到新数组,指针指向新数组。
2.LinkedList
基于链表实现,1.7 为双向链表,1.6 为双向循环链表,取消循环更能分清头尾。它没有扩容机制,每次在头尾添加元素。
3.HashMap
底层数据结构,JDK 1.8是数组+链表+红黑树,JDK1.7无红黑树。链表长度大于8时,转化为红黑树,优化查询效率。 初始容量为 16,通过 tableSizeFor 保证容量为 2 的幂次方。寻址方式,高位异或,(n-1)&h取模,优化速度。 扩容机制,当元素数量大于容量 x 负载因子 0.75 时,容量扩大为原来的 2 倍,新建一个数组,然后转移到新数组。 基于Map实现。线程不安全。