用HashSet存储自定义对象

简介: 案例 package cn.itcast_02; import java.util.HashSet; /* * 需求:存储自定义对象,并保证元素的唯一性 * 要求:如果两个对象的成员变量值都相同,则为同一个元素。

 

案例

package cn.itcast_02;

import java.util.HashSet;

/*
 * 需求:存储自定义对象,并保证元素的唯一性
 * 要求:如果两个对象的成员变量值都相同,则为同一个元素。
 * 
 * 目前是不符合我的要求的:因为我们知道HashSet底层依赖的是hashCode()和equals()方法。
 * 而这两个方法我们在学生类中没有重写,所以,默认使用的是Object类。
 * 这个时候,他们的哈希值是不会一样的,根本就不会继续判断,执行了添加操作。
 */
public class HashSetDemo2 {
    public static void main(String[] args) {
        // 创建集合对象
        HashSet<Student> hs = new HashSet<Student>();

        // 创建学生对象
        Student s1 = new Student("林青霞", 27);
        Student s2 = new Student("柳岩", 22);
        Student s3 = new Student("王祖贤", 30);
        Student s4 = new Student("林青霞", 27);
        Student s5 = new Student("林青霞", 20);
        Student s6 = new Student("范冰冰", 22);

        // 添加元素
        hs.add(s1);
        hs.add(s2);
        hs.add(s3);
        hs.add(s4);
        hs.add(s5);
        hs.add(s6);

        // 遍历集合
        for (Student s : hs) {
            System.out.println(s.getName() + "---" + s.getAge());
        }
    }
}

过程插图:

HashSet存储元素保证唯一性的代码及图解

 

 

System.out.println(new Student().hashCode()==new Student().hashCode());//false
System.out.println(new Student("范冰冰",28).hashCode()==new Student("范冰冰",28).hashCode());//false

上面的代码说明:成员变量的值完全相等的两个对象,如果不重写hashCode()方法,而是用Object类的,结果都不相等。

所以在是用HashXX集合时,多个对象的hashCode()都不相同,造成了多个bucket,每个bucket中的元素很少,不高效。

 

//equals()方法相同,一定要保证hashCode()结果也相同
//而hashCode()相同,则不能说他们的equals()结果相同。

 

 

 

1 不重写hashCode,和equals      HashXX集合中将一定可以存储重复的该类对象
2 不重写hashCode,重写equals      bucket 多,每个bucket中的元素少
3 重写hashCode,重写equals          可以保证HashXX集合的唯一性

equals重写:自己定义规则

hashCode重写: 引用类型.hashCode()+基本类型*素数

元素在存入HashXX集合之后,不应当修改参与hashCode()运算的对象属性的值,否则会因为找不到bucket 而造成内存泄露。

开始做,坚持做,重复做
相关文章
|
Java 测试技术 Spring
springboot测试环境无法注入bean问题分析及解决方案
springboot测试环境无法注入bean问题分析及解决方案
4541 0
springboot测试环境无法注入bean问题分析及解决方案
|
安全 Java
Java“不兼容类型” 错误怎么查找解决
在 Java 中遇到“不兼容类型”错误时,首先理解错误信息,它表明试图将一种类型赋给不兼容的类型。检查代码中类型不匹配的赋值、方法调用参数类型不匹配、表达式类型不兼容及泛型类型不匹配等问题。解决方法包括进行类型转换、修改代码逻辑、检查方法参数和返回类型以及处理泛型类型不匹配。通过这些步骤,可以有效解决“不兼容类型”错误,确保代码类型兼容性良好。
2403 9
|
敏捷开发 开发框架 JavaScript
很牛!Github 上 10 个值得学习的 Springboot 开源项目
很牛!Github 上 10 个值得学习的 Springboot 开源项目
12182 0
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
401 0
|
机器学习/深度学习 监控 安全
IDS 和 IPS 的区别详解
【8月更文挑战第31天】
1472 0
|
JavaScript Java 测试技术
学生成绩管理系统|基于Springboot的学生成绩管理系统设计与实现(源码+数据库+文档)
学生成绩管理系统|基于Springboot的学生成绩管理系统设计与实现(源码+数据库+文档)
2020 3
|
JavaScript Java 关系型数据库
流浪动物救助|基于Springboot的流浪动物救助平台设计与实现(源码+数据库+文档)
流浪动物救助|基于Springboot的流浪动物救助平台设计与实现(源码+数据库+文档)
592 0
|
Java C# 数据安全/隐私保护
软件体系结构 - 架构风格(4)面向对象架构风格
【4月更文挑战第21天】软件体系结构 - 架构风格(4)面向对象架构风格
983 0
|
存储 前端开发 JavaScript
完整的SpringBoot+Vue增删改查(学生管理)
完整的SpringBoot+Vue增删改查(学生管理)
549 1
vue3使用vue-router嵌套路由(多级路由)
vue3使用vue-router嵌套路由(多级路由)
1460 0