Java>Set集合>>分析Set集合储存元素不重复的原理
package JiHe.Set; import java.util.HashSet; /* Set集合不允许储存重复元素的原理 */ public class Demo01HashSet { public static void main(String[] args) { //创建HashSet集合对象 HashSet<String> set = new HashSet<>(); String s1 = new String("abc"); String s2 = new String("abc"); set.add(s1); set.add(s2); set.add("学生"); set.add("学习"); set.add("abc"); System.out.println(set); // [学习, 学生, abc] } }[学习, 学生, abc]
分析Set集合储存元素不重复的原理:
Set集合在调用add方法的时候,add方***调用元素的hashCode方法和equals方法,判断元素是否重复
set集合储存:元素不重复的元素 前提:存储的元素必须重写hashCode方法和equals方法
set.add(s1);
add方***调用s1的hasCode方法,计算字符串“abc”的哈希值,哈希值是96354
在集合中找有没有96354这个哈希值的元素,发现没有
就会把s1存储到集合中
set.add(s2);
add方***调用s2的hashCode方法,计算字符串“abc”的哈希值,哈希值是96354
在集合中好有没有96354这个哈希值的元素,发现有(哈希值冲突)
s2会调用equals方法和哈希值相同的元素进行比较 s2.equals(s1),返回true
两个元素的哈希值相同,equals方法返回true,认定两个元素相同
就不会把s2存储到集合中
set.add("学生");
add方***调用"学生"的hasCode方法,计算字符串"学生"的哈希值,哈希值是1179395
在集合中找有没有1179395这个哈希值的元素,发现没有
就会把"学生"存储到集合中
set.add("学习");
add方***调用"学习"的hashCode方法,计算字符串"学习"的哈希值,哈希值是1179395
在集合中好有没有1179395这个哈希值的元素,发现有(哈希值冲突)
"学习"会调用equals方法和哈希值相同的元素进行比较 "学习".equals(s1),返回false
两个元素的哈希值相同,equals方法返回false,认定两个元素不同
就会把"学习"存储到集合中
Set集合在调用add方法的时候,add方***调用元素的hashCode方法和equals方法,判断元素是否重复
set集合储存:元素不重复的元素 前提:存储的元素必须重写hashCode方法和equals方法
set.add(s1);
add方***调用s1的hasCode方法,计算字符串“abc”的哈希值,哈希值是96354
在集合中找有没有96354这个哈希值的元素,发现没有
就会把s1存储到集合中
set.add(s2);
add方***调用s2的hashCode方法,计算字符串“abc”的哈希值,哈希值是96354
在集合中好有没有96354这个哈希值的元素,发现有(哈希值冲突)
s2会调用equals方法和哈希值相同的元素进行比较 s2.equals(s1),返回true
两个元素的哈希值相同,equals方法返回true,认定两个元素相同
就不会把s2存储到集合中
set.add("学生");
add方***调用"学生"的hasCode方法,计算字符串"学生"的哈希值,哈希值是1179395
在集合中找有没有1179395这个哈希值的元素,发现没有
就会把"学生"存储到集合中
set.add("学习");
add方***调用"学习"的hashCode方法,计算字符串"学习"的哈希值,哈希值是1179395
在集合中好有没有1179395这个哈希值的元素,发现有(哈希值冲突)
"学习"会调用equals方法和哈希值相同的元素进行比较 "学习".equals(s1),返回false
两个元素的哈希值相同,equals方法返回false,认定两个元素不同
就会把"学习"存储到集合中