栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

HashMap及其他的Hash类

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

HashMap及其他的Hash类

HashMap 和 HashTable 的区别

相同点

HashMap 和 HashTable 都是基于哈希表实现的,其内部每个元素都是 key-value 键值对,HashMap 和 HashTable 都实现了 Map、Cloneable、Serializable 接口。

不同点

  • 父类不同:
    HashMap 继承了 AbstractMap 类,而 HashTable 继承了 Dictionary 类

  • 空值不同:
    HashMap 允许空的 key 和 value 值,
    HashTable 不允许空的 key 和 value 值。
    HashMap 会把 Null key 当做普通的 key 对待。不允许 null key 重复。

  • 线程安全性:
    HashMap 不是线程安全的,如果多个外部操作同时修改 HashMap 的数据结构比如 add 或者是 delete,必须进行同步操作,仅仅对 key 或者 value 的修改不是改变数据结构的操作。
    可以选择构造线程安全的 Map 比如 Collections.synchronizedMap 或者是 ConcurrentHashMap。
    而 HashTable 本身就是线程安全的容器。

  • 性能方面:
    虽然 HashMap 和 HashTable 都是基于单链表的,
    但是 HashMap 进行 put 或者 get 操作,可以达到常数时间的性能;
    而 HashTable 的 put 和 get 操作都是加了 synchronized 锁的,所以效率很差。

  • 初始容量不同:
    HashTable 的初始长度是11,之后每次扩充容量变为之前的 2n+1(n为上一次的长度)
    而 HashMap 的初始长度为16,之后每次扩充变为原来的两倍。
    创建时,如果给定了容量初始值,那么HashTable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小。

HashMap 和 HashSet 的区别

HashSet 继承于 AbstractSet 接口,实现了 Set、Cloneable,、java.io.Serializable 接口。
HashSet 不允许集合中出现重复的值。HashSet 底层其实就是 HashMap,所有对 HashSet 的操作其实就是对 HashMap 的操作。所以 HashSet 也不保证集合的顺序。

HashMap的实现原理

HashMap基于Hash算法实现的,我们通过put(key,value)存储,get(key)来获取。 当传入key时,
HashMap会根据key. hashCode()计算出hash值,根据hash值将value保存在bucket里。当计算出
的hash值相同时,我们称之为hash冲突,HashMap的做法是用链表和红黑树存储相同hash值的
value。当hash冲突的个数比较少时,使用链表否则使用红黑树。

HashSet的实现原理

HashSet是基于HashMap实现的,HashSet 底层使用HashMap来保存所有元素,因此HashSet的实
现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成,HashSet
不允许重复的值。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/301485.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号