Java连载88-HashSet集合与hashCode方法重写
一、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方法重写的更多相关文章
- Java基础系列-equals方法和hashCode方法
原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述 equals方法和hashCode方法都是有Object类定义的. publi ...
- java基础(十六)----- equals()与hashCode()方法详解 —— 面试必问
本文将详解 equals()与hashCode()方法 概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) publi ...
- HashSet集合的add()方法的源码
interface Collection { ... } interface Set extends Collection { ... } class HashSet implements Set { ...
- 【java基础】java中Object对象中的Hashcode方法的作用
以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表. hashCode ...
- Collections -集合排序compareTo方法重写,shuffle,addall
package cn.learn.collection.Collections; /* 排序的对象的类,实现comparable借口,重写compareto方法 若要打印必须重写toString方法, ...
- Java父类对象调用子类实体:方法重写与动态调用
众所周知Java的handle和C++的ponter而不是object对应,我们很熟悉C++的父类pointer调用子类实体的例子,那么对于Java的handle是不是也可以这样呢? 这里我先给一个例 ...
- java集合(3)- Java中的equals和hashCode方法详解
参考:http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...
- Java中的equals和hashCode方法
本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...
- Java中hashCode()方法以及HashMap()中hash()方法
Java的Object类中有一个hashCode()方法: public final native Class<?> getClass(); public native int hashC ...
随机推荐
- 了解人工智能?-百度AI
了解人工智能? 什么是人工智能? 由人创造的"智慧能力",同样具备智慧生物的能力 耳朵=倾听=麦克风=语音识别 ASR Automatic Speech Recognition 嘴 ...
- 基本库使用(urllib,requests)
urllib(request,error,parse,robotparse) request模块 方法:urlopen() {read(),readinto(),getheader(name), ...
- java反射机制梳理
java反射机制梳理 Java反射简介 反射简介 编译和运行 编译时刻加载类是静态加载类.运行时刻加载类是动态加载类 要让Java程序能够运行,那么就得让Java类要被Java虚拟机加载.Java类如 ...
- 外网通过frp进行windows远程文件共享
需求 远程访问位于内网中的文件.例如,家里,公司内. 所需技术 frp windows文件共享 具有公网地址的服务器一台 实现过程 windows文件共享,首先自己在局域网内实现.这不是本文重点. 公 ...
- Leetcode 题目整理-3 Palindrome Number & Roman to Integer
9. Palindrome Number Determine whether an integer is a palindrome. Do this without extra space. clic ...
- eclipse编写代码所遇到的问题
spring方面: 1.Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListabl ...
- Go语言标准库之net/http
Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现. net/http介绍 Go语言内置的net/http包提供了HTTP客户端和服务端的实现. HTTP协议 超文本传输协 ...
- Codeforces_851
A.分三种情况. #include<bits/stdc++.h> using namespace std; int n,k,t; int main() { ios::sync_with_s ...
- Codeforces_512_B
http://codeforces.com/problemset/problem/512/B dp题,因为状态很多,所以用map保存,注意代码中的那个二层循环不能内外换,因为map会自动排序. #in ...
- 题解【RQNOJ PID497 0/1字串问题】
\[ \texttt{Description} \] 编程找出符合下列条件的字符串:①字符串中仅包含 0 和 1 两个字符:②字符串的长度为 n :③字符串中不包含连续重复三次的子串. \[ \tex ...