集合之HashSet应用思路

举报
brucexiaogui 发表于 2021/12/30 01:36:20 2021/12/30
【摘要】                                      集合之HashSet应用思路   一、为什么要重写hashc...

                                     集合之HashSet应用思路

 

一、为什么要重写hashcode和equals两个方法

我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类。Ojbect类中有两个方法equals、hashCode,这两个方法都是用来比较两个对象是否相等的。

在未重写equals方法我们是继承了object的equals方法那里的 equals是比较两个对象的内存地址,显然我们new了2个对象内存地址肯定不一样

  • 对于值对象,==比较的是两个对象的值
  • 对于引用对象,比较的是两个对象的地址

默认的equals方法同==,但是一般来说我们的对象都是引用对象,要重写equals方法(将对象地址比较重写为对象的值比较)。

所以如果我们对equals方法进行了重写,建议一定要对hashCode方法重写,以保证相同的对象返回相同的hash值,不同的对象返回不同的hash值。

 

二、在什么情况下需要重写hashcode和equals两个方法

想要搞清楚什么情况下重写hashcode和equals方法就的先知道集合在项目中使用场景。

1、集合在项目中使用的场景:首先用户在前端页面填写一个用户信息表单提交(用户表单的会员ID要求不能重复)--------请求通过post方式调用java服务端代码-----服务端的hashset代码在执行add()添加方法的时候就会调用hashcode和equals两个方法判断会员ID是否已存在(所以如果我们对equals方法进行了重写,同时一定要对hashCode方法重写),如果存在则不添加,不存在就将数据添加到数据库。

三、HashSet应用实例

现在有一个学生类登记表单填写,ID、学号、姓名(要求ID不能重复)。HashSet存放Student类对象,需要判断Student对象里面的ID是否存在。这个时候就需要在Student类中将hashcode和equals方法对ID进行判断进行重写。

1hashcode和equals方法重写在IEDA中生成的快捷方法

 

2、代码示例


  
  1. package day15;
  2. import java.util.HashSet;
  3. import java.util.Iterator;
  4. import java.util.Objects;
  5. import java.util.Set;
  6. class Student extends Object{
  7. public long id;
  8. public String sn;//学号
  9. public String name;
  10. @Override
  11. //1、重写equals方法对ID对象值是否相等进行判断
  12. public boolean equals(Object o) {
  13. if (this == o) return true;
  14. if (o == null || getClass() != o.getClass()) return false;
  15. Student student = (Student) o;
  16. return id == student.id;
  17. }
  18. @Override
  19. //2、重写hashCode方法对ID对象值是否相等进行判断
  20. public int hashCode() {
  21. return (int) (id ^ (id >>> 32));
  22. }
  23. }
  24. public class SetDemo2 {
  25. public static void main(String[]args){
  26. //3、实例化HashSet类的对象
  27. Set set = new HashSet();
  28. //4、实例化Student对象
  29. Student e = new Student();
  30. //5、添加Student对象属性值
  31. e.id = 001;
  32. e.name = "张三";
  33. e.sn = "s1";
  34. //6、将Student对象添加到HashSet集合中
  35. ((HashSet) set).add(e);
  36. System.out.println("=====================第一次集合添加对象的值输出=======================");
  37. System.out.println(e.id+e.name+e.sn);
  38. //7、Student对象再次添加ID和第一次添加ID值一样
  39. Student e2 = new Student();
  40. e2.id = 001;
  41. e2.name = "李四";
  42. e2.sn = "s2";
  43. //8、boolean值判断第二次添加已存在的ID值是否存到set集合中
  44. boolean b = set.add(e2);
  45. System.out.println("======================第二次ID是否添加到Set集合中===============:"+b);
  46. //9、Iterator和数组两种方式遍历集合输出对象
  47. System.out.println("==================Iterator和数组两种方式遍历集合输出对象===================");
  48. //10、Iterator输出HashSet集合中对象的值。
  49. Iterator it = set.iterator(); //set调用iterator方法
  50. while (it.hasNext()){
  51. Student s = (Student) it.next(); //Iterator类型转换成Student类型调用Student类中的方法。
  52. System.out.println("===========Iterator方式输出HashSet集合对象存储的值:"+s.id+","+s.name+s.sn);
  53. }
  54. //11、数组方式输出HashSet集合中的对象的值
  55. Object[] obj = set.toArray();
  56. for(int i=0;i<obj.length;i++){
  57. Student s = (Student)obj[i]; //Obj类型转换成Student类型调用Student类中的方法。
  58. System.out.println("---------数组方式输出HashSet集合对象存储的值:"+s.id+","+s.name+","+s.sn);
  59. }
  60. }
  61. }

 

结果:

 

文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。

原文链接:brucelong.blog.csdn.net/article/details/85114682

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。