一、整体架构
几个基础问题:
1.List如何排序?
2.List删除某个元素
3.对比问题(关键是掌握每个的特性):
List和Set的区别
ArrayList和HashSet的区别
HashMap和Hashtable区别
二、ArrayList
1.概述
2.源码
3.扩容机制
4.快速失败机制
5.CopyOnWrite原理及缺点
三、HashSet
四、HashMap
1.hashmap的数据结构
- 数组+链表+红黑树(jdk8)
//数组 Node[] table //数组元素的结构 static class Node<K,V> implements Map.Entry<K,V> { final int hash; //用来定位数组索引位置 final K key; V value; Node<K,V> next; //链表的下一个node }
- 数组table长度length大小强制是2的n次方(“强制”的意思是不管你传入的是否是2的n次方,都会处理成2的n次方),那为什么是2的n次方呢?
原因是:定位元素在table位置,当length为2的n次方时,有一个规律 “h& (length-1)=h%length”,然而运算效率上&比%元素高,所以底层强制2的n次方。
简单一句话就是:HashMap中的hash算法,当length为2的n次方时,&比%效率更高
2.hash冲突解决
- HashMap解决冲突用的是链地址法,也就是用数组+链表这种结构来解决hash冲突的
3.机制扩容
- 扩容的时机(可以参考这篇文章 https://blog.csdn.net/u014532901/article/details/78936283)
当map
中包含的Node
的数量大于等于threshold = loadFactor * capacity
的时候,且新建的Node刚好落在一个非空的桶上,此刻触发扩容机制,将其容量扩大为2倍
- 扩容的rehash造成并发死锁问题