zoukankan      html  css  js  c++  java
  • 一、基础篇--1.2Java集合-HashMap和HashTable的区别

    HashMap和HashTable的区别

    1.继承的父类不同,HashMap继承的是AbstractMap类,HashTable继承的是Dictionary类,不过都实现了Map、Clone、Serializable三个接口。其中Dictionary类中注释说是一个被废弃的类,建议实现Map接口,如下图:

     * NOTE: This class is obsolete.  New implementations should
    
     * implement the Map interface, rather than extending this class.
    

    2.HashTable key和value都不支持null,会抛出空指针异常;HashMap中key可以为null,这样的键只有这一个。

    3.线程安全不同,HashMap线程不安全,HashTable线程安全,但是性能低下不推荐。

    4.遍历方式有区别,HashMap用的是fail-fast迭代器。

    5.初始容量大小和每次扩充容量大小的不同。Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。创建时,如果给定了容量初始值,那么Hashtable会直接使用你给定的大小,而HashMap会将其扩充为2的幂次方大小。也就是说Hashtable会尽量使用素数、奇数。而HashMap则总是使用2的幂作为哈希表的大小。

    之所以会有这样的不同,是因为Hashtable和HashMap设计时的侧重点不同。Hashtable的侧重点是哈希的结果更加均匀,使得哈希冲突减少。当哈希表的大小为素数时,简单的取模哈希的结果会更加均匀。而HashMap则更加关注hash的计算效率问题。在取模计算时,如果模数是2的幂,那么我们可以直接使用位运算来得到结果,效率要大大高于做除法。HashMap为了加快hash的速度,将哈希表的大小固定为了2的幂。当然这引入了哈希分布不均匀的问题,所以HashMap为解决这问题,又对hash算法做了一些改动。这从而导致了Hashtable和HashMap的计算hash值的方法不同 。

    6.计算hash值的方法不同

    HashTable直接使用对象的HashCode,HashMap为了解决冲突比较多,计算HashCode后又进行了一些运算数据

    https://blog.csdn.net/wangxing233/article/details/79452946

  • 相关阅读:
    SDOI 2016 数字配对
    SDOI 2016 征途 决策单调性
    SDOI 2016 生成魔咒
    SDOI 2016 排列计数
    【SC主题公园杯】三个袋子 = =不动脑的后果
    【BZOJ3050】【USACO 2013 Jan Gold金组】坐座位 Seating
    MillerRabin 快速的素数概率判定法
    [POJ3189][cqbzoj1640]稳定的奶牛分配 解题报告
    最大流 isap 模板
    【POJ 1324】Holedox Moving A*宽搜
  • 原文地址:https://www.cnblogs.com/foreverYoungCoder/p/10395830.html
Copyright © 2011-2022 走看看