Collection
List
ArrayList
1.实现:底层使用数组
2.特点:排列有序,可重复、查询快、增删慢。线程不安全
3.扩容机制:首次扩容会从0扩容成10,再次扩容会扩容到上一次容量的1.5倍
LinkedList
1.实现:底层使用双向链表
2.特点:列表中的每个节点都包含了对前一个和后一个节点的引用
3.扩容机制:linkedlist 没有扩容机制,就是一直在前面或者在后面新增就好
Voctor
1.实现:底层使用object数组实现
2.特点:线程安全效率低
3.扩容机制:当容量不够首次扩容会从0扩容成10,再次扩容会扩容到上一次容量的2倍
Set
Hashset
1.底层:底层实现使用哈希表结构
2.特点:无序集合存取的顺序不一样,没有索引,不能使用for遍历,只能用foreach
hashset底层不重复的原理:**Set集合在调用add方法的时候,add方法会调用元素的hashCode方法和equals方法,判断元素是否重复**
TreeSet
1.底层:二叉树数据结构
2.特点:如果添加整型那会从小排到大
如果添加字符串 会从第一个元素比较 在比较第二个元素大小
在自然排序中,比较俩个对象是否为相同的标准 : compareTo()返回0
LinkedHashSet
1.底层:哈希表+链表(多了一条链表,记录元素的存储顺序)
2.特点:元素的有序,是有续 怎么放进去的 怎么取出来 ,但不重复
Map
Hashmap
1.底层:java1.7数组+链表 ,java1.8引入了红黑树
Hashmap底层是数组+链表+红黑树
初始大小:16 必须是2的幂次方
加载因子:0.75
树化因子:8
非树华因子 6
扩容过程:当元素放置够12个时,或者单链表够8个时,进行扩容,扩容需要先创建一个新的数组,在通过重新计算Hash值的方式,来判断元素应该在高位还是地位
树化过程,当元素单链表超过8个元素,同时
容器的大小不小于64,进行树华,将链表树华成一个红黑树
Hashmap:在1.7使用头插法,1.8使用尾插法
Hashmap为什么容器大小必须是2的幂 : 方便计算桶的位置,方便rehash
2.特点:键值对存储,查询效率高、允许出现null,是非线程安全的
3.HashMap中的put()和get()的实现原理
**1、map.put(k,v)实现原理**
(1)首先将k,v封装到Node对象当中(节点)。
(2)然后它的底层会调用K的hashCode()方法得出hash值。
(3)通过哈希表函数/哈希算法,将hash值转换成数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上。如果说下标对应的位置上有链表。此时,就会拿着k和链表上每个节点的k进行equal。如果所有的equals方法返回都是false,那么这个新的节点将被添加到链表的末尾。如其中有一个equals返回了true,那么这个节点的value将会被覆盖。
**2、map.get(k)实现原理**
(1)先调用k的hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。
(2)通过上一步哈希算法转换成数组的下标之后,在通过数组下标快速定位到某个位置上。如果这个位置上什么都没有,则返回null。如果这个位置上有单向链表,那么它就会拿着K和单向链表上的每一个节点的K进行equals,如果所有equals方法都返回false,则get方法返回null。如果其中一个节点的K和参数K进行equals返回true,那么此时该节点的value就是我们要找的value了,get方法最终返回这个要找的value。
ConcurrentHashmap
底层实现与hashmap一致,但是在涉及多线程操作的时候,引入CAS + Synchrionized关键字,来保证线程安全
1.7使用分段锁, 1.8使用 CAS + Synchronized