对比Hashtable,HashMap,TreeMap,谈谈对HashMap的理解
都实现了Map接口,存储的内容是基于key-value的键值对映射,一个映射不能有重复的键,一个键最多只能映射一个值。
1.初始化的时候:HashTable在不指定容量的情况下的默认容量是11,且不要求底层数组的容量一定要为2的整数次幂;HashMap默认的容量为16,且要求容量一定为2的整数次幂。
2.HashTable,HashMap具有无须特性。TreeMap是利用红黑树实现的,实现了SortMap接口,能够根据保存的键的记录进行排序。所以需要使用排序则选择TreeMap,默认为升序排序,可通过实现Comparator自定义排序方式
3.HashTable的key,value都不能为null;HashMap中的key,value可以为null,但是只有一个key为null的键值对,但是允许有多个值为null的键值对;TreeMap中当没有实现Comparator接口时,key不可以为null;当实现Comparator接口时,若未对null情况进行判断,则key不可以为null.
4.HashTable其方法函数都是同步的,因此保证了线程的安全性。因为同步的关系,在多线程环境下,当一个线程访问HashTable的同步方法时,其他线程访问同步方法就会进入阻塞状态,大大的降低了程序的运行的效率,因此被废弃,不推荐使用。
HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap,会导致数据的不一致。如果需要同步可以使用Collections的synchronizedMap方法.或者ConcurrentHashMap类,其基于lock实现锁分段技术,它不但确保多线程环境下数据访问安全性,而且性能上有长足的提升。
HashMap的总结:
HashMap基于哈希思想,实现对数据的读写。当键值对被传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,然后找到bucket位置来存储对象。当获取对象的时候,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap通过链表来解决碰撞问题,当碰撞发生时,对象将会储存在链表的下个节点中.HashMap在每个链表节点中储存键值对对象。当两个不同的键对象的hashcode相同时,它们会储存在同一个bucket位置的链表中,这时候就需要通过equals()方法来找到键值对。
最新文章
- 使用Nexus搭建Maven本地仓库
- [Python] 使用有道翻译API
- smarty缓存函数
- oracle的触发器
- 导航软件 CH Round #57 - Story of the OI Class
- CSDN 夏令营课程 项目分析
- SharePoint2013 Set Value To PeoplePicker
- Lucas,.net Web框架
- OSS web直传 ajax方式 上传图片、文件
- OOP的概念和基础特性
- migrate数据库迁移
- sringboot项目在tomcat上的部署
- .net web site 和 web application 的区别
- MVC实现加载更多
- windows环境下IP多访问
- Elixir木蚂蚁支付服务器验签名方法
- How an event flows in a pipeline Netty Internal I/O Threads (Transport Implementation)
- Kafka笔记整理(二):Kafka Java API使用
- spark sql cache时发现的空字符串问题
- Java 重写hashCode() 时为什么要用 31 来计算
热门文章
- Json格式日期转换为一般日期
- ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程
- (转)总结:JavaScript异步、事件循环与消息队列、微任务与宏任务
- 微软Insider Dev Tour 活动
- Web应用程序和网站的区别
- vs2015 生成 cordova 页面中文乱码
- SQLite Expert Professional 打开加密SQLite数据库
- C#数据导出Excel详细介绍
- WPF无边框移动窗体
- 如果您想确保Windows 10在新用户登录时不安装内置应用程序,则必须删除所有配置的应用程序。