HashMap解析(主要JDK1.8,附带1.7出现的问题以及区别)
按问题的形式来吧,这些大多是我自己总结的,如有错误请及时指正谢谢 1.你了解HashMap么,可以说说么? 首先,HashMap是一种数据结构,可以快速的帮我们存取数据。它的底层数据结构在1.7和1.8有了一些变化,1.7版本及以前他是 数组+链表 的形式,1.8及以后 数组+链表+红黑树, 如果链表长度 大于等于8 就会转化为红黑树,如果长度降至6红黑树会转化为链表 。 红黑树的出现解决了因为链表过长导致查询速度变慢的问题,因为链表的查询时间复杂度是O(n),而红黑树的查询时间复杂度是O(logn)。 2.它的数组+链表是怎么实现的? 这个代码是1.8的(1.7是Entry,就是名字不一样),其实我们每一个放进去的(key,value)到最后都会封装成这样的Node对象。Hashmap的数组就是以一系列这样的Node对象构成的数组,链表就是把next指向下一个Node对象。 3.为什么要有链表,红黑树?只有数组不可以么? 首先我们要知道什么是Hash算法。 这里放出一段官方的话: Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的 输入 (又叫做预映射pre-image)通过散列算法变换成固定长度的 输出 ,该输出就是散列值。这种转换是一种 压缩映射 ,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出