HashSet集合

本文详细探讨了Java中的HashSet集合,包括其无序、不可重复的特性,以及底层的哈希表结构。文章讲解了哈希值的概念、获取方式以及哈希冲突的处理,特别指出在JDK 1.8中哈希表结构的变化,涉及数组+链表到红黑树的转换。此外,还通过实例展示了如何存储和遍历包含学生对象的HashSet集合,强调了重写equals()和hashCode()方法的重要性。
摘要由CSDN通过智能技术生成

#博学谷IT学习技术支持#

HashSet集合

1. HashSet集合概述和特点

  • 底层数据结构是哈希表
  • 存取无序
  • 不可以存储重复元素
  • 没有索引,不能使用普通for循环遍历

2. HashSet集合的基本应用

存储字符串并遍历

public class HashSetDemo {
    public static void main(String[] args) {
        //创建集合对象
        HashSet<String> set = new HashSet<String>();

        //添加元素
        set.add("hello");
        set.add("world");
        set.add("java");
        //不包含重复元素的集合
        set.add("world");

        //遍历
        for(String s : set) {
            System.out.println(s);
        }
    }
}

3. 哈希值

  • 哈希值简介

    ​ 是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值

  • 如何获取哈希值

    ​ Object类中的public int hashCode():返回对象的哈希码值

  • 哈希值的特点

    • 同一个对象多次调用hashCode()方法返回的哈希值是相同的
    • 默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同

4. 哈希表结构

  • JDK1.8以前

    数组 + 链表

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RrnGdGxl-1668938629950)(.\img\14_JKD8以前哈希表.png)]

  • JDK1.8以后

    • 节点个数少于等于8个

      数组 + 链表

    • 节点个数多于8个

      数组 + 红黑树

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rtXqdNnR-1668938629951)(.\img\15_JKD8以后哈希表.png)]

5. HashSet集合存储学生对象并遍历演示

  • 案例需求

    • 创建一个存储学生对象的集合,存储多个学生对象,使用程序实现在控制台遍历该集合
    • 要求:学生对象的成员变量值相同,我们就认为是同一个对象
  • 代码实现

    学生类

    public class Student {
        private String name;
        private int age;
    
        public Student() {
        }
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
    
            Student student = (Student) o;
    
            if (age != student.age) return false;
            return name != null ? name.equals(student.name) : student.name == null;
        }
    
        @Override
        public int hashCode() {
            int result = name != null ? name.hashCode() : 0;
            result = 31 * result + age;
            return result;
        }
    }
    

    测试类

    public class HashSetDemo02 {
        public static void main(String[] args) {
            //创建HashSet集合对象
            HashSet<Student> hs = new HashSet<Student>();
    
            //创建学生对象
            Student s1 = new Student("林青霞", 30);
            Student s2 = new Student("张曼玉", 35);
            Student s3 = new Student("王祖贤", 33);
    
            Student s4 = new Student("王祖贤", 33);
    
            //把学生添加到集合
            hs.add(s1);
            hs.add(s2);
            hs.add(s3);
            hs.add(s4);
    
            //遍历集合(增强for)
            for (Student s : hs) {
                System.out.println(s.getName() + "," + s.getAge());
            }
        }
    }
    

小结

HashSet集合存储自定义类型元素,要想实现元素的唯一,要求必须重写hashCode方法equals方法

总结

本篇文章内容主要介绍了 HashSet集合 ,其中详细介绍了 HashSet集合(HashSet集合概述和特点、HashSet集合的基本应用、哈希值(哈希值简介、如何获取哈希值、希值的特点)、哈希表结构(JDK1.8以前 和 JDK1.8以后)、HashSet集合存储学生对象并遍历演示),可以极大程度地帮助我们掌握 HashSet集合 的用法,并根据用法逻辑判断出相应的应用情景,更有效率地帮助我们进行开发。

好啦!本篇文章到这里就结束啦!大家好好练习便能运用自如,每一天都要加油呀!!!


🥰 🥰 🥰你的点赞是对我最大的鼓励。🥰 🥰 🥰 

🥰 🥰 🥰你的收藏是对我文章的认可。️🥰 🥰 🥰

🥰 🥰 🥰你的关注是对我前进的动力。🥰 🥰 🥰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值