HashMap实现原理,利用数组和链表存储元素
必备面试题,必考项目之一,整理了一下发出来。
hashmap底层:
1.底层数组+链表实现,可以存储null键和null值,线程不安全。
HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。
数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。
put方法:添加元素的时候会判断是否存在相同的hashcode和相同的key元素,如果存在相同的hash和相同的key,则新值覆盖老值,返回旧值。反之产生hash冲突,链表解决。
链表如何解决hash冲突?
如图所示:
每个entry中有key、value(键值对),next(指向下一个Entry)。放入位置算法:key.hashcode % 数组的长度。
位置下标由key的哈希值对数组的长度取模得到
答:链地址法,为了解决冲突,一个hash中存放的链表,元素的实际位置在数组的链表上,所以相同hashCode的不同元素可以存储在同一位置。
key:put方法的key。
value:put方法的value。
next:因为存在相同的hashcode,不同的key,所以next是下一个entry的地址,也就是位置。
如何解决了您的问题,还希望来JAVA WEB开发交流群:958923746,有问题欢迎共享,共同提升!