Hashtable和HashSet的区别

作者博客@Stone原地址

HashMap和Hashtable都实现了Map接口 但决定用哪一个之前先要弄清楚它们之间的分别

  • 主要的是线程安全性,同步(synchronization),以及速度

区别

  • HashMap是非synchronized的,并可以接受null (HashMap可以接受为null的键值(key)值(value),而Hashtable则不行)。

  • HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;

  • 而HashMap如果没有正确的同步的话,多个线程是不能共享HashMap的

  • 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。

重要的说一下他们存储空值出现的问题

  • Hashtable中,key和value都不允许出现null值。但是如果在Hashtable中有添加空值得操作,编译是会通过,但是在运行的时候就会,抛出NullPointerException异常,这是JDK的规范规定的。
  • HashMap中,null可以作为键,但是null的key键只能有一个

    • 而这个时候要注意,不能用get()方法,来判断 HashMap中是否存在某个键, 而应该用containsKey()方法来判断
  • 他们哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

    • hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
    • 而HashMap重新计算了key的hash值 (!这里我也不知道对不对)

内部实现使用的数组初始化不同

  • HashTable在不指定容量的情况下的默认容量为11,而HashMap为16

如何让HashMap 安全列?

  • 最好,也是最常用的是,让HashMap的线程安全,那就给它加死锁(同步)

思维导图如下(作者博客@Stone原地址):

enter description here

猜你喜欢

转载自blog.csdn.net/qq_36595006/article/details/78766966