(一)继承的历史不同

Hashtable是继承自Dictionary类的,而HashMap则是Java 1.2引进的Map接口的一个实现。

public class Hashtable extends Dictionary implements Map
public class HashMap extends AbstractMap implements Map  

(二)安全性不同

HashMap是非synchronized,而HashTable在默认的情况下是synchronized,这意味着HashTable是线程安全的,多个线程可以共享一个HashTable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5以后提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。当然,我们可以通过以下方法让HashMap同步:

Map m = Collections.synchronizeMap(hashMap);

(三)是否可为空值的异同

HashMap可以让你将空值作为一个表条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null;而HashTable则不行,key和value都不允许出现null值。

(四)二者的遍历方式的内部实现上不同

HashTable使用Enumeration,HashMap使用Iterator,HashMap的迭代器(Iterator)是fail-fast迭代器,而HashTable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(删除或者插入一个元素,这样会影响到map的结构素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。

(五)哈希值的使用不同

  • HashTable直接使用对象的hashCode,代码是这样的。

     int hash = key.hashCode();
    int index = (hash & 0x7FFFFFFF) % tab.length;
  • 而HashMap重新计算hash值,而且用与代替求模:

     int hash = hash(k);
    int i = indexFor(hash, table.length);

(六)二者内部实现方式的数组的初始大小和扩容的方式不同

HashTable中hash数组默认大小是11,增加的方式是 old*2+1;HashMap中hash数组的默认大小是16,而且一定是2的指数。

hashmap和hashtable异同的更多相关文章

  1. List、Set、Map集合存放null解析及HashMap、Hashtable异同点解析

    1.List.Set.Map集合存放null解析: @Test public void CollectionTest() { // 测试List List<Object> list = n ...

  2. HashMap与HashTable原理及数据结构

    HashMap与HashTable原理及数据结构 hash表结构个人理解 hash表结构,以计算出的hashcode或者在hashcode基础上加工一个hash值,再通过一个散列算法 获取到对应的数组 ...

  3. HashMap和Hashtable的异同点

    HashMap和Hashtable的异同点 不同点: 1.HashMap的父类是AbstractMap,而Hashtable的父类是Dictiionary: 2.HashMap的key和value可以 ...

  4. Java集合——HashMap、HashTable以及ConCurrentHashMap异同比较

    0. 前言 HashMap和HashTable的区别一种比较简单的回答是: (1)HashMap是非线程安全的,HashTable是线程安全的. (2)HashMap的键和值都允许有null存在,而H ...

  5. HashMap,HashTable,ConcurrentHashMap异同比较

    0. 前言 HashMap和HashTable的区别一种比较简单的回答是: (1)HashMap是非线程安全的,HashTable是线程安全的. (2)HashMap的键和值都允许有null存在,而H ...

  6. java源码之HashMap和HashTable的异同

    代码版本 JDK每一版本都在改进.本文讨论的HashMap和HashTable基于JDK 1.7.0_67 1. 时间 HashTable产生于JDK 1.1,而HashMap产生于JDK 1.2.从 ...

  7. ArrayList,Vector,HashMap,HashSet,HashTable之间的区别与联系

    在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...

  8. Java集合详解4:一文读懂HashMap和HashTable的区别以及常见面试题

    <Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...

  9. LinkedList,ArrayList,Vector,HashMap,HashSet,HashTable之间的区别与联系

    在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...

随机推荐

  1. 携程Apollo配置中心架构深度剖析

    转自:http://www.uml.org.cn/wfw/201808153.asp 一.介绍 Apollo(阿波罗)[参考附录]是携程框架部研发并开源的一款生产级的配置中心产品,它能够集中管理应用在 ...

  2. java基础知识点罗列

    1:Java泛型 2:clone Java中的深拷贝(深复制)和浅拷贝(浅复制)   Java中对Clone的理解  序列化和反序列化的概念 3:Java中有关Null的9件事

  3. [转帖]UEFI和BIOS

    UEFI和Legacy及UEFI+Legacy启动的区别 https://www.cnblogs.com/net5x/p/6850801.html 一直给人装系统 但是连这些最基本的都不知道 感觉自己 ...

  4. [读书笔记]Linux命令行与shell编程读书笔记03 文件系统等

    1. 文件系统的种类 ext ext2 ext3 ext4 JFS XFS 其中ext3 开始支持journal日志模式 与raid卡类似 有 数据模式  排序模式 以及回写模式 数据模式最安全 回写 ...

  5. AXI4

    axis  AXI4-stream 去掉了地址项,允许无限制的数据突发传输规模: 摘自http://xilinx.eetrend.com/blog/11443

  6. python 抽象类与接口类

    几个类 实现的方法都一致的话 就继承同一个父类 在父类写一个公共方法 给子类使用

  7. 洛谷P4088 [USACO18FEB]Slingshot

    题面 大意:给出n个弹弓,可以用ti的时间把xi位置运到yi,在给出m组询问,求xj到yj最小时间. sol:首先如果不用弹弓,时间应为abs(xj-yj).否则时间就是abs(xi-xj)+abs( ...

  8. tomcat 查看和修改内存

    为了解决tomcat在大进行大并发请求时,出现内存溢出的问题,请修改tomcat的内存大小,其中分为以下两种方式: 一.使用 catalina.bat 等命令行方式运行的 tomcat 查看系统最大支 ...

  9. BZOJ3091城市旅行——LCT区间信息合并

    题目描述 输入 输出 样例输入 4 5 1 3 2 5 1 2 1 3 2 4 4 2 4 1 2 4 2 3 4 3 1 4 1 4 1 4 样例输出 16/3 6/1 提示 对于所有数据满足 1& ...

  10. BZOJ5101[POI2018]Powódź——并查集

    题目描述 在地面上有一个水箱,它的俯视图被划分成了n行m列个方格,相邻两个方格之间有一堵厚度可以忽略不计的墙,水 箱与外界之间有一堵高度无穷大的墙,因此水不可能漏到外面.已知水箱内每个格子的高度都是[ ...