Set集合存储不重复元素的原理
前提:存储的元素必须重写hashCode方法和equals方法
测试类
package Advanced.Set;
import java.util.HashSet;
public class Demo02HashSetSaveString {
public static void main(String[] args) {
//创建HashSet集合对象
HashSet<String> set = new HashSet<>();
String s1 = new String("abc");
String s2 = new String("abc");
String s3 = new String("重地");
String s4 = new String("通话");
set.add(s1);
set.add(s2);
set.add(s3);
set.add(s4);
//集合重写了toString方法,直接打印
System.out.println(set); //[重地, 通话, abc]
//打印输出s1,s2,s3,s4四个哈希值
System.out.println(s1.hashCode()); //96354
System.out.println(s2.hashCode()); //96354
System.out.println(s3.hashCode()); //1179395
System.out.println(s4.hashCode()); //1179395
}
}
Set集合在调用add方法的时候,add方法会调用 hashCode方法和 equals方法,判断元素是否重复
执行:
set.add(s1);
add 方法会调用hashCode方法,计算字符串"abc"的哈希值,哈希值为96354
在集合中找有没有96354这个哈希值的元素
发现没有
那么就会把 s1 存储到 set集合中
执行:
set.add(s2);
add 方法会调用hashCode方法,计算字符串"abc"的哈希值,哈希值是96354
在集合中找有没有96354这个哈希值的元素
发现有,那么就会产生哈希冲突
接下来 s2 会调用equals方法与哈希值相同的元素进行比较 s2.equals(s1),发现元素也一样,返回true
两个元素的哈希值相同而且equals方法返回true,认定两个元素相同
那么就不会把s2存储到 set 集合中
执行:
set.add(s3);
add 方法会调用hashCode方法,计算字符串"重地"的哈希值,哈希值为1179395
在集合中找有没有1179395这个哈希值的元素
发现没有
那么就会把 s3 存储到 set集合中
执行:
set.add(s4);
add 方法会调用hashCode方法,计算字符串"通话"的哈希值,哈希值是1179395
在集合中找有没有1179395这个哈希值的元素
发现有,那么就会产生哈希冲突
接下来 s4 会调用equals方法与哈希值相同的元素进行比较 s4.equals(s3),发现元素不一样,返回false
两个元素的哈希值相同,但是equals方法返回false,认定两个元素不相同
那么就会把s4存储到 set 集合中
执行完毕后
存储地址图如下:
![7a11aed4fd8c7d716502d725964422e1.png](https://i-blog.csdnimg.cn/blog_migrate/d8d6db8cc955116e0c80dfbb5b67c4ec.png)