一、Set集合

1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构。

2.哈希表又称为散列表,哈希表底层是一个数组,这个数组中每一个元素是一个单向链表,每个单向链表都有一个独一无二的hash值,代表数组的下标。在某个单向链表中的每一个节点上的hash值是相等的,hash值实际上是key调用hashCode方法,再通过"hash function"转化成的值。

3.如何向哈希表中添加元素

先调用被存储的key的hashCode方法,经过某个算法得出的hash值,如果在这个哈希表中不存在这个hash值,则直接加入元素。如果该hash值已经存在,继续调用key之间的equals方法,如果equals方法返回false,则将该元素添加。如果equals方法返回true,则放弃添加该元素。

4.HashSet其实是HashMap中的key部分,HashSet有什么特点,HashMap中的key应该具有相同的特点。

5.HashMap和HashSet初始化容量都是16,默认加载因子0.75

  1. package com.bjpowernode.java_learning;
  2.  
  3.  
  4. import java.util.HashSet;
  5.  
  6. import java.util.Set;
  7.  
  8. import java.util.Iterator;
  9.  
  10.  
  11. public class D88_2_ {
  12.  
  13. public static void main(String[] args) {
  14.  
  15. Set s = new HashSet();
  16.  
  17. s.add(1);
  18.  
  19. s.add(1);
  20.  
  21. s.add(100);
  22.  
  23. Iterator i = s.iterator();
  24.  
  25. while(i.hasNext()) {
  26.  
  27. System.out.println(i.next());
  28.  
  29. }
  30.  
  31. }
  32.  
  33. }

二、重写hashCode和equals方法(​有一个原则:散列均匀分布)

  1. package com.bjpowernode.java_learning;
  2.  
  3. import java.util.*;
  4.  
  5.  
  6. public class D88_2_HasCodeAndEqualsMethod {
  7.  
  8. public static void main(String[] args) {
  9.  
  10. //创建集合
  11.  
  12. Set s = new HashSet();
  13.  
  14. Employee88 e1 = new Employee88("1000","Jack");
  15.  
  16. Employee88 e2 = new Employee88("1001","Jack");
  17.  
  18. Employee88 e3 = new Employee88("1001","Scott");
  19.  
  20. Employee88 e4 = new Employee88("1000","Jack");
  21.  
  22. Employee88 e5 = new Employee88("3000","JIN");
  23.  
  24. Employee88 e6 = new Employee88("3001","Cook");
  25.  
  26. //添加元素
  27.  
  28. s.add(e1);
  29.  
  30. s.add(e2);
  31.  
  32. s.add(e3);
  33.  
  34. s.add(e4);
  35.  
  36. s.add(e5);
  37.  
  38. s.add(e6);
  39.  
  40. System.out.println(s.size());
  41.  
  42. }
  43.  
  44. }
  45.  
  46. //根据现实的业务逻辑可以得知,该公司的员工编号是:1000-9999
  47.  
  48. class Employee88{
  49.  
  50. //编号
  51.  
  52. String no;
  53.  
  54. //姓名
  55.  
  56. String name;
  57.  
  58. //Constructor
  59.  
  60. Employee88(String no,String name){
  61.  
  62. this.no = no;
  63.  
  64. this.name = name;
  65.  
  66. }
  67.  
  68. //我们下面重写了hashCode方法的目的就是:
  69.  
  70. //能够对同工号同名字的员工判断为同一个元素
  71.  
  72. //如果不重写hashCode方法,那么会对对象的内存地址进行hashCode计算,这样就不会有相同的元素了
  73.  
  74. //重写hashCode方法之后,相同的hashCode值,就会接下来的判断
  75.  
  76. //也就是重写equals方法
  77.  
  78. //如果员工编号相同,并且名字相同,则是同一个对象
  79.  
  80. public boolean equals(Object o) {
  81.  
  82. if(this==o) {
  83.  
  84. return true;
  85.  
  86. }
  87.  
  88. if(o instanceof Employee88) {
  89.  
  90. Employee88 e = (Employee88)o;
  91.  
  92. if(e.no.equals(this.no) && e.name.equals(this.name)) {
  93.  
  94. return true;
  95.  
  96. }
  97.  
  98. }
  99.  
  100. return false;
  101.  
  102. }
  103.  
  104. //重写hashCode方法
  105.  
  106. public int hashCode() {
  107.  
  108. //以员工编号分组
  109.  
  110. return no.hashCode();
  111.  
  112. }
  113.  
  114. }
  115.  

