hashmap和hashset的区别和联系

hashmap和hashset的区别和联系

1.hashset的存储结构

通过查看hashset的add方法源码可以发现hashset采用的是map存储结构

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}
 private static final Object PRESENT = new Object();

hashset则将对象存储在map的key中,value值用一个new Object()作为填充

往hashset存储元素时,hashset会先调用元素的hashcode方法获取元素的hash值,再用元素的hash值和(数组长度-1)做位运算得到下标(HashMap的底层是一个数组结构,数组中的每一项对应了一个链表(jdk1.8之后是红黑树),这种结构称“链表散列”的数据结构,即数组和链表的结合体;也叫散列表、哈希表。)。如果此时计算的位置上没有其他元素则直接插入不用比较。

但是随着元素的不断添加,就可能会出现“哈希冲突”,不同的对象计算出的hashcode是相同的。这时候就需要用equals方法进行比较,如果相同则不插入,如果不同则用头插法插入链表。但是若相同元素过多同样会产生链表过长查找慢的问题,在1.8之后就采用了红黑树结构。

hashmap

一、HahMap存储对象的过程如下

1、对HahMap的Key调用hashCode()方法,返回int值,即对应的hashCode;

2、把此hashCode作为哈希表的索引,查找哈希表的相应位置,若当前位置内容为NULL,则把hashMap的Key、Value包装成Entry数组,放入当前位置;

3、若当前位置内容不为空,则继续查找当前索引处存放的链表,利用equals方法,找到Key相同的Entry数组,则用当前Value去替换旧的Value;

4、若未找到与当前Key值相同的对象,则把当前位置的链表后移(Entry数组持有一个指向下一个元素的引用),把新的Entry数组放到链表表头;

HashSet和HashMap的区别

撤销:Ctrl/Command + Z重做:Ctrl/Command + Y加粗:Ctrl/Command + B斜体:Ctrl/Command + I标题:Ctrl/Command + Shift + H无序列表:Ctrl/Command + Shift + U有序列表:Ctrl/Command + Shift + O检查列表:Ctrl/Command + Shift + C插入代码:Ctrl/Command + Shift + K插入链接:Ctrl/Command + Shift + L插入图片:Ctrl/Command + Shift + G查找:Ctrl/Command + F替换:Ctrl/Command + G

hashset为什么比hashmap慢呢?

有的说是因为HashMap可以直接通过hash计算得到的键来获取对象,而HashSet呢, 直接用HashMap的containKeys方法,确实能在相同效率下确定一个元素是否存在,但是因为实现的是set,并不能用get方法,因此取值很麻烦。但是总感觉牵强。

因此就想会不会是因为键值对像的差别造成的,他们俩都必须计算哈希码,但要考虑HashMap的键的性质-它通常是一个简单的String甚至是一个数字。他们俩都必须计算哈希码,而hashset可能会是一个对象。如果HashMap的键与存储在HashSet中的键是相同的对象,则性能将没有真正的区别。区别在于HashMap的键是哪种对象。

  • 12
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值