首页天道酬勤hashmap和list区别,hashtable是谁的子类

hashmap和list区别,hashtable是谁的子类

张世龙 05-05 19:58 115次浏览

HashMap和Hashtable有什么区别? 所有版本都是jdk1.8版本

共同点

这两者都是能够存储key/value格式数据的Map接口的实现系统,是无序的不同点

存储数据结构的差异、初始数据属性的大小的差异、扩展时间的差异、扩展计算倍数的差异、继承的父类的差异、线程安全的差异、散列值的计算方法的差异、根据散列值计算出的下标的差异以及数据的密钥或vash

HashMap由jdk1.8版中数组链表的形式组成,jdk1.8版中数组链表的红黑树结构组成。 Hashtable是JDK 1.7版和JDK 1.8版中数组链表的格式,存储数据结构不同

混叠图初始桶序列大小为16,初始负载因子loadFactor为0.75f,初始阈值threshold为12,混叠初始序列大小为11,初始负载因子loadFactor为0.75f,初始阈值threshold为8,初始阈值threshold为12

混列图的初始扩展和一个越界(threshold阈值)时的扩展,初始扩展的添加是table桶数组的空长度大小为0时的扩展,越界扩展时桶数组的长度为threshold时的扩展。 判断为Hashtable的扩展方式是正式追加数据的时候,判断为该count=threshold

HashMap :容量计算newCap=oldCap 1阈值计算newThr=oldThr 1; Hashtable :容量计算intnewcapacity=(oldcapacity1) 1; 阈值计算newCapacity * loadFactor主要是容量的计算HashMap为2倍,Hashtable为2倍,为1,3358 www.Sina.com /

Hashtable从Dictionary类继承,HashMap从AbstractMap类继承。 但是,两者都实现了Map接口。初始数据属性大小不同

HashMap :要使线程安全而不是线程安全,请执行以下操作: mapm=collections.synchronized map (new hashmap )…); Hashtable :线程安全。 线程安全的原因是方法中添加了同步限定。 但是,不建议使用ConcurrentHashMap类。扩容的时机方式不同

混洗地图

静态final { int hash (object key ) inth; 返回(key==null )? 0:(h=key.hashcode () ) ) ) ) ) ) ) ); (^ key.hashCode ) ) ^ key.hashCode ) ) 16//key的hash值异或运算key的hash值无符号向右移动16 Hashtable

int hash=key.hashCode (; //key对象直接使用实现的hash值的方法hashCode (; 混列映射这样写的好处是增加了混列值的复杂性。 如果为Hashtable,则调用对象的hashCode (用于实现方法

扩容的计算倍数不同

混洗地图

tab[I=(n-1 ) hash]//长度负1和运算key的hash值Hashtable

intindex=(hash0x7fffffff ) % tab.length; //(key的混列值和运算0x7FFFFFFF )型运算排列的长度//和0x7ffffff的目的是为了将负的混列值转换为正值。 这是因为hash值可能为负值,而在0x7ffffff之后,只有符号的外侧发生变化,前后的位分别具有不同的优点。 为了高速计算

当计算下标位置有数据时,HashMap采用尾推法,Hashtable采用头推法。

继承的父类不同

HashMap键值可以包含的null值,但集合中只有一个键为null,并且可以有多个值

Hashtable的键值不能存储为空值或原因

if(value==null ) { throw new NullPointerException ); //这里Hashtable源代码只写value因空而抛出的异常,为什么没有写key? int hash=key.hashCode (; //这是因为,如果key为null,则此处方法调用仍然抛出null指针

HashMap 和 Hashtable 的 6 个区别