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

简介: 需求:存储自定义对象,并保证元素的唯一性 要求:如果两个对象的成员变量值都相同,则为同一个元素。 示例代码如下: 1 package cn.itcast_02; 2 3 /** 4 * @author Administrator 5 * 6 ...

需求:存储自定义对象,并保证元素的唯一性

要求:如果两个对象的成员变量值都相同,则为同一个元素。

示例代码如下:

  1 package cn.itcast_02;
  2 
  3 /**
  4  * @author Administrator
  5  * 
  6  */
  7 public class Student {
  8     private String name;
  9     private int age;
 10 
 11     public Student() {
 12         super();
 13     }
 14 
 15     public Student(String name, int age) {
 16         super();
 17         this.name = name;
 18         this.age = age;
 19     }
 20 
 21     public String getName() {
 22         return name;
 23     }
 24 
 25     public void setName(String name) {
 26         this.name = name;
 27     }
 28 
 29     public int getAge() {
 30         return age;
 31     }
 32 
 33     public void setAge(int age) {
 34         this.age = age;
 35     }
 36 
 37     // 自动生成(快捷方式生成)
 38     @Override
 39     public int hashCode() {
 40         final int prime = 31;
 41         int result = 1;
 42         result = prime * result + age;
 43         result = prime * result + ((name == null) ? 0 : name.hashCode());
 44         return result;
 45     }
 46 
 47     @Override
 48     public boolean equals(Object obj) {
 49         if (this == obj)
 50             return true;
 51         if (obj == null)
 52             return false;
 53         if (getClass() != obj.getClass())
 54             return false;
 55         Student other = (Student) obj;
 56         if (age != other.age)
 57             return false;
 58         if (name == null) {
 59             if (other.name != null)
 60                 return false;
 61         } else if (!name.equals(other.name))
 62             return false;
 63         return true;
 64     }
 65 
 66     /*
 67     @Override
 68     public int hashCode() {
 69         // return 0;
 70         // 因为成员变量的值影响了哈希值,所以我们把成员变量值相加即可
 71         // return this.name.hashCode() + this.age;
 72         // 看下面
 73         // 如果s1:
 74                 name.hashCode() = 40, age = 30
 75          // 如果s2:
 76                 name.hashCode() = 20, age = 50
 77         // 为了尽可能的区分他们,我们可以把它们乘以一些整数,例如如下所示:
 78         return this.name.hashCode() + this.age * 15;
 79     }
 80     
 81     @Override
 82     public boolean equals(Object obj) {
 83         // System.out.println(this + "---" + obj);
 84         if (this == obj) {
 85             return true;
 86         }
 87     
 88         if (!(obj instanceof Student)) {
 89             return false;
 90         }
 91     
 92         Student s = (Student) obj;
 93             return this.name.equals(s.name) && this.age == s.age;
 94     }
 95     
 96     @Override
 97     public String toString() {
 98         return "Student [name=" + name + ", age=" + age + "]";
 99     }
100     */
101 
102 }
 1 package cn.itcast_02;
 2 
 3 import java.util.HashSet;
 4 
 5 /*
 6  * 需求:存储自定义对象,并保证元素的唯一性
 7  * 要求:如果两个对象的成员变量值都相同,则为同一个元素。
 8  * 
 9  *         目前是不符合我的要求的:因为我们知道HashSet底层依赖的是hashCode()和equals()方法。
10  *         而这两个方法我们在学生类中没有重写,所以,默认使用的是Object类的。
11  *         这个时候,一般来说,他们的哈希值是不会一样的,根本就不会继续判断了,就执行了添加操作。
12  */
13 public class HashSetDemo2 {
14     public static void main(String[] args) {
15         // 创建集合对象
16         HashSet<Student> hs = new HashSet<Student>();
17 
18         // 创建学生对象
19         Student s1 = new Student("林青霞", 27);
20         Student s2 = new Student("柳岩", 22);
21         Student s3 = new Student("王祖贤", 30);
22         Student s4 = new Student("林青霞", 27);
23         Student s5 = new Student("林青霞", 20);
24         Student s6 = new Student("范冰冰", 22);
25 
26         // 添加元素
27         hs.add(s1);
28         hs.add(s2);
29         hs.add(s3);
30         hs.add(s4);
31         hs.add(s5);
32         hs.add(s6);
33 
34         // 遍历集合
35         for (Student s : hs) {
36             System.out.println(s.getName() + "---" + s.getAge());
37         }
38     }
39 }

 

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
2天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
13天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1284 5
|
12天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1313 87
|
1天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
174 82
2025年阿里云域名备案流程(新手图文详细流程)
|
1天前
|
自然语言处理 前端开发
基于Electron38+Vite7.1+Vue3+Pinia3+ElementPlus电脑端admin后台管理模板
基于最新版跨平台框架Electron38整合Vite7+Vue3+ElementPlus搭建轻量级客户端中后台管理系统解决方案。
152 86