1、实现Map的类
2、数据结构
数组 + 链表(红黑树)
3、HashMap源码
构造函数
tableSizeFor决定了集合大小均是2的指数幂
所有集合存储方式都是在添加元素时决定了数据结构,所以接下来看下put
如果要将hash冲突用红黑树存储,数组长度小于64则要扩容,因为hash冲突严重
2、节点数据结构
3、get和remove就比较简单这里就省略了吧
4、线程安全的Map ,HashTable、ConcurrentHashMap
HashTable直接将锁加到了方法上,所以整个map对象都会参与锁竞争
而ConcurrentHashMap如果无Hash冲突就用CAS将其放在头部(不会有ABA问题)是将锁加到了相同hash值的头部(!= nulll),性能更优
ConcurrentHashMap的get方法是没有加锁的,这个因为读取值对链表或树没有影响,就算加锁在非公平锁情况下也是无法保证先后的所以读取时加锁是多余的
主要还是对数据结构要清晰,然后就是每个Map用来做什么会有对应的算法