首页 > 编程知识 正文

hashmap是什么,hashtable底层实现原理

时间:2023-05-04 14:18:21 阅读:133026 作者:3377

1.两者父类不同

HashMap由AbstractMap类继承,Hashtable由Dictionary类继承,但实现了map、Coneable和Serializable接口。2.对外提供的接口不同

Hashtable往往比HashMap提供elements ()和contains () )两种方法。

elements ) )方法从Hashtable的父类Dictionary继承,elements ) )方法用于返回此Hashtable的value枚举值。

contains (方法确定是否包含传递给该Hashtable的value,其角色与containsValue )匹配。 实际上,containsValue ) )只是调用了contains ) )方法。3.对null的支持不同

hashtable :密钥和值都不能为null。

HashMap:key可以为null,但只有一个这样的key。 必须保证key的唯一性,多个key的值可以为null。4.线程安全性不同

HashMap是非线程安全的,在多线程并发环境中可能会出现死锁问题。

Hashtable是线程安全的,所有方法都使用同步关键字,因此可以在多线程场景中使用。

HashMap是非线程安全的,但比Hashtable运行更高效。 大多数单线程场景都需要使用HashMap。 如果需要多线程操作,也可以使用线程安全的ConcurrentHashMap。

ConcurrentHashMap是线程安全的,但比Hashtable更高效。 因为ConcurrentHashMap的基础使用分段锁定,而没有锁定整个数据。5初始容量和扩容机制不同

HashMap的默认初始容量为16,如果需要增加容量,则以两倍的容量进行扩展。

Hashtable的默认初始容量为11,需要扩展时以1倍的容量进行扩展。6.计算hash值的方法不同

混列映射的混列值计算:

1 .重新计算哈希值

静态final { int hash (object key ) inth; 返回(key==null )? 0:(h=key.hashcode () ) ) ) ) ) ) ) ); (2.散列坐标计算

finalvputval(inthash,K key,V value,boolean onlyIfAbsent,boolean evict ) { NodeK,V[] tab; NodeK,V p; int n,I; if () tab=table )==null||(n=tab.Length )=0) n=(tab=resize ) ).length; if () p=tab[I=(n-1 ) hash] )==null ) /省略以下代码: 请注意上面一行中Hashtable的hash值的计算。

publicsynchronizedvput(kkey,vvalue (//makesurethevalueisnotnullif ) value==null ) ) { throw new NullPointerException //makessurethekeyisnotalreadyinthehashtable.entry? tab[]=选项卡; int hash=key.hashCode (; intindex=(hash0x7fffffff ) % tab.length; //注意这里//省略下面的代码,注意上面的行}

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