hashmap底层原理为什么用红黑树 jdk1.8十大新特性详解?

[更新]
·
·
分类:互联网
4627 阅读

hashmap底层原理为什么用红黑树

jdk1.8十大新特性详解?

jdk1.8十大新特性详解?

jdk1.8新特性知识点:
Lambda表达式
函数式接口
*方法引用和构造器调用
Stream API
接口中的默认方法和静态方法
新时间日期API
在jdk1.8中对hashMap等map集合的数据结构优化。hashMap数据结构的优化
原来的hashMap采用的数据结构是哈希表(数组 链表),hashMap默认大小是16,一个0-15索引的数组,如何往里面存储元素,首先调用元素的hashcode方法,计算出哈希码值,经过哈希算法算成数组的索引值,如果对应的索引处没有元素,直接存放,如果有对象在,那么比较它们的equals方法比较内容
如果内容一样,后一个value会将前一个value的值覆盖,如果不一样,在1.7的时候,后加的放在前面,形成一个链表,形成了碰撞,在某些情况下如果链表无限下去,那么效率极低,碰撞是避免不了的加载因子:0.75,数组扩容,达到总容量的75%,就进行扩容,但是无法避免碰撞的情况发生在1.8之后,在数组 链表 红黑树来实现hashmap,当碰撞的元素个数大于8时 amp 总容量大于64,会有红黑树的引入除了添加之后,效率都比链表高,1.8之后链表新进元素加到末尾
ConcurrentHashMap (锁分段机制),concurrentLevel,jdk1.8采用CAS算法(无锁算法,不再使用锁分段),数组 链表中也引入了红黑树的使用。

zset 原理?

redis中有一个非常重要的数据结构,那就是Zset。它是一个有序集合,也就是说存储的数据是有序的。
说到有序集合,很容易就能想到二叉搜索树,比如AVL树、红黑树、B树、B 树这些数据结构。而Zset底层使用的是什么数据结构呢,其实zset使用的是跳跃表(skipList)的数据结构。
什么是跳跃表?
它其实是一种随机化的数据结构,一个多层的有序链表,一种基于概率统计的插入算法。

HashMap发生碰撞后怎么取碰撞的元素?

首先你得知道什么是hash碰撞!
当有数据存入哈希表时,先使用hash算法(其实就是一种压缩策略)计算数据的hash值,然后存入相应的数组中作为元素!因为是使用压缩,所以毫无疑问的会产生冲突,两个不同数据的hash值是一样的(比如hash算法是取模,101和91是一样的1作为hash值),这就是hash冲突,或者叫做hash碰撞!
解决hash碰撞主要有以下几种方式:
1,开放地址法:在发生hash碰撞的时候,采用一定的策略(比如线性查找该元素后面的空位放入,或者随机数探测方法等)将新的数据放入满足策略的空位置!
2,再哈希法:使用多种hash算法,当产生冲突的时候,使用下一种算法,直到找到空位插入为止,如果hash碰撞比较严重,使用这种方法会大大增加hash计算时间!
3,链地址法:把每个数组的元素看做链表,变为数组 链表的数据形式,在发生冲突的时候,把新数据插入到对应元素的链表中!
举个例子,比方说一个250000的数据,如果使用寻常的方式顺序查找,需要125000次比较,而如果使用hash表(假设是十分均匀的hash表,数组是500个元素,链表是500个节点),则只需要500/2 500/2500次比较,就可以查到!效率从O(N)降到了O(1)常量级别!
很多语言中都有hash的实现,而在JDK中使用的就是链地址法来解决哈希冲突的,不过在j d k8中,当链表节点数大于8的时候,会自动转换成红黑树,进一步提升了查询的效率!
hashmap是面试中常常提及的点,需要重点关注下,一直走在JAVA开发技术分享的道路上,从不停歇,敬请关注!!