HashSet集合存储数据的结构(哈希表)和Set集合存储元素不重复的原理

HashSet集合存储数据的结构(哈希表)

HashSet集合存储数据的结构(哈希表)

jdk1.8版本之前:哈希表=数组+链表

jdk1.8版本之后:哈希表=数组+链表;

         哈希表=数组+红黑树(提高查询的速度)

哈希表的特点:速度快

 

 

 

Set集合存储元素不重复的原理

给HashSet中存放自定义类型元素是,需要重写对象中的hashCode和equals方法,

建立自己的比较方式,才能保证HashSet集合中的对象唯一

    public static void main(String[] args) {
        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);
    }

 

 

> set集合存储元素不重复的元素(存储的元素必须重写hashCode方法和equals方法)

Set集合在调用add方法的时候,add方法会调用元素的hashCode方法和equalse方法,判断元素是否重复

set.add(s1);

add方法会调用s1的hashCode方法,计算字符串"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方法会调用"重地"的hashCode方法,计算字符串"重地'的哈希值,哈希值是1179395

在集合中找到有没有1179395这个哈希值的元素,发现没有

就会把"重地"存储到集合中

set.add("通话");

add方法会调用"通话"的hashCode方法,计算字符串"通话"的哈希值,哈希值是1179395

在集合中找到有没有1179395这个哈希值的元素,发现有(哈希冲突)

"通话"会调用equals方法和哈希值相同的元素进行比较 "通话".equals("重地"),返回false

两个元素的哈希值相同,equals方法返回false,认定两个元素不同

就会把"通话"存储到集合中

 

posted @ 2022-07-06 11:31  魔光领域  阅读(75)  评论(0编辑  收藏  举报