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的区别

hashmap和hashset的区别和联系_第1张图片

hashset为什么比hashmap慢呢?

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

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

你可能感兴趣的:(java,数据结构)