30.1 HashSet存储自定义对象 未去重解决
问题:
- package day30_HashSet;
- import java.util.HashSet;
- /*
- * 通过hashset存储自定义对象,没有进行去重。
- *
- * */
- public class HashSetSutdentDemo {
- public static void main(String[] args) {
- //创建集合对象
- HashSet<Student> hs = new HashSet<Student>();
- //创建元素对象
- Student st = new Student("aa",20);
- Student st2 = new Student("bb",18);
- Student st3 = new Student("bb",18);
- //添加元素对象
- hs.add(st);
- hs.add(st2);
- hs.add(st3);
- //遍历集合对象
- for (Student s : hs) {
- System.out.println(s);
- }
- }
- }
- class Student {
- String name;
- int age;
- public Student(String name,int age) {
- this.name = name;
- this.age = age;
- }
- @Override
- public String toString() { //默认输出的是student的地址值,重写tostring方法
- return "Student{" +
- "name='" + name + '\'' +
- ", age=" + age +
- '}';
- }
- }
输出
解决:
HashSet 的 add方法使用的是 hashcode 和equals进行比较
需要重写hashcode 和equals
- package day30_HashSet;
- import java.util.HashSet;
- import java.util.Objects;
- /*
- * 使用HashSet存储自定义对象并遍历
- * 通过查看源码发现:
- * HashSet的add()方法,首先会使用当前集合中的每一个元素和新添加的元素进行hash值比较,
- * 如果hash值不一样,则直接添加新的元素
- * 如果hash值一样,比较地址值或者使用equals方法进行比较
- * 比较结果一样,则认为是重复不添加
- * 所有的比较结果都不一样则添加
- */
- public class HashSetStudentDemo2 {
- public static void main(String[] args) {
- HashSet<Student2> hs = new HashSet<Student2>();
- //创建元素对象
- Student2 s = new Student2("zhangsan",18);
- Student2 s2 = new Student2("lisi",19);
- Student2 s3 = new Student2("lisi",19);
- //添加元素对象
- hs.add(s);
- hs.add(s2);
- hs.add(s3);
- //遍历集合对象
- for (Student2 student : hs) {
- System.out.println(student);
- }
- }
- }
- class Student2 {
- String name;
- int age;
- public Student2(String name,int age) {
- this.name = name;
- this.age = age;
- }
- @Override
- public String toString() {
- return "Student2{" +
- "name='" + name + '\'' +
- ", age=" + age +
- '}';
- }
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- Student2 student2 = (Student2) o;
- return age == student2.age &&
- Objects.equals(name, student2.name);
- }
- @Override
- public int hashCode() {
- return Objects.hash(name, age);
- }
- }
30.1 HashSet存储自定义对象 未去重解决的更多相关文章
- Java基础知识强化之集合框架笔记40:Set集合之HashSet存储自定义对象并遍历
1. HashSet存储自定义对象并遍历 2. 代码示例: (1)Student类,如下: package cn.itcast_02; /** * @author Administrator * */ ...
- 《java入门第一季》之HashSet存储自定义对象问题以及注意事项
上一篇http://blog.csdn.net/qq_32059827/article/details/51578158 写到存储字符串类型的时候出现了无序,而且这个无序不是随机那种无序,它是有一定存 ...
- 用HashSet存储自定义对象
案例 package cn.itcast_02; import java.util.HashSet; /* * 需求:存储自定义对象,并保证元素的唯一性 * 要求:如果两个对象的成员变量值都相同, ...
- Java基础知识强化之集合框架笔记41:Set集合之HashSet存储自定义对象并遍历练习
1. HashSet集合存储自定义对象并遍历.如果对象的成员变量值相同即为同一个对象 注意了: 你使用的是HashSet集合,这个集合的底层是哈希表结构. 而哈希表结构底层依赖:hashCode()和 ...
- 集合框架-HashSet存储自定义对象
1 package cn.itcast.p4.hashset.test; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 6 ...
- 集合框架(HashSet存储自定义对象保证元素唯一性)
HashSet如何保证元素唯一性的原理 1.HashSet原理 a. 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降 ...
- JavaSE 集合类HashSet保证自定义对象唯一性
首先我们自定义Person类,只有姓名和年龄两个属性 class Person{ private String name ; private int age ; public Person(Strin ...
- Java基础知识强化之集合框架笔记24:ArrayList存储自定义对象并遍历
1. ArrayList存储自定义对象并遍历 2. 代码示例: Student.java,如下: package cn.itcast_01; public class Student { privat ...
- NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象
摘要: NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的 ...
随机推荐
- JDBC工具类实现登陆验证-Java(新手)
JDBC工具类: package cn.chuang.JdbcDome; import java.sql.*; public class JdbcUtilss { private static fin ...
- 项目部署Django+celery+redis
celery介绍 1.celery应用举例 1.Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以 ...
- F版本SpringCloud1—大白话为啥要有微服务?啥是微服务?SpringCloud为什么有那么多组件?
前言 为什么要有微服务呢? 什么是微服务? SpringCloud 中为什么会有那么多的组件? ...... 作为SpringCloud教程的第一篇,不讲解具体的技术使用,通过一个通俗易懂的小故事,来 ...
- WEB应用之httpd基础入门(一)
前文我们聊了下http协议web服务的一些常识和httpd服务器软件三种响应模型的简单介绍,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12515075.ht ...
- 超实用的Flask入门基础教程,新手必备!
Flask入门基础教程 Flask简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活.轻便.安全且容易上手.它可以很好地结合MVC模式进行开发,开发人员分工合 ...
- javaweb_HTML
第一章:网页的构成 1.1概念:b/s与c/s 1.1.1 现在的软件开发的整体架构主要分为B/S架构与C/S架构: b/s:浏览器/服务器 c/s:客户端/服务器 客户端:需要安装在系统里,才可使用 ...
- AspNetCore3.1_Secutiry源码解析_8_Authorization_授权框架
目录 AspNetCore3.1_Secutiry源码解析_1_目录 AspNetCore3.1_Secutiry源码解析_2_Authentication_核心流程 AspNetCore3.1_Se ...
- CVE-2019-3396:Confluence未授权模板注入_代码执行
title: Confluence未授权模板注入/代码执行(CVE-2019-3396) tags: [poc,cve] 简介 Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企 ...
- Django 支付宝付款接口的使用
我们在开发的过程中经常会碰到调用微信或者支付宝接口进行付款,付款完成之后,如果用户绑定了我的账号,我只要有活动了,就要给这个关注我的用户推动消息,让用户知道,比如说,我们经常会关注一些公众号,然后这些 ...
- spring 请求静态资源文件
在springMVC项目中使用restful风格写,需要到web.xml配置全拦截. <servlet> <servlet-name>springmvc</ ...