【你问我答】Hashmap和Hashtable区别是什么?​

问题描述:

Hashmap和Hashtable的区别是什么?

回答有奖:

选取一位认真回答问题的牛友,赠送200牛币!
▶回答尽量有自己的思考,不要单纯的只是复制粘贴定理定义,或者他人blog哦~

你问我答问题汇总:点击进入
关注你问我答栏目:点击关注

你问我答 - 答问题,成大佬,拿牛币!
你问我答是牛客新栏目,每周1期几个面试中真实遇到的问题,
牛友在问题贴下留下自己的知识,经验与见解,
帮助更多牛友了解更多技术相关知识!
#悬赏##面试题目##Java#
全部评论
1.线程是否安全:HashMap是非线程安全的,Hashtable是线程安全的(Hashtable内部的方法基本都是用synchronized修饰的),所以HashMap的效率比Hashtable高。 2.对Null key 和Null value的支持:HashMap支持键为null,但这样的键只有一个,但是可以一个键或者多个键对应的值为null。 3.初始容量大小和每次扩充容量的大小:①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。②创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小。 4.底层数据结构:JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。
1 回复
分享
发布于 2020-07-02 13:21
1.安全性   Hashtable是线程安全,HashMap是非线程安全。HashMap的性能会高于Hashtable,我们平时使用时若无特殊需求建议使用HashMap,在多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合(Collections.synchronizedMap()实现原理是Collections定义了一个SynchronizedMap的内部类,这个类实现了Map接口,在调用方法时使用synchronized来保证线程同步   2.是否可以使用null作为key   HashMap可以使用null作为key,不过建议还是尽量避免这样使用。HashMap以null作为key时,总是存储在table数组的第一个节点上。而Hashtable则不允许null作为key   3.继承了什么,实现了什么   HashMap继承了AbstractMap,HashTable继承Dictionary抽象类,两者均实现Map接口   4.默认容量及如何扩容   HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。HashMap扩容时是当前容量翻倍即:capacity 2,Hashtable扩容时是容量翻倍+1即:capacity (2+1)   6.底层实现   HashMap和Hashtable的底层实现都是数组+链表结构实现   7.计算hash的方法不同   Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取模
点赞 回复
分享
发布于 2020-06-30 16:18
联想
校招火热招聘中
官网直投
HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点: (一) HashMap允许键和值是null,而Hashtable不允许键或者值是null。 (二) Hashtable是同步的(线程安全的),而HashMap不是同步的(线程不安全的)。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。 (三) HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。 (四) Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。一般认为Hashtable是一个遗留的类。
点赞 回复
分享
发布于 2020-07-01 15:30

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务