​解释:六个对象里面有一个完全相同,因此会输出五个元素​;如果不重写的话,就会输出六个元素​。

总结​:存储在HashSet集合或者HashMap集合key部分的元素,需要同时重写hashCode和equals方法​

三、源码:

D88_1_HashSetExample.java

D88_2_HasCodeAndEqualsMethod.java

https://github.com/ruigege66/Java/blob/master/D88_1_HashSetExample.java

https://github.com/ruigege66/Java/blob/master/D88_2_HasCodeAndEqualsMethod.java

2.CSDN:https://blog.csdn.net/weixin_44630050

3.博客园:https://www.cnblogs.com/ruigege0000/

4.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料

Java连载88-HashSet集合与hashCode方法重写的更多相关文章

  1. Java基础系列-equals方法和hashCode方法

    原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述         equals方法和hashCode方法都是有Object类定义的. publi ...

  2. java基础(十六)----- equals()与hashCode()方法详解 —— 面试必问

    本文将详解 equals()与hashCode()方法 概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) publi ...

  3. HashSet集合的add()方法的源码

    interface Collection { ... } interface Set extends Collection { ... } class HashSet implements Set { ...

  4. 【java基础】java中Object对象中的Hashcode方法的作用

    以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表. hashCode  ...

  5. Collections -集合排序compareTo方法重写,shuffle,addall

    package cn.learn.collection.Collections; /* 排序的对象的类,实现comparable借口,重写compareto方法 若要打印必须重写toString方法, ...

  6. Java父类对象调用子类实体:方法重写与动态调用

    众所周知Java的handle和C++的ponter而不是object对应,我们很熟悉C++的父类pointer调用子类实体的例子,那么对于Java的handle是不是也可以这样呢? 这里我先给一个例 ...

  7. java集合(3)- Java中的equals和hashCode方法详解

    参考:http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...

  8. Java中的equals和hashCode方法

    本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...

  9. Java中hashCode()方法以及HashMap()中hash()方法

    Java的Object类中有一个hashCode()方法: public final native Class<?> getClass(); public native int hashC ...

随机推荐

  1. Python3中的super()函数详解

    关于Python3中的super()函数 我们都知道,在Python3中子类在继承父类的时候,当子类中的方法与父类中的方法重名时,子类中的方法会覆盖父类中的方法, 那么,如果我们想实现同时调用父类和子 ...

  2. Python3之MySQL操作

    1.安装pymysql PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,在使用之前需要进行安装,可以使用以下命令安装最新版的 PyMySQL: 1).在cmd命令 ...

  3. mysql--->mysql查看数据库操作记录

    mysql查看数据库操作记录 MySQL的查询日志记录了所有MySQL数据库请求的信息.无论这些请求是否得到了正确的执行.默认文件名为hostname.log.默认情况下MySQL查询日志是关闭的.生 ...

  4. git上传本地代码到远程失败

    出现这种错误的原因是由于我不小心勾选了这个

  5. RSYNC 同步工具

    Rsync 数据同步工具 一.Rsync简介 1.检测一下你的机器上是否已经安装  --->可以通过yum安装  或者  源码 Server  192.168.201.151 Client    ...

  6. linux下oracle调试小知识

    1.oracle 安装下的/u01/diag/rdbms/orcl/HOF/incident目录下是什么文件?答:每当一个错误发生的时候,oracle会创建一个incident,并且分配一个INCID ...

  7. Word文档分节设置页码

    在一篇论文中需要将摘要和目录作为一部分设置罗马数字页码,正文部分设置阿拉伯数字页码. 大致效果如下图所示: 这里面用到了分节符,步骤如下: 1 :点击开始菜单栏下 显示/隐藏编辑标记 2:点击插入菜单 ...

  8. 【vue_django】成功登录后,保存用户

    PS:使用session 保存: // 登录 login() { if (this.username === "" || this.password === "" ...

  9. 小程序图片 mode 设置为 widthFix 图片显示瞬间竖向拉伸变形闪烁

    官方文档中 mode="widthFix"   宽度不变,高度自动变化,保持原图宽高比不变,即设置图片宽度而高度自适应. 但是在实际开发中发现图片在初始加载时瞬间竖向拉伸变形闪烁然 ...

  10. caffe 指定GPU

    caffe默认使用编号为0的gpu, 若它的内存不够或正忙, 即使有其余gpu空闲, caffe也不会使用. 要用哪个gpu, 就要明确指定哪个. 不指定则使用默认. 命令行 ./build/tool ...