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,认定两个元素不同

就会把"学习"存储到集合中