问题:

  1. package day30_HashSet;
  2.  
  3. import java.util.HashSet;
  4.  
  5. /*
  6. * 通过hashset存储自定义对象,没有进行去重。
  7. *
  8. * */
  9. public class HashSetSutdentDemo {
  10.  
  11. public static void main(String[] args) {
  12. //创建集合对象
  13. HashSet<Student> hs = new HashSet<Student>();
  14.  
  15. //创建元素对象
  16. Student st = new Student("aa",20);
  17. Student st2 = new Student("bb",18);
  18. Student st3 = new Student("bb",18);
  19. //添加元素对象
  20. hs.add(st);
  21. hs.add(st2);
  22. hs.add(st3);
  23.  
  24. //遍历集合对象
  25. for (Student s : hs) {
  26. System.out.println(s);
  27. }
  28.  
  29. }
  30. }
  31.  
  32. class Student {
  33. String name;
  34. int age;
  35.  
  36. public Student(String name,int age) {
  37. this.name = name;
  38. this.age = age;
  39. }
  40.  
  41. @Override
  42. public String toString() { //默认输出的是student的地址值,重写tostring方法
  43. return "Student{" +
  44. "name='" + name + '\'' +
  45. ", age=" + age +
  46. '}';
  47. }
  48. }

输出

解决:

HashSet 的 add方法使用的是 hashcode 和equals进行比较

需要重写hashcode 和equals

  1. package day30_HashSet;
  2.  
  3. import java.util.HashSet;
  4. import java.util.Objects;
  5.  
  6. /*
  7. * 使用HashSet存储自定义对象并遍历
  8. * 通过查看源码发现:
  9. * HashSet的add()方法,首先会使用当前集合中的每一个元素和新添加的元素进行hash值比较,
  10. * 如果hash值不一样,则直接添加新的元素
  11. * 如果hash值一样,比较地址值或者使用equals方法进行比较
  12. * 比较结果一样,则认为是重复不添加
  13. * 所有的比较结果都不一样则添加
  14.  
  15. */
  16. public class HashSetStudentDemo2 {
  17. public static void main(String[] args) {
  18. HashSet<Student2> hs = new HashSet<Student2>();
  19. //创建元素对象
  20. Student2 s = new Student2("zhangsan",18);
  21. Student2 s2 = new Student2("lisi",19);
  22. Student2 s3 = new Student2("lisi",19);
  23. //添加元素对象
  24. hs.add(s);
  25. hs.add(s2);
  26. hs.add(s3);
  27. //遍历集合对象
  28. for (Student2 student : hs) {
  29. System.out.println(student);
  30. }
  31. }
  32. }
  33.  
  34. class Student2 {
  35. String name;
  36. int age;
  37.  
  38. public Student2(String name,int age) {
  39. this.name = name;
  40. this.age = age;
  41. }
  42.  
  43. @Override
  44. public String toString() {
  45. return "Student2{" +
  46. "name='" + name + '\'' +
  47. ", age=" + age +
  48. '}';
  49. }
  50.  
  51. @Override
  52. public boolean equals(Object o) {
  53. if (this == o) return true;
  54. if (o == null || getClass() != o.getClass()) return false;
  55. Student2 student2 = (Student2) o;
  56. return age == student2.age &&
  57. Objects.equals(name, student2.name);
  58. }
  59.  
  60. @Override
  61. public int hashCode() {
  62.  
  63. return Objects.hash(name, age);
  64. }
  65. }

30.1 HashSet存储自定义对象 未去重解决的更多相关文章

  1. Java基础知识强化之集合框架笔记40:Set集合之HashSet存储自定义对象并遍历

    1. HashSet存储自定义对象并遍历 2. 代码示例: (1)Student类,如下: package cn.itcast_02; /** * @author Administrator * */ ...

  2. 《java入门第一季》之HashSet存储自定义对象问题以及注意事项

    上一篇http://blog.csdn.net/qq_32059827/article/details/51578158 写到存储字符串类型的时候出现了无序,而且这个无序不是随机那种无序,它是有一定存 ...

  3. 用HashSet存储自定义对象

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

  4. Java基础知识强化之集合框架笔记41:Set集合之HashSet存储自定义对象并遍历练习

    1. HashSet集合存储自定义对象并遍历.如果对象的成员变量值相同即为同一个对象 注意了: 你使用的是HashSet集合,这个集合的底层是哈希表结构. 而哈希表结构底层依赖:hashCode()和 ...

  5. 集合框架-HashSet存储自定义对象

    1 package cn.itcast.p4.hashset.test; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 6 ...

  6. 集合框架(HashSet存储自定义对象保证元素唯一性)

    HashSet如何保证元素唯一性的原理 1.HashSet原理 a. 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降 ...

  7. JavaSE 集合类HashSet保证自定义对象唯一性

    首先我们自定义Person类,只有姓名和年龄两个属性 class Person{ private String name ; private int age ; public Person(Strin ...

  8. Java基础知识强化之集合框架笔记24:ArrayList存储自定义对象并遍历

    1. ArrayList存储自定义对象并遍历 2. 代码示例: Student.java,如下: package cn.itcast_01; public class Student { privat ...

  9. NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象

    摘要: NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的 ...

随机推荐

  1. JDBC工具类实现登陆验证-Java(新手)

    JDBC工具类: package cn.chuang.JdbcDome; import java.sql.*; public class JdbcUtilss { private static fin ...

  2. 项目部署Django+celery+redis

    celery介绍 1.celery应用举例 1.Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,   如果你的业务场景中需要用到异步任务,就可以 ...

  3. F版本SpringCloud1—大白话为啥要有微服务?啥是微服务?SpringCloud为什么有那么多组件?

    前言 为什么要有微服务呢? 什么是微服务? SpringCloud 中为什么会有那么多的组件? ...... 作为SpringCloud教程的第一篇,不讲解具体的技术使用,通过一个通俗易懂的小故事,来 ...

  4. WEB应用之httpd基础入门(一)

    前文我们聊了下http协议web服务的一些常识和httpd服务器软件三种响应模型的简单介绍,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12515075.ht ...

  5. 超实用的Flask入门基础教程,新手必备!

    Flask入门基础教程 Flask简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活.轻便.安全且容易上手.它可以很好地结合MVC模式进行开发,开发人员分工合 ...

  6. javaweb_HTML

    第一章:网页的构成 1.1概念:b/s与c/s 1.1.1 现在的软件开发的整体架构主要分为B/S架构与C/S架构: b/s:浏览器/服务器 c/s:客户端/服务器 客户端:需要安装在系统里,才可使用 ...

  7. AspNetCore3.1_Secutiry源码解析_8_Authorization_授权框架

    目录 AspNetCore3.1_Secutiry源码解析_1_目录 AspNetCore3.1_Secutiry源码解析_2_Authentication_核心流程 AspNetCore3.1_Se ...

  8. CVE-2019-3396:Confluence未授权模板注入_代码执行

    title: Confluence未授权模板注入/代码执行(CVE-2019-3396) tags: [poc,cve] 简介 Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企 ...

  9. Django 支付宝付款接口的使用

    我们在开发的过程中经常会碰到调用微信或者支付宝接口进行付款,付款完成之后,如果用户绑定了我的账号,我只要有活动了,就要给这个关注我的用户推动消息,让用户知道,比如说,我们经常会关注一些公众号,然后这些 ...

  10. spring 请求静态资源文件

    在springMVC项目中使用restful风格写,需要到web.xml配置全拦截. <servlet>        <servlet-name>springmvc</ ...