找工作期间不少企业都会问到有关HashMap和HashTable两者直接的区别,很多博客里虽然有提及但总是没有那么全面,只是一些常用的不同,现在就我自己所总结的比较全面的不同,归纳以下:
HashMap是Hashtable的轻量级实现(非线程安全的实现),在功能上几乎可以认为两者是一样的,它们都实现了Map接口,除了下面归纳的几点区别,主要归纳如下:

常见的几点不同:

1、HashMap不是线程安全的,效率更高一些,HashTable是线程安全的:HashTable的方法是同步的,而HashMap中的方法在缺省的情况下是非同步的,在多线程并发的环境下,可以直接使用HashTable,但是HashMap需要外步同步。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。;
(PS:sychronized意味着在一次仅有一个线程能够更改HashTable。就是说任何线程要更新HashTable时要首先获得同步锁,其它线程要等到同步锁被释放之后才能再次获得同步锁更新HashTable。)
2、HashMap是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而HashTable不允许。
3、HashMap把Hashtable中容易让人引起误解的contains方法去掉了,改成containsvalue和containsKey。
4、HashMap是Java1.2引进的Map interface的一个实现,继承自AbstractMap,HashTable继承Dictionary类。
总结:

实现原理上的几点不同:

1、哈希值的使用不同:HashMap重新计算hash值,HashTable直接使用对象的hashcode值
2、两者内部实现方式的数组的初始大小和扩容方式不同:

HashMap—-默认大小为11,增加方式为2*old+1;
HashTable—默认大小为16,以2的倍数增加

3、两者的迭代器不一致:HashMap的迭代器(Iterator)是fail-fast迭代器,而HashTable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
(PS:Fail-safe和iterator迭代器相关。如果某个集合对象创建了Iterator或者ListIterator,然后其它的线程试图“结构上”更改集合对象,将会抛出ConcurrentModificationException异常。但其它线程可以通过set()方法更改集合对象是允许的,因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改,再调用set()方法,将会抛出IllegalArgumentException异常。)

特别注意的一点是HashMap输入顺序是随机的,不按照输入顺序,要实现输入与输出顺序一致的话代码如下

HashMap<String,String>map=new LinkedHashMap<>();
---------------------
作者:sherry_unique
来源:CSDN
原文:https://blog.csdn.net/sherry_unique/article/details/53317396
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. YYModel 源码解读(二)之NSObject+YYModel.h (5)
  2. python操作mongodb之四cp数据库
  3. js注册验证
  4. hibernate3连oracle的各种坑。。
  5. 显示 png 图片
  6. 色情不是我的所有——在法律边缘起舞的 FC2
  7. MongoDB安装说明
  8. 2_Cat Years
  9. 分珠(dfs+并查集)
  10. 3409: [Usaco2009 Oct]Barn Echoes 牛棚回声
  11. DNN个性化推荐模型
  12. NVisionXR引擎基本介绍
  13. 识别手机浏览器代码【C#和JS两种语言】
  14. 【微服务No.4】 API网关组件Ocelot+Consul
  15. js的缓存
  16. Pycharm 设置上下左右快捷键
  17. JavaScript高级编程——引用类型、Array数组使用、栈方法
  18. Android 禁止屏幕旋转 &amp; 旋转屏幕时保持Activity内容
  19. 运维监控---企业级Zabbix详解_【all】
  20. c++ Dynamic Memory (part 2)

热门文章

  1. linux中ps命令的用法说明
  2. C 错误处理
  3. sql 从另外一张表查询数据存入本表. (有关联的)
  4. hdu 4372 第一类斯特林数
  5. 讲真,你是因为什么才买华为P20系列手机!
  6. poj1206(dp)
  7. MySQL5.7.18 备份、Mysqldump,mysqlpump,xtrabackup,innobackupex 全量,增量备份,数据导入导出
  8. Linux进入单用户模式
  9. Centos 7.0系统服务管理
  10. WebRTC for android ios开发官方指南