当前位置: 首页 > 编程日记 > 正文

HashMap 和 Hashtable 的 6 个区别,最后一个没几个人知道!

HashMap 和 Hashtable 是 Java 开发程序员必须要掌握的,也是在各种 Java 面试场合中必须会问到的。

但你对这两者的区别了解有多少呢?

现在,栈长我给大家总结一下,或许有你不明朗的地方,在栈长的指点下都会拨开迷雾见晴天。

1、线程安全

Hashtable 是线程安全的,HashMap 不是线程安全的。

为什么说 HashTable 是线程安全的?

来看下 Hashtable 的源码,Hashtable 所有的元素操作都是 synchronized 修饰的,而 HashMap 并没有。

public synchronized V put(K key, V value);
public synchronized V get(Object key);
...

2、性能优劣

既然 Hashtable 是线程安全的,每个方法都要阻塞其他线程,所以 Hashtable 性能较差,HashMap 性能较好,使用更广。

如果要线程安全又要保证性能,建议使用 JUC 包下的 ConcurrentHashMap。

3、NULL

Hashtable 是不允许键或值为 null 的,HashMap 的键值则都可以为 null。

那么问题来了,为什么 Hashtable 是不允许 KEY 和 VALUE 为 null, 而 HashMap 则可以?

Hashtable put 方法逻辑:

 public synchronized V put(K key, V value) {// Make sure the value is not nullif (value == null) {throw new NullPointerException();}// Makes sure the key is not already in the hashtable.Entry<?,?> tab[] = table;int hash = key.hashCode();...}        

HashMap hash 方法逻辑:

static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

可以看出 Hashtable key 为 null 会直接抛出空指针异常,value 为 null 手动抛出空指针异常,而 HashMap 的逻辑对 null 作了特殊处理。

4、实现方式

Hashtable 的继承源码:

public class Hashtable<K,V>extends Dictionary<K,V>implements Map<K,V>, Cloneable, java.io.Serializable

HashMap 的继承源码:

public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable

可以看出两者继承的类不一样,Hashtable 继承了 Dictionary类,而 HashMap 继承的是 AbstractMap 类。

Dictionary 是 JDK 1.0 添加的,貌似没人用过这个,栈长我也没用过。。

5、容量扩容

HashMap 的初始容量为:16,Hashtable 初始容量为:11,两者的负载因子默认都是:0.75。

/*** Constructs a new, empty hashtable with a default initial capacity (11)* and load factor (0.75).*/
public Hashtable() {this(11, 0.75f);
}/*** Constructs an empty <tt>HashMap</tt> with the default initial capacity* (16) and the default load factor (0.75).*/
public HashMap() {this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}

当现有容量大于总容量 * 负载因子时,HashMap 扩容规则为当前容量翻倍,Hashtable 扩容规则为当前容量翻倍 + 1。

6、迭代器

HashMap 中的 Iterator 迭代器是 fail-fast 的,而 Hashtable 的 Enumerator 不是 fail-fast 的。

所以,当其他线程改变了HashMap 的结构,如:增加、删除元素,将会抛出 ConcurrentModificationException 异常,而 Hashtable 则不会。

可以来看下这个区别的演示:

/**
* 微信公众号:Java技术栈
**/
public static void main(String[] args) {Map<String, String> hashtable = new Hashtable<>();hashtable.put("t1", "1");hashtable.put("t2", "2");hashtable.put("t3", "3");Enumeration<Map.Entry<String, String>> iterator1 = (Enumeration<Map.Entry<String, String>>) hashtable.entrySet().iterator();hashtable.remove(iterator1.nextElement().getKey());while (iterator1.hasMoreElements()) {System.out.println(iterator1.nextElement());}Map<String, String> hashMap = new HashMap<>();hashMap.put("h1", "1");hashMap.put("h2", "2");hashMap.put("h3", "3");Iterator<Map.Entry<String, String>> iterator2 = hashMap.entrySet().iterator();hashMap.remove(iterator2.next().getKey());while (iterator2.hasNext()) {System.out.println(iterator2.next());}}

输出信息:

t2=2
t1=1
Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)at java.util.HashMap$EntryIterator.next(HashMap.java:1476)at java.util.HashMap$EntryIterator.next(HashMap.java:1474)at cn.javastack.Test.main(Test.java:37)

