1 Vector and ArrayList
它们都是可以随机访问的。它们的区别是Vector是线程安全的,而ArrayList不是线程安全的。
2 HashMap的底层实现机制
2.1 底层数据结构
每一对key-value pair都有一个专门的数据结构来表示,即一个内部类Node<K,V>,
然后所有的key-value pair放在一个数组中,transient Node<K,V>[] table。
2.2 HashMap里面保存的数据
HashMap里面保存key value pare,并且还会生成hash值。不要被课本里面的用数组下标作为key的默认值所蒙蔽。
2.3 使用
2.3.1 HashMap里面是没有加同步机制的
2.4 计算hash的方法,即计算内部hash key的方法
hash key的计算是根据key来的,然后放入一个table中的一个bin中,bin中不同的key-value pair是通过key的不同来区分的。
也就是说,同一个bin中不允许出现两个相同的key。如果出现了的话,那么就是第二次冲突了。该HashMap处理二次冲突的办法很简单,就是直接将old value覆盖。
2.5 处理冲突的算法
冲突了的key-value pair都放在一个bin中,当bin中的成员总数小于8是,这个bin是一个链表,当bin中的成员总数大于等于8时,这个bin是一棵红黑树。
对于红黑树,插入和删除的时间复杂度都是O(logn)。
3 ConcurrentHashMap底层实现机制
3.1 底层的数据结构
3.2 ConcurrentHashMap里面保存的数据
3.3 加锁的方式和时机
用synchronized关键字进行加锁。加锁的时机?
3.4 使用
3.5 什么是random hash
ConcurrentHashMap类用的是什么random hash,这样做的目的是什么?
将ConcurrentHashMap的整个实现搞清楚了,然后再去研究random hash。
4 ArrayList
4.1 好的地方
底层是一个java数组,所以支持随机访问。
4.2 不好的地方
4.2.1 插入
在某个index处插入时,需要先把这个位置开始后面的所有元素都后移一个位置。然后再插入。
4.2.2 删除
删除一个元素时,需要把该元素后面的所有元素向前移动一个位置。