HashSet、Hashtable与HashMap的关系

一.HashSet与HashMap的关系

阅读HashSet的源代码,发现加上很多注释总共就只有300多行,所以就可以猜到它的内部实现一定借助了其他的数据结构。事实上,它就是在HashMap的基础上实现的。在它的内部,包含了一个HashMap。

privatetransient HashMap<E,Object> map;

它的构造方法其实也是直接调用了HashMap的构造方法。

publicHashSet() {

map = new HashMap<>();

}

再来看一看它的add方法。

publicboolean add(E e) {

return map.put(e, PRESENT)==null;

}

其实就是调用了HashMap的put方法,key就是加入的e,value为PRESENT,它是HashSet内部的一个成员变量,就是一个空的Object对象。

privatestatic final Object PRESENT = new Object();

它是一个虚值,作用就是为了作为value与HashMap关联。add方法的返回值类型是boolean。通过上次分析的HashMap源码可以知道,当放入的key值在HashMap的table数组中不存在时,即没有hash冲突时,会把新元素加入数组中,同时返回null.所以这种情况下,add方法的返回值就是ture,表示进行了增加的操作。当放入的key,即HashSet要加入的e已经在HashMap的table数组中存在时,会用新的value覆盖旧的value,对于HashSet来说,就是用新的PRESENT替换了旧的PRESENT。然后直接返回旧的value值,并没有进行HashMap的插入操作。所以这个时候的add方法放入返回值就是false,表示HashSet没有大小以及元素的改变。

相似的,HashSet的remove方法也是直接调用了HashMap的remove方法

publicboolean remove(Object o) {

return map.remove(o)==PRESENT;

}

由于HashMap的remove方法当size为0或者要删除的元素不存在时,会返回null,所以这时add方法的返回值就是false,表示没有进行删除的操作,HashSet没有发生改变。当要删除的元素存在时,HashMap的remove方法会返回value的值,由于在HashSet中,所有的value都是PRESENT这一个对象,所以这个时候add的返回值就是true,表示HashSet进行了删除的操作,发生了改变。

二.Hashtable与HashMap的关系

首先发现一个比较有趣的细节问题,就是Hashtable的t没有大写,没有遵循java类命名的驼峰规则。不知道什么原因。

然后一个比较大的区别是他们的父类不同。

HashMap<K,V>  extendsAbstractMap<K,V>

Hashtable<K,V>  extendsDictionary<K,V>

他们的底层实现都是Entry数组,但是他们的初始默认的大小不一样,HashMap中默认的大小是16,而Hashtable的默认大小确是11,但是他们的默认负载因子都是0.75.下面为他的无参的构造方法:

public Hashtable() {

this(11, 0.75f);

}

然后他们的求数组下标的哈希映射的算法实现不一样,HashMap使用的是&运算,效率相对要高一些。而Hashtable使用的是取模的余数运算。

int index = (hash & 0x7FFFFFFF) % tab.length;

他们最大的区别就是Hashtable中所有的可能导致线程安全问题的方法都使用了synchronized修饰,加了互斥锁。所以说Hashtable是线程安全的。但是缺点就是效率很低。他们的区别就好像Vector和ArrayList。他们还有很多的细节上的区别,大家无聊的时候可以去看看。

时间: 2024-10-27 05:25:36

HashSet、Hashtable与HashMap的关系的相关文章

HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别

Hash算法 Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值.简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数. HASH主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128

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

看上面的框架图,先抓住它的主干,即Collection和Map. 1 Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作和属性. Collection包含了List和Set两大分支. (01) List是一个有序的队列,每一个元素都有它的索引.第一个元素的索引值是0. List的实现类有LinkedList, ArrayList, Vector, Stack. (02) Set是一个不允许有重复元素的集合. Set的实现类有HastSet和TreeSet.HashSet

谈HashMap,HashSet,HashTable容易被我们忽视的问题

在平时开发中,HashMap,HashTable,HashSet 都是经常用到的键值映射数据结构,在这里我主要写一些平时我们使用这些数据结构中容易忽视的问题. HashMap HashMap的结构 HashMap 底层是一个Entry数组来支撑的,我觉得叫Entry链表数组支撑更为合适. 结构图: 每个entry数组里面的元素要么为null要么就是一个entry链表:而每个entry对象就是一个entry链表的节点也是一个键值对的抽象表示: HashMap的性能因素 HashMap主要影响其性能

HashSet HashTable HashMap的区别 及其Java集合介绍

(1)HashSet是set的一个实现类,hashMap是Map的一个实现类,同时hashMap是hashTable的替代品(为什么后面会讲到). (2)HashSet以对象作为元素,而HashMap以(key-value)的一组对象作为元素,且HashSet拒绝接受重复的对象.HashMap可以看作三个视图:key的Set,value的Collection,Entry的Set. 这里HashSet就是其实就是HashMap的一个视图. HashSet内部就是使用Hashmap实现的,和Hash

Hashtable 和HashMap 的区别(原型模式)

哈希表是一种重要的存储方式,也是一种常见的检索方法.其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入计算得到存储地址所对应的存储单元.检索时采用检索关键码的方法.现在哈希表有一套完整的算法来进行插入.删除和解决冲突.在Java中哈希表用于存储对象,实现快速检索. Java.util.Hashtable提供了种方法让用户使用哈希表,而不需要考虑其哈希表真正如何工作. 哈希表类中提供了三种构造方法,分别是: public Hasht

关于HashTable,HashMap和TreeMap的几点心得

刚开始看到HashTable,HashMap和TreeMap的时候比较晕,觉得作用差不多,但是到实际运用的时候又发现有许多差别的.于是自己搜索了一些相关资料来学习,以下就是我的学习沉淀. java为数据结构中的映射定义了一个接口java.util.Map,而HashMap Hashtable和TreeMap就是它的实现类.Map是将键映射到值的对象,一个映射不能包含重复的键:每个键最多只能映射一个一个值. Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直

HashTable和HashMap区别

一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap. HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆. HashMap存数据的过程是: HashMap内部维护了一个存储数据的Entr

Java基础教程:HashTable与HashMap比较

Java基础教程:HashTable与HashMap比较 1.  关于HashMap的一些说法: a)  HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结合体.HashMap的底层结构是一个数组,数组中的每一项是一条链表. b)  HashMap的实例有俩个参数影响其性能: "初始容量" 和 装填因子. c)  HashMap实现不同步,线程不安全.  HashTable线程安全 d)  HashMap中的key-value都是存储在Entry中的

HashTable和HashMap的区别详解

原文 一.HashMap简介      HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap. HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆. HashMap存数据的过程是: HashMap内部维护了一个存