看到了吧?

所以,这条同样也是 Enumeration 和 Iterator 的区别。

最后一点有几个人知道?知道的给栈长点个赞回应一下,不知道的有收获的也点一个赞支持一下吧。

有收获?转发给更多的人吧!

本文原创首发于微信公众号:Java技术栈(id:javastack),关注公众号在后台回复 "java" 可获取更多,转载请原样保留本信息。

转载于:https://www.cnblogs.com/javastack/p/10068985.html

相关文章:

自学笔记——Python内置的处理字符串的函数

序号函数描述1capitalize() 字符串的首字母变为大写2center&#xff08;width, fillchar&#xff09; 返回原来的字符串&#xff08;居中&#xff09;&#xff0c;并以空格填充至特定长度的字符串3count( str ,beg 0, end len(string) )计算出str在字符串中出现的字数&#x…

办公室28个经典赞美句子【转】

1.you look great today.&#xff08;你今天看上去很棒。&#xff09;【每天都可以用&#xff01;】2. you did a good job. &#xff08;你干得非常好。&#xff09;【国际最通用的表扬&#xff01;】3. we’re so proud of you.&#xff08;我们十分为你骄傲。&#xff09;【…

[源码和文档分享]基于java 的仿QQ聊天工具

一 需求分析 本系统是基于java开发的聊天室。有用户注册、用户登陆、修改密码、忘记密码、添加好友、用户聊天、群聊功能。如果服务器还没有启动&#xff0c;则客户端是不可以登陆、注册、忘记密码&#xff0c;如果在运行过程中&#xff0c;服务器断开则系统会有提示&#xff0…

错误: 编码 GBK 的不可映射字符 (0x80)

在我想要在命令行使用println输出一些中文的时候&#xff0c;发现编码出现错误 原因&#xff1a; java程序在编译的时候&#xff0c;需要使用JDK开发工具包中的JAVAC.EXE命令&#xff0c;而JDK开发工具包是国际版的&#xff0c;默认格式为UNICODE的编码格式。因此在默认情况下&…

HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)

传送门 Description 急&#xff01;灾区的食物依然短缺&#xff01;为了挽救灾区同胞的生命&#xff0c;心系灾区同胞的你准备自己采购一些粮食支援灾区&#xff0c;现在假设你一共有资金n元&#xff0c;而市场有m种大米&#xff0c;每种大米都是袋装产品&#xff0c;其价格不等…

A simple class to play sound on netcf (part 2)

在实际测试中发现上一片文章&#xff08;A simple class to play sound on netcf&#xff09;中介绍的播放声音的类在pda中运行正常&#xff0c;但却无法在pc中工作&#xff0c;简单分析了一下原因&#xff0c;发现是dll的问题&#xff0c;pc和pda播放声音时用的dll不同。pc中是…

SSL证书可以给多个域名使用吗?

欢迎访问网易云社区&#xff0c;了解更多网易技术产品运营经验从信任等级的角度来说&#xff0c;SSL证书主要分为三类&#xff1a;1.域名型https证书&#xff08;DVSSL&#xff09;:信任等级一般&#xff0c;只需验证网站的真实性便可颁发证书保护网站&#xff1b;2. 企业型htt…

ASP.NET性能调整之解决Server Too Busy错误

最近公司的一个ASP.NET站点频繁出现Server Too Busy错误&#xff0c;具体表现为页面响应慢、经常出现Server Too Busy异常&#xff1b;但实际上服务器的资源消耗却很低&#xff0c;CPU使用只有10%左右&#xff0c;非常奇怪。 该站点运行环境为Windows 2000&#xff0c;IIS5.0&a…

