• HashMap和HashTable的区别


    HashMap是一个散列桶(数组和链表),它存储的内容是键值对。

    HashMap采用的是数组和链表的数据结构,继承了数组的线性查询和链表的寻址修改

    HashMap是非synchronized,所以HashMap很快

    HashMap可以接收null键和值,而HashTable则不能(原因:equlas()方法需要对象,因为HashMap是后出的API经过处理才可以)

    既然HashMap支持带有null的形式,那么在HashMap中不能由get()方法来判断
    HashMap中是否存在某个键, 而应该用containsKey()方法来判断,因为使用get的时候,当返回null时,你无法判断到底
    是不存在这个key,还是这个key就是null,还是key存在但value是null。

    put()get()方法

    以下是具体的put过程(JDK1.8版)

    1、对Key求Hash值,然后再计算下标

    2、如果没有碰撞,直接放入桶中(碰撞的意思是计算得到的Hash值相同,需要放到同一个bucket中)

    3、如果碰撞了,以链表的方式链接到后面

    4、如果链表长度超过阀值( TREEIFY THRESHOLD==8),就把链表转成红黑树,链表长度低于6,就把红黑树转回链表

    5、如果节点已经存在就替换旧值

    6、如果桶满了(容量16*加载因子0.75),就需要 resize(扩容2倍后重排)

    以下是具体get过程(考虑特殊情况如果两个键的hashcode相同,你如何获取值对象?)

    当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,

    找到bucket位置之后,会调用keys.equals()方法去找到链表中正确的节点,最终找到要找的值对象。

    HashMap的原理:

    HashMap是基于hashing的原理,通过put()/get()方法来存储/获取HashMap中的对象

    当调用put()方法时,先对键调用hashCode()方法,计算并返回的hashCode是用于找到Map数组的bucket位置来存储Node对象。

      

    HashMap和HashTable的区别

    1、Hashtable是线程安全的,方法是Synchronized的,适合在多线程环境中使用,效率低;

      HashMap不是线程安全的,方法不是Synchronized的,效率高。

    但是,当我们需要HashMap是线程安全的时,怎么办呢?

    我们可以通过Collections.synchronizedMap(hashMap)来进行处理,亦或者我们使用线程安全的ConcurrentHashMap。

    ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。

    因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。

    2、HashMap的key和value都可以为null值,HashTable的key和value都不允许null值

    3、HashMap中数组的默认大小是16,而且一定是2的倍数,扩容后的数组长度是之前数组长度的2倍

      HashTable中数组默认大小是11,扩容后的数组长度是之前数组长度的2倍+1

    4、HashMap和HashTable都可以使用Iterator遍历,后者还可以通过Enumeration遍历

    5、HashTable直接使用对象的hashCode,而HashMap则需要重新计算hash值

    Hashtable在计算元素的位置时需要进行一次除法运算,而除法运算是比较耗时的。 
    HashMap为了提高计算效率,将哈希表的大小固定为了2次幂,这样在取模预算时,不需要做除法,只需要做位运算。位运算比除法的效率要高很多。

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

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

  • 相关阅读:
    vertical blank interrupt 和 horizontal blank interrupt解释
    X server和windows manager的关系
    Kconfig中的select和depends on
    Debugging the kernel using Ftrace part 3
    Kernel: printk's no_console_suspend
    sql分割函数|在网上找的看着挺好,谁的忘了
    Ajax处理函数模板
    新闻添加html页面
    页码控件源码|分页页码控件源码
    谷歌本地商户中心 |谷歌本地商户中心 介绍|谷歌本地商户中心 网址
  • 原文地址:https://www.cnblogs.com/wdss/p/11123059.html
Copyright © 2020-2023  润新知