首页 > 编程知识 正文

java hashmap优势,谈谈 HashMap

时间:2023-05-05 16:43:14 阅读:64659 作者:4165

Java 7混图

1 .经典快速宝贝表实现:数组链表

数组优点:随机寻址为常数时间,无论数组长度如何,均可通过硬件电路的线性地址转换进行检索。 复杂性都是O(1)。

快速宝贝桶:本质是将一个元素映射为快速宝贝值,致命问题是快速宝贝碰撞

多个要素快速宝贝值相同称为快速宝贝冲突,解决方法是使用链表

成员变量Entry[] table是快速的宝物桶,Entry类是链表结构

put(key,value )做了什么?

HashMap刚初始化时,默认的16个快桶未初始化,只包含空的快桶数组。 第一次执行put方法时,inflateTable将快速桶的容量扩展为初始容量为2的幂。 如果将初始化容量设置为17,则在此步骤中17等于32。

Map中有transient关键字。 如果在不需要序列化的属性之前添加关键字transient,则实现Serilizable接口的类不会序列化。

2. HashMap初始容量

初始容量为1(4) 16 ),必须将初始容量设置为2的幂。 这个容量就是HashMap中快宝宝桶的个数。

为什么初始容量必须是2的幂?

其中一个对象的hashCode范围为-2 ^ 31 ~ 2 ^ 31 - 1,约42亿个。 怎么把这些数分散在n个快宝贝桶里? 使用i % n算法有两个缺点:1.用负数求馀数是负数(-1 % 2=-1 );2 .效率低)。 用硬件求馀数的本质是,不断进行除法运算,比位运算慢。

根据快速宝贝值求出索引的方法是hash(Length-1 ),如果length是2的幂,

length - 1的二进制数为1的整数,其快速宝贝值由位给出,可以快速得到0 ~ length - 1的序列下标,且分布均匀。

3 .快速宝贝算法

混沌图的混沌(Object )对Object的混沌再一次快速的宝物剔除以减少冲突,而java8抛弃了java7的混沌(ObjectO ),改为前16位的压位和后16位。

5 .扩展:效率低下,线程安全性低

加载系数的默认值为0.75

java7的扩展是所有问题的根源。 当输入容量*负载因子或更高的因素时,容量会增加,新容量会增加一倍,并且仍然是2的幂。

非常容易遇到死锁问题,多线程环境下快速水桶链表形成环路,CPU达到100%

3359 coolshell.cn/articles/9606.html

潜在的安全风险

在早期版本的tomcat服务器中,get请求的参数是使用HashMap存储的。 精心设计的一系列参数,他们快速宝贝的值都相同,使HashMap退化为链表,引起DoS

6.Java8中的改进

1 .从数组链表变成了数组链表红黑树

快速宝贝桶中的元素超过8时,快速宝贝桶中的链表会变成红黑树。

2 .扩展时插入顺序的改进

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。