zoukankan      html  css  js  c++  java
  • HashMap和HashTable本质性的区别

    一,HashMap

    1、HashMap是键值对key-value形式双列集合。它的底层存储原理是哈希表。

    2、对应HashMap采用哈希表存储键值对元素的方式。

    HashMap.put(key,value)方法的注意点:

    (1)没有synchronized关键字修饰,意味着它是非线程安全的。

    public V put(K key, V value) {
    return putVal(hash(key), key, value, false, true);
    }

     (2)key和value可以是null-null、null-value、key-null的形式。如果Map中不存在将要添加的元素那么返

    回值为null,如果已经存在且value不为null,那么新value覆盖旧value,返回旧value,如果旧value为null,

    那么将新value和key形成一个key-value映射,并返回null。key为null的时候,null也是一个键,键具有唯

    一性,value可以重复。

    3、HashMap的resize()方法理解

    这个方法时HashMap容量不够时进行扩容的方法,觉得有必要说一下。

    当HashMap的容量不够用时,再往容器中添加元素时,HashMap会进行扩容操作。当HashMap的容量为最大的

    时,则不扩容,但是容器阈值会设置为Integer类型的最大值。当不是最大的时,容器会进行扩容,容量会变为

    原来的二倍(此时也不大于最大容量),并且阈值也会随之变化,变为原阈值的二倍。扩容就是在堆中新

    创建一个HashMap容器,然后将原来就的HashMap中的元素放到新容器中,放置的时候会重新计算每个Node节

    点在哈希表中的位置。

    4、HashMap的构造

    我们常用的都是空参构造。空参构造一个HashMap,那么它的构造方法使用的是默认的初始化容量10和

    加载因子0.5。

    HashMap是非线程安全的,是因为HashMap的方法都是没有用synchronized关键字修饰的。

    二,HashTable

    1、Hashtable的方法几乎都是同步的,都有synchronized关键字修饰,因此和HashMap相比,它是线程安全的。

    2、Hashtable中key-value的映射,key和value 都是不允许为null的,如果为null了呢?对不起,空指针异常抛出。

    3、Hashtable在计算节点元素在哈希表中的位置使用的算法稍有区别,它有它的好处,但和HashMap的算法比

    起来明显性能低一些。
    三,HashMap和Hashtable有哪些主要区别呢?

    1、HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。

    2、Hashtable比HashMap多提供了elments() 和contains() 两个方法。

    3、HashMap的key-value支持key-value,null-null,key-null,null-value四种。而Hashtable只支持key-value一种(即

    key和value都不为null这种形式)。既然HashMap支持带有null的形式,那么在HashMap中不能由get()方法来判断

    HashMap中是否存在某个键, 而应该用containsKey()方法来判断,因为使用get的时候,当返回null时,你无法判断到底

    是不存在这个key,还是这个key就是null,还是key存在但value是null。

    4、线程安全性不同,HashMap的方法都没有使用synchronized关键字修饰,都是非线程安全的,而Hashtable的方法几乎

    都是被synchronized关键字修饰的。但是,当我们需要HashMap是线程安全的时,怎么办呢?我们可以通过Collections.synchronizedMap(hashMap)来进行处理,亦或者我们使用线程安全的ConcurrentHashMap。ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。

    5、初始容量大小和每次扩充容量大小的不同 

    6、计算hash值的方法不同 
    为了得到元素的位置,首先需要根据元素的 KEY计算出一个hash值,然后再用这个hash值来计算得到最终的位置。

    Hashtable直接使用对象的hashCode。hashCode是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值。然后再使用除留余数发来获得最终的位置。 

  • 相关阅读:
    windows的80端口被占用时的处理方法
    Ansible自动化运维工具安装与使用实例
    Tomcat的测试网页换成自己项目首页
    LeetCode 219. Contains Duplicate II
    LeetCode Contest 177
    LeetCode 217. Contains Duplicate
    LeetCode 216. Combination Sum III(DFS)
    LeetCode 215. Kth Largest Element in an Array(排序)
    Contest 176 LeetCode 1354. Construct Target Array With Multiple Sums(优先队列,递推)
    Contest 176
  • 原文地址:https://www.cnblogs.com/xcn123/p/10905133.html
Copyright © 2011-2022 走看看