前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hashtable、HashMap、TreeMap辨析

Hashtable、HashMap、TreeMap辨析

作者头像
葆宁
发布2019-04-18 15:32:01
3650
发布2019-04-18 15:32:01
举报
文章被收录于专栏:FREE SOLOFREE SOLO

Hashtable、HashMap、TreeMap 都是最常见的一些 Map 实现,是以键值对的形式存储和操作数据的容器类型。

同步意味着在一个时间点只能有一个线程可以修改hash表,任何线程在执行HashTable的更新操作前都需要获取对象锁,其他线程需要等带锁的释放。

三者均实现了Map接口,存储的内容是基于key-value的键值对映射,一个映射不能有重复的键,一个键最多只能映射一个值。

(1) 元素特性

HashTable中的key、value都不能为null;HashMap中的key、value可以为null,很显然只 能有一个key为null的键值对,但是允许有多个值为null的键值对;TreeMap中当未实现 Co mparator 接口时,key 不可以为null;当实现 Comparator 接口时,若未对null情况进行判 断,则key不可以为null,反之亦然。

(2)顺序特性

HashTable、HashMap具有无序特性。TreeMap是利用红黑树来实现的(树中的每个节点的值,都会大于或等于它的左子树种的所有节点的值,并且小于或等于它的右子树中的所有节点的值),实现了SortMap接口,能够对保存的记录根据键进行排序。所以一般需要排序的情况下是选择TreeMap来进行,默认为升序排序方式(深度优先搜索),可自定义实现Comparator接口实现排序方式。

(3)初始化与增长方式

初始化时:HashTable在不指定容量的情况下的默认容量为11,且不要求底层数组的容量一 定要为2的整数次幂;HashMap默认容量为16,且要求容量一定为2的整数次幂。 扩容时:Hashtable将容量变为原来的2倍加1;HashMap扩容将容量变为原来的2倍。

(4)线程安全性

HashTable其方法函数都是同步的(采用synchronized修饰),不会出现两个线程同时对数 据进行操作的情况,因此保证了线程安全性。也正因为如此,在多线程运行环境下效率表现非常低下。因为当一个线程访问HashTable的同步方法时,其他线程也访问同步方法就会进入阻塞状态。比如当一个线程在添加数据时候,另外一个线程即使执行获取其他数据的操作 也必须被阻塞,大大降低了程序的运行效率,在新版本中已被废弃,不推荐使用。 HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据 的不一致。如果需要同步(1)可以用 Collections的synchronizedMap方法;(2)使用Co ncurrentHashMap类,相较于HashTable锁住的是对象整体, ConcurrentHashMap基于lo ck实现锁分段技术。首先将Map存放的数据分成一段一段的存储方式,然后给每一段数据分配一把锁,当一个线程占用锁访问其中一个段的数据时,其他段的数据也能被其他线程访问。ConcurrentHashMap不仅保证了多线程运行环境下的数据访问安全性,而且性能上有长足的提升。

(5)一段话HashMap

HashMap基于哈希思想,实现对数据的读写。当我们将键值对传递给put()方法时,它调用 键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对 象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表 来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个 链表节点中储存键值对对象。当两个不同的键对象的hashcode相同时,它们会储存在同一个 bucket位置的链表中,可通过键对象的equals()方法用来找到键值对。如果链表大小超过阈 值(TREEIFY_THRESHOLD, 8),链表就会被改造为树形结构。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年04月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • (1) 元素特性
  • (2)顺序特性
  • (3)初始化与增长方式
  • (4)线程安全性
  • (5)一段话HashMap
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档