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,则转换为链表存储。