JDK1.7中数组
使用一个Entry数组来存储数据,用key的hashcode取模来决定key会被放到数组里的位置,若是hashcode相同,或者hashcode取模后的结果相同(hash collision),那么这些key会被定位到Entry数组的同一个格子里,这些key会造成一个链表。函数
在hashcode特别差的状况下,比方说全部key的hashcode都相同,这个链表可能会很长,那么put/get操做均可能须要遍历这个链表code
也就是说时间复杂度在最差状况下会退化到O(n)对象
JDK1.8中接口
使用一个Node数组来存储数据,但这个Node多是链表结构,也多是红黑树结构get
若是插入的key的hashcode相同,那么这些key也会被定位到Node数组的同一个格子里。hash
若是同一个格子里的key不超过8个,使用链表结构存储。io
若是超过了8个,那么会调用treeifyBin函数,将链表转换为红黑树。遍历
那么即便hashcode彻底相同,因为红黑树的特色,查找某个特定元素,也只须要O(log n)的开销方法
也就是说put/get的操做的时间复杂度最差只有O(log n)
可是真正想要利用JDK1.8的好处,有一个限制:
key的对象,必须正确的实现了Compare接口
若是没有实现Compare接口,或者实现得不正确(比方说全部Compare方法都返回0)
那JDK1.8的HashMap其实仍是慢于JDK1.7的