IDEA 格式化代码Reform Code快捷键无效

** 看着用起来这么舒服的IDEA快捷键&#xff0c;突然CtrlAltL怎么按都没有反应&#xff0c;瞬间就不香了** 不行&#xff0c;我要搞一下 解决办法 快捷键冲突 一边学习IDEA&#xff0c;一遍你听歌多舒服啊&#xff0c;就是这个东西——“”“网易云音乐&#xff08;当然或者其他…

ajax方法参数

jquery中的ajax方法参数总是记不住&#xff0c;这里记录一下。 1.url: 要求为String类型的参数&#xff0c;&#xff08;默认为当前页地址&#xff09;发送请求的地址。 2.type: 要求为String类型的参数&#xff0c;请求方式&#xff08;post或get&#xff09;默认为get。注意其…

“解决方案资源管理器”中不能自动选择正在编辑的文档

本来正在编辑的文档应该在“解决方案资源管理器”中自动选中的&#xff0c;但是我的VS2005机器好像没有这个功能&#xff0c;后来发现 “工具->选贤”里边的“项目和解决方案->常规”里边有一项“在解决方案资源管理器中跟踪活动项”&#xff0c;选中后问题解决。VS2003也…

打造属于自己的underscore系列 ( 一 )

underscore作为开发中比较常用的一个javascript工具库&#xff0c;提供了一套丰富的函数式编程功能&#xff0c;该库并没有拓展原有的javascript原生对象&#xff0c;而是在自定义的_对象上&#xff0c;提供了100多个方法函数。在这个系列中&#xff0c;将从uderscore源码角度&…

Java案例——字符串拼接

Java案例——字符串拼接案例 1.案例需求 定义一个方法&#xff0c;把int数组中的数据按照指定的格式拼接成一个字符串返回&#xff0c;调用该方法&#xff0c;并在控制台输出结果 例如&#xff0c;数字为int[] arr {1,2,3};执行方法后的输出结果为&#xff1a;[1,2,3] 2.思路…

SQL同时删除两张表中的数据

DELETE user,orders from user,orders where user.idorders.user_id AND user.id#{id}; 转载于:https://www.cnblogs.com/duneF/p/7196472.html

安全与用户输入

用户数据&#xff0c;就是任何种类的输入&#xff08;来自于 Web 请求或者 URL 中的数据&#xff0c;输入在 Microsoft Windows 窗体应用程序的控件中的数据&#xff0c;等等&#xff09;&#xff0c;它能够对代码产生影响&#xff0c;因为这些数据经常被直接当成参数来使用并且…

谁能搞定中国的文艺复兴,我就能搞定中国的政治改革

文化--------------经济------------------政治转载于:https://blog.51cto.com/73945/12249

构造函数以及this

实际上构造函数与普通的函数并没有区别&#xff0c;所以一般在开发中会使用大驼峰命名规则来区别普通的函数&#xff0c;构造函数实际上是通过返回一个this值来完成构造函数的创建的. 这个rutern this的操作由new这个操作符来完成&#xff0c;当然个人也可以手动来设置return的…

java案例——字符串反转

java案例——字符串反转 1.需求&#xff1a; 定义一个方法&#xff0c;实现字符串反转。键盘录入一个字符串&#xff0c;调用该方法后&#xff0c;在控制台输出结果 例如&#xff0c;键盘录入abc,输出结果cba2.思路&#xff1a; 1.键盘录入一个字符串&#xff0c;用Scanner实…

Jetson tk1 安装 CUDA,ROS,OpenCV和kinect2以及刷机以及ssh远程控制

我的jetson tk1的系统是&#xff1a;LTR21.3&#xff0c;ubuntu14.04。本文仅仅是个人总结&#xff0c;亲测成功。 注意&#xff1a;如果你是使用校园网进行安装的话&#xff0c;有很多源是没办法访问的&#xff0c;安装的时候就会出现很多问题&#xff0c;所以&#xff0c;尽量…

