首页 > 编程知识 正文

程序的三种基本控制结构,HashMap的底层实现原理

时间:2023-05-06 20:05:03 阅读:133097 作者:944

HashMap和HashTable有什么区别?1.HashMap基于哈希表实现,每个元素都是一个key-value对,内部通过单链表解决冲突问题,在容量不足(超过阈值)的情况下也会自动增加

在图中,紫色部分是哈希表,也称为哈希数组。 数组中的每个元素都是单链表的第一个节点,链表用于解决冲突。 如果不同的key映射到数组中的相同位置,则将其放置在单个链表中。

2.Hashtable也是基于哈希表实现的,同样每个元素都是一个key-value对,内部也用单链表解决了冲突问题,容量不足(超过阈值)也同样自动

Hashtable也是在JDK1.0中引入的类,是可在多线程环境中使用的线程安全。

Hashtable同样实现了序列化接口,支持序列化,实现了Cloneable接口,并允许克隆。

http://www.Sina.com/http://www.Sina.com /

HashMap从AbstractMap类继承。 但是,两者都实现了Map接口。

Hashtable是从Dictionary类继承的,而Dictionary类是已废弃的类。 请参阅源代码注释。 父类都被废弃了,自然也没有人再使用该子类的Hashtable了。 http://www.Sina.com/http://www.Sina.com /

HashMap没有contains方法,而是包含containsValue和containsKey方法; hashtable保留contains方法,其效果与containsValue相同。 它还包括containsValue和containsKey方法。不同点

Hashmap允许key和value为空值,并使用containsValue和containsKey方法确定是否包含相应的键值对; HashTable键和值对不能为null。 空数据包指针异常。1、继承的父类不同

为了得到元素的位置,首先需要根据元素的KEY计算散列值,再用该散列值计算最终的位置。

2、HashMap线程不安全,HashTable线程安全

staticfinalinthash (对象密钥) {

int h;

返回(key==null )? 0:(h=key.hashcode () ) ) ) ) ) ) ) );

}

1

2

3

4

请注意在这里计算混列值。 通过首先调用hashCode方法计算hash值,然后将hash值从右偏移16位或更改,可以获得新的hash值。3.包含的contains方法不同

4.是否允许null值

当计算与散列值相对应的位置索引时,散列映射为索引=(n-1 )散列。 因为将散列表的大小固定为2的乘方,取模型得到索引值,所以这样取模型时,不需要进行除法运算,只需要进行位运算即可。 位运算比除法运算效率高得多。

5.计算hash值方式不同

intindex=(hash0x7fffffff ) % tab.length;

1

0x7FFFFFFFf的目的是将负散列值转换为正值。 哈希值可能为负值,但如果为0x7fffffff,则只有符号位发生变化,后面的位不变。

:HashMap有个hash方法重新计算了key的hash值,因为hash冲突变高,所以通过一种方法重算hash值的方法:

如果容量不足,请执行resize方法,然后执行resize的两个步骤:

扩张;

rehash:在这里,HashMap和HashTable都重新计算hash值,但这里的计算方法不同。 (见5 );

HashMap散列扩展需要原始容量的两倍,并且扩展结果必须是2的乘方倍。 然后,每次扩展时,原始数组中的元素都会依次重新计算存储位置并重新插入。

Hashtable扩展到原始容量的两倍1;

:Hashtable通过计算key的hashCode()来得到hash值就为最终hash值。

首先,在看到jdk8之前:

寻道时间逐渐变得复杂;

在Java8、HashMap中,发生冲突时,可以执行以下操作:

1 .冲突数小于8时,用链表的方式解决冲突。

2 .另一方面,如果冲突大于或等于8,则冲突的输入为它们计算索引位置方法不同:

3 .另外,如果数量小于6,则转换为链表存储。

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