Java思考——HashSet集合如何保证元素的唯一性也就是不包含重复元素()
首先将源码逐级找出来
1.HashSet hs=new HashSet();
hs.add("hello");
hs.add("world");
hs.add("java");
hs.add("world"); //因为是Set集合所以不带重复元素
因为调用的是HashSet集合中的add方法,所以我们要找出来add方法
2. public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
通过add方法我们可以看出它调用了一个put方法,我们在找出来
3.public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
然后我们可以看到它里面调用了一个putVal方法,然后第一个参数还是个hash方法,那我们就把两个方法一次拿出来
4. static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
//hash值和元素的hashCode()方法有关
5.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;
//根据对象的哈希值计算对象的存储位置,如果该位置没有元素,就存储元素
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);
else {
Nodee; K k;
/*
存入的元素和以前的元素比较哈希值
如果哈希值不同就往下执行,把元素添加到集合
如果哈希值相同就调用对象的equals方法
如果返回false:就往下执行,把元素添加到集合
如果返回true:表示元素重复,不存储
*/
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 = https://www.it610.com/article/e.value;
if (!onlyIfAbsent || oldValue =https://www.it610.com/article/= null)
e.value = https://www.it610.com/article/value;
afterNodeAccess(e);
return oldValue;
}
}
++modCount;
if (++size > threshold)
resize();
afterNodeInsertion(evict);
return null;
}
HashSet集合添加一个元素的过程:
1.调用HsahSet集合对象的hashCode()方法获取哈希值
2.根据对象的哈希值计算对象的存储位置
3.判断该位置是否已有元素存在
没有:就将该元素存储在此位置
有:遍历该位置的所有元素,并和新存入的元素比较哈希值是否相同
不相同:将元素存入该位置
相同:调用对象的equals()方法进行比较
相同:说明该元素重复,不用存储
不相同:将元素存入该位置
【Java思考——HashSet集合如何保证元素的唯一性也就是不包含重复元素()】4.结束
推荐阅读
- LR.JAVA报表设计器,快速点亮报表设计技能
- JAVA后端|Java日期处理
- Letcode算法专篇|Java之有序集合&hashMap
- Android|Android BLE 蓝牙开发——扫码枪基于BLESSED
- 27.Java|27.Java 飞机游戏小项目
- Java面向对象的封装你了解吗
- Java9新特性中的模块化详解
- 嵌入式|物联网系列①——基于ESP8266的网络服务器
- Java锁(二)(AbstractQueuedSynchronizer、ReentrantLock详解)
- Java|第1节 MySQL 架构篇 2021-12-24