一、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

package com.bjpowernode.java_learning;

​

import java.util.HashSet;

import java.util.Set;

import java.util.Iterator;

​

public class D88_2_ {

  public static void main(String[] args) {

    Set s = new HashSet();

    s.add(1);

    s.add(1);

    s.add(100);

    Iterator i = s.iterator();

    while(i.hasNext()) {

      System.out.println(i.next());

    } 

  }

}

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

package com.bjpowernode.java_learning;

import java.util.*;

​

public class D88_2_HasCodeAndEqualsMethod {

  public static void main(String[] args) {

    //创建集合

    Set s = new HashSet();

    Employee88 e1 = new Employee88("1000","Jack");

    Employee88 e2 = new Employee88("1001","Jack");

    Employee88 e3 = new Employee88("1001","Scott");

    Employee88 e4 = new Employee88("1000","Jack");

    Employee88 e5 = new Employee88("3000","JIN");

    Employee88 e6 = new Employee88("3001","Cook");

    //添加元素

    s.add(e1);

    s.add(e2);

    s.add(e3);

    s.add(e4);

    s.add(e5);

    s.add(e6);

    System.out.println(s.size());

  }

}

//根据现实的业务逻辑可以得知,该公司的员工编号是:1000-9999

class Employee88{

  //编号

  String no;

  //姓名

  String name;

  //Constructor

  Employee88(String no,String name){

    this.no = no;

    this.name = name;

  }

  //我们下面重写了hashCode方法的目的就是:

  //能够对同工号同名字的员工判断为同一个元素

  //如果不重写hashCode方法,那么会对对象的内存地址进行hashCode计算,这样就不会有相同的元素了

  //重写hashCode方法之后,相同的hashCode值,就会接下来的判断

  //也就是重写equals方法

  //如果员工编号相同,并且名字相同,则是同一个对象

  public boolean equals(Object o) {

    if(this==o) {

      return true;

    }

    if(o instanceof Employee88) {

      Employee88 e = (Employee88)o;

      if(e.no.equals(this.no) && e.name.equals(this.name)) {

        return true;

      }

    }

    return false;

  }

  //重写hashCode方法

  public int hashCode() {

    //以员工编号分组

    return no.hashCode();

  }

}

​

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

总结​:存储在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. JVM性能优化系列-(3) 虚拟机执行子系统

    3. 虚拟机执行子系统 3.1 Java跨平台的基础 Java刚诞生的宣传口号:一次编写,到处运行(Write Once, Run Anywhere),其中字节码是构成平台无关的基石,也是语言无关性的 ...

  2. ROS和Gazebo进行机器人仿真(一)

    Gazebo是一种多机器人仿真器,可用于室内外机器人仿真.Gazebo在ROS中有良好的接口,包含ROS和Gazebo的所有控制. 若要实现ROS到Gazebo的通信,我们必须安装ROS-Gazebo ...

  3. 8、OSPF

    OSPF ---最短路径优先 用于在单一自治系统(Autonomous System-AS)内决策路由 自制系统(AS)AS: 执行统一路由策略的一组网络设备的组合可适应大规模的网络: ·    路由 ...

  4. Exchange2010安装指南

    安装流程参考下面的: https://jingyan.baidu.com/article/2c8c281d6893680008252a9c.html 安装环境:windows server 2008( ...

  5. Multi-hierarchical Independent Correlation Filters for Visual Tracking(MFT)略读

    作者写道: 有幸在本届的VOT 2018 主赛中,我们的参赛方案Multi-solution Fusion for Visual Tracking(MFT)获得第一名的成绩,通过结果来看,MFT无论在 ...

  6. 在家想自学Java,有C语言底子,请问哪本书适合?

    一.问题剖析 看到这个问题,我想吹水两句再做推荐.一般发出这个疑问都处在初学编程阶段,编程语言都是相通的,只要你领悟了一门语言的"任督二脉",以后你学哪一门语言都会轻易上手.学语言 ...

  7. Go语言实现:【剑指offer】反转链表

    该题目来源于牛客网<剑指offer>专题. 输入一个链表,反转链表后,输出新链表的表头. Go语言实现: 迭代: /** * Definition for singly-linked li ...

  8. 浅谈Go语言的Goroutine和协程

    0x00.前言 前面写了一篇初识Go语言和大家一起学习了Go语言的巨大潜力.语言简史.杀手锏特性等,感兴趣的读者可以回顾一下. 今天来学习Go语言的Goroutine机制,这也可能是Go语言最为吸引人 ...

  9. 使用java基础实现一个简陋的web服务器软件

    使用java基础实现一个简陋的web服务器软件 1.写在前面 大学已经过了一年半了,从接触各种web服务器软件已经有一年多了,从大一上最开始折腾Windows电脑自带的IIS开始,上手了自己的第一个静 ...

  10. linux的目录结构知识

    1. Linux的目录结构知识图解 2. linux下应用程序组成及文件目录定义 #二进制程序: /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/l ...