Refactor!™ for ASP.NET--ASP.NET代码重构插件

Teaching Demo: http://www.devexpress.com/Products/NET/IDETools/CodeRush/Training.xml有些功能在JBuilder2005中早就有了。大家了解一下吧&#xff0c;比较不错。Refactor! is freely available to all ASP.NET 2.0 developers and offers a comprehensive suite of tools …

面向对象的程序开发技术C++教学课件系列之四

面向对象的程序开发技术C教学课件系列之四转载于:https://blog.51cto.com/hnxdd/13205

python自动华 (十四)

Python自动化 【第十四篇】&#xff1a;HTML介绍 本节内容&#xff1a; Html概述HTML文档常用标签2. CSS 概述CSS选择器CSS常用属性1.HTML 1.1概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写&#xff0c;他是一种制作万维网页面标准语言&#xff08;标记&a…

一些有趣的题目(java)持续更新

有趣的编程题1.面试题2.某公司面试题1.面试题 此处为正确的代码 package Java.king01.Test;class MicrosoftTest {public static void main(String[] args) {int[] arr new int[]{12,3,3,34,56,78,432};for(int i arr.length - 1;i > 0;i--){arr[i] arr[i]/arr[0];}for(…

lunix开放端口

以mysql服的3306端口为例。 1、直接打开端口&#xff1a;iptables -I INPUT -p tcp --dport 3306 -j ACCEPT 2、永久打开某端口首先&#xff0c;用vim打开防火墙配置文件&#xff1a;vim /etc/sysconfig/iptables然后&#xff0c;在iptables文件内容中加入如下内容:-A RH-Firew…

开机运行记事本怎么回事

1.删除文件%SystemRoot%\system32\wincfgs.exe%SystemRoot%\KB20060111.exe2.清除移动存储设备病毒连接好usb设备后&#xff0c;打开我的电脑&#xff0c;点击右键选择打开&#xff08;不要直接打开或点“open”&#xff09;&#xff0c;然后打开菜单栏的“工具--文件夹选项--查…

IDEA快捷键及基本使用方法

IDEA常用设置一级目录快捷键导包&#xff1a;自动导包设置开启自动编译按住Ctrl之后滑动鼠标滚轮可以实现代码自由缩放一级目录 快捷键 导包&#xff1a; 1.手动导包 import java.util.Scanner; 2. 快捷键导包 Alt Enter 3.自动导包快捷键功能CtrlD复制光标所在行到下一行…

php 前台生成多维数组 后台批量添加

同一个地方绊倒两次&#xff0c;记录一下哈 1&#xff09;前台表单&#xff0c;看 name 1 <div class"tab-pane row " id"tab-1" >2 <input type"hidden" name"data[1][Type]" value class"form-control" id&q…

plsql循环语句

循环结构有loop。。end&#xff0c;while和for循环 loop基本结构 LOOP 要执行的语句; EXIT WHEN <条件语句> /*条件满足&#xff0c;退出循环语句*/ END LOOP; declare int number(4) : 1;begin loop dbms_output.put_line(我是||int|||); int : int 1; exit when int …

净空法师认为忧郁症源于缺乏伦理教育和因果教育

昨天上海的几个豆瓣佛友聚会&#xff0c;大家谈到了忧郁症的问题。   净空老法师是从教育和预防的角度讲的&#xff0c;大家的看法如何。     下面是老法师开示的连接     http://www.360doc.com/showWeb/0/0/393089.aspx 转载于:https://www.cnblogs.com/chenge/arc…

C语言博客作业04--数组

1.本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 关于数组&#xff0c;数组是最基本的构造类型&#xff0c;它是一组相同类型数据的有序组合。数组中的元素在内存中连续存放&#xff0c;每个元素都属于相同的数据类型&#xff0c;用数组名和下表…