这一部分没什么好讲解的内容。从头开始,自己看Java的源码,敲一遍,实现一遍HashMap, ConcurrentHashMap什么的,就已经足够了。主要要区分开Hashmap还有concurrenthashmap他们两者的区别。就足以应对面试。
八大排血算法自己一定要在IDE中实现一遍,以加深印象。同时,hashmap还有concurrenthashmap也要根据原码进行一遍实现,以加深印象。
关于hashmap还是稍微写上两笔:
hashmap底层实现实际上就是所谓的hash数组加上一个链表,中文叫做散列表。
实际上就是一个叫做table的数组,然后数组中元素的类型是Entry。这个Entry有key,有value,有next等等。
hashmap都是先确定容量和因子,建一个Entry类型的数组table,然后当get的时候,使用key的key.hashcode()作为table的index。table[index]一定是一个链表的节点。然后当key的hashcode相等的时候,我们就去这个链表的后面搜索这个key,一直到找到相同的entry或者没有entry就向链表中进行插入。(如果有key,覆盖,如果没有使用addEntry方法把这个加入到table数组中去)
hashtable的底层实现跟hashmap一样都是散列表。不同的是一个是线程的安全问题,table所有的方法都加上了syncronized,还有就是计算hashcode的方法不一样,还有hashmap使用abstractmap接口,hashtable使用了Dictionary接口。
map可以有null的键值,table不允许有null的键值
ConcurrentHashMap