hash表:
我们要新增或查找某个元素,我们通过把当前元素的关键字 通过某个函数映射到数组中的某个位置,通过数组下标一次定位就可完成操作。这个函数可以简单描述为:存储位置 = f(关键字) ,这个函数f一般称为哈希函数,这个函数的设计好坏会直接影响到哈希表的优劣。
hash冲突:
如果两个不同的元素,通过哈希函数得出的实际存储地址相同
HashMap:
HashMap由数组+链表组成的(1.8数组+链表+红黑树),数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,那么查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。
存储下标:key ----> hashcode() ---> hash() ---> indexOf()于数组长度-1的二进制做&运算 ---> index
ConcurrentHashMap:
1.7: 数组+Segment+分段锁
1.8:数组+链表+红黑树,内部大量采用CAS操作
Segment(分段锁)类似于HashMap的结构,即内部拥有一个Entry数组,数组中的每个元素又是一个链表,同时又是一个ReentrantLock(
CAS是compare and swap的缩写,即我们所说的比较交换。cas是一种基于锁的操作,而且是乐观锁。