日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hash 值重复_面试题:HashSet是如何保证元素不重复的

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hash 值重复_面试题:HashSet是如何保证元素不重复的 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

面試官:你能簡單介紹List和Set有什么區別嗎?

小憨:

  • List是一個有序的集合,在內存是連續存儲的,可以存儲重復的元素,List查詢快,增刪慢;
  • Set是一個無序的集合,在內存中不連續,不可以存儲重復的元素,Set增刪快,查詢慢;

面試官:那HashSet是如何保證元素不重復的?

小憨:3分鐘。。。


為了避免出現小憨這種知其然不知其所以然的尷尬,我們還是有必要來分析下上述問題的。

客官,且看下文

我們都知道HashSet存放的元素是不允許重復的,那么HashSet又是是如何保證元素不可重復的,你知道嗎?

先看段源碼

public class HashSet
extends AbstractSet
implements Set, Cloneable, java.io.Serializable
{
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap map;
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<>();
}
public HashSet(Collection extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
}

乍一看這段代碼,哎呦我去,new HashSet()操作不就不是維護了一個HashMap嘛,要是這么往下演的話,我覺得我這點功力也能看個大概呀!

諸位同仁,咱接著往下看

public boolean add(E e) {
return map.put(e, PRESENT)==null;
}

什么,這不就是map操作么,瞬間我來個下飯推理;

Map中的key是不允許重復的,而你HashSet正好利用我Map中key不重復的特性來校驗重復元素,妙哉妙哉。

確實,HashSet確實是利用Map的這一特性實現了元素的不重復特性,但是我們再來深挖一下,Map他又是如何來保證key不重復的呢?

與其說這篇文章是介紹HashSet如何保證元素不重復的,倒不如說Map是如何保證Key不重復的。

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node[] tab; Node p; int n, i;
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;
// 1、如果該位置不存在,直接插入
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);
else {
Node e; K k;
// 2、如果存在,判斷是否是重復元素
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
e = p;
else if (p instanceof TreeNode)
e = ((TreeNode)p).putTreeVal(this, tab, hash, key, value);
else {
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null);
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
treeifyBin(tab, hash);
break;
}
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
}
if (e != null) { // existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null)
e.value = value;
afterNodeAccess(e);
return oldValue;
}
}
++modCount;
if (++size > threshold)
resize();
afterNodeInsertion(evict);
return null;
}

上面部分我重點圈了兩段代碼,分別是1和2。

第一段

if ((p = tab[i = (n - 1) & hash]) == null)

這段代碼其實主要是通過hash計算該元素的位置,然后判斷該位置是否有值,如果沒有值,那么可以直接插入,最后返回null;

第二段

if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
e = p;

如果通過計算,該位置上已經有其他元素,那么接下來就會通過hash和equals進行判斷,判斷它是不是重復元素,如果重復元素,那么最后會將這個重復元素返回。

通過第二段代碼我們可以發現,判斷元素是否重復,使用的是hash和equals方法進行判斷的,所有我們Set里面如果存放的是對象,那么一定要重寫hash和equals方法。

現在是不是很清晰了,為啥要重寫equals方法了,不會出現那么詭異的代碼了,這兩個對象值都一樣啊,為什么Set沒去重呢!

總結

以上是生活随笔為你收集整理的hash 值重复_面试题:HashSet是如何保证元素不重复的的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美三级a做爰在线观看 | 欧美高清视频一区二区 | 999久久| 欧美黄色免费看 | 成人午夜视频免费看 | 欧美色综合网站 | 黑人借宿巨大中文字幕 | 九九热在线免费观看 | 91毛片网| 岛国在线视频 | 成人国产免费视频 | 美女无遮挡网站 | 久久免费福利 | 最新地址在线观看 | 日韩免费大片 | 成人免费无码大片a毛片 | 国产经典三级 | 视频1区2区 | 中国黄色一级大片 | 日韩欧美aⅴ综合网站发布 国产成人一区二区三区小说 | 真性中出 | 日b视频免费观看 | 91精品视频在线看 | 亚洲www在线 | 色呦呦影院 | 午夜嘿嘿 | 九九视屏 | 四虎影酷| 国产码视频 | av2014天堂网 | 午夜久久久久久久久久影院 | 精品一区二区毛片 | 午夜国产一区二区三区 | 日韩在线观看精品 | 欧美a图 | 久草视频免费在线 | 91精品免费看 | 久久久91 | 都市激情综合 | 国产欧美精品区一区二区三区 | 国产三级在线观看视频 | 女女h百合无遮羞羞漫画软件 | 国产xxxx做受性欧美88 | 欧美乱淫| 精品国产一区二区三区久久狼黑人 | 成人h动漫精品一区二区下载 | 精品久久久久久久久久久久久久久 | 热久久伊人| 99精品网| 内裤摩擦1v1h | 国产成人av无码精品 | 天堂在线免费观看视频 | av资源网在线 | 国产91黄色 | 日韩性xx| 天天插插 | 亚洲精品毛片av | 一区二区色 | 精品人妻少妇AV无码专区 | 欧美三级久久久 | 男男啪啪无遮挡 | 精品国产欧美一区二区三区成人 | 亚洲综合久 | www.久久久.com | 一级成人免费视频 | 双性娇喘浑圆奶水h男男漫画 | a天堂亚洲 | 污视频网站在线看 | 国产传媒在线视频 | 四川丰满少妇被弄到高潮 | 激情xxxx | 91大尺度 | 男人资源网站 | 午夜视频精品 | 二区在线视频 | 一区二区高清在线观看 | 久久久久久久久久久久久久国产 | 艳母日本动漫在线观看 | 亚洲AV综合色区无码国产播放 | 欧美激情在线播放 | 无码国产69精品久久久久同性 | 日韩成人av片 | 一本一道av | 在线黄视频| 九九热这里只有 | 北条麻妃一二三区 | 国产乱性 | 最新久久| 国产精品一区二区三区在线播放 | 色诱av| 日韩一区二区三区中文字幕 | 免费人成视频在线 | 黄色网免费观看 | 亚洲码中文 | 女女爱爱视频 | 国产亚洲一区二区不卡 | 午夜激情导航 | 免费一二三区 | 天天躁日日躁狠狠躁喷水 |