关于HashCode和equals方法在HashSet中的使用
Object类是类层次结构的根类,故所有的类都是先该类的方法,其中HashCode()和equals()方法也是该类的方法。
1.HashCode()方法
Object类中HashCode()方法实现如下:
public native int hashCode();
返回:该对象的哈希值,可提高哈希表的性能。
HashCode:
1.同一对象多次调用HashCode()方法,返回一直的整数,从某一程序的依次执行到同一程序的另一次执行,该整数无需保持一致;
2.使用equals(Object)方法两个对象是相等的,那么两个对象返回的Hash值完全一致;
3. 使用equals(Object)方法两个对象不相等,其返回的Hash值有可能相等。
下面摘录API中String的HashCode()方法及相关属性:
private final char value[];
private int hash; // Default to 0
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
给定一个字符串,相当于在执行构造方法:
public String() {
this.value = new char[0];
}
此时,value值已经给定,此构造方法下value.length=0,显然hash=h=0(默认值为0,也就是空字符串),重在理解过程,哈希算法看API文档就好。
String s = new String();
System.out.Println(s.HashCode());
结果:0
2.equals()方法
Object类中equals()方法的实现如下:
public boolean equals(Object obj) {
return (this == obj);
}
指示其他某个对象是否与此对象参数相同,相同返回true,反之。equals()方法在非空对象引用(obj)上实现相等关系,对于任何非空引用值x,x.equals(null)都应返回false。String等类都会覆盖Object类中的方法。
3.类HashSet
HashSet是Set接口的一个实现类,不能重复添加对象值,这个过程主要由Hash值和对象的equals()方法判断,使用add()方法添加某种类型对象
//测试类
package com.test;
//测试类,该类重写了从Object继承而来的HashCode()和equals()方法
public class StudentTest {
private String name;
private int age;
public StudentTest(){}
public StudentTest(String name, int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}
//HashSet类
package com.test;
import java.util.HashSet;
import java.util.Set;
public class SetDemo {
public static void main(String[] args) {
Set<StudentTest> set1 = new HashSet<>();
StudentTest s1 = new StudentTest("manu",10);
StudentTest s2 = new StudentTest("manu",10);
// set1.add(null);//此处null元素可以使用
set1.add(s1);
System.out.println(s1.hashCode());
set1.add(s2);
System.out.println(s2.hashCode());
System.out.println(set1.size());
}
}
运行结果:
794284386
779325750
2
上面s1、s2是两个对象,每一次添加对象是hash值都不同,故该对象可以添加到HashSet中,其size=2,上面涉及到一个问题,某个对象的属性一致,如果不想将属性一致的对象再一次添加进去,则必须重写StudentTest类的HashCode()方法和equals()方法,经过重写两者hash相同,在用equals方法来验证,返回true,表示两个对象重复,反之。代码如下:
@Override
public int hashCode() {
System.out.println("hashCode");//用于测试
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
System.out.println("equals");//用于测试
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
StudentTest other = (StudentTest) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
此时运行结果如下:
hashCode
hashCode
3345234
hashCode
equals
hashCode
3345234
1
两者不同的对象,属性值一致,但不能添加到HashSet中,注意需求的变化。
在HashSet中添加元素时,若hash值不一致,则可以添加;若hash值一致,调用equals方法看对象是否相同,不同(false)则可以添加。注意equals判断,某两个对象不同,hash值可能相同,上述示例中hash值相同,但s1和s2是两个不同对象。
关于HashCode和equals方法在HashSet中的使用的更多相关文章
- Java 中正确使用 hashCode 和 equals 方法
在这篇文章中,我将告诉大家我对hashCode和equals方法的理解.我将讨论他们的默认实现,以及如何正确的重写他们.我也将使用Apache Commons提供的工具包做一个实现. 目录: hash ...
- K:java中的hashCode和equals方法
hashCode和equals方法是Object类的相关方法,而所有的类都是直接或间接的继承于Object类而存在的,为此,所有的类中都存在着hashCode和equals.通过翻看Object类 ...
- (转)Java 中正确使用 hashCode 和 equals 方法
背景:最近在编写持久化对象时候遇到重写equals和hashCode方法的情况,对这两个方法的重写做一个总结. 链接:https://www.oschina.net/question/82993_75 ...
- 关于java中的hashcode和equals方法原理
关于java中的hashcode和equals方法原理 1.介绍 java编程思想和很多资料都会对自定义javabean要求必须重写hashcode和equals方法,但并没有清晰给出为何重写此两个方 ...
- Java中Set的contains()方法——hashCode与equals方法的约定及重写原则
转自:http://blog.csdn.net/renfufei/article/details/14163329 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashC ...
- Java中正确使用hashCode和equals方法
在这篇文章中,我将告诉大家我对hashCode和equals方法的理解.我将讨论他们的默认实现,以及如何正确的重写他们.我也将使用Apache Commons提供的工具包做一个实现. 目录: hash ...
- 用HashSet的add方法谈hashcode和equals方法重写
本文主要通过用HashSet的add方法讲一下hashCode和equals方法重写.错误的地方望指正. 1.了解HashSet的add方法 了解一个方法的好办法是看源码,所以先看源码 private ...
- JAVA中的各种 哈希码(HashCode) 与 equals方法在HIBERNATE的实际应用[转载]
1.什么是哈希码(HashCode) 在Java中,哈希码代表对象的特征.例如对象 Java代码 String str1 = “aa”, str1.hashCode= 3104 String str2 ...
- 为什么要重写hashcode和equals方法?初级程序员在面试中很少能说清楚。
我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...
随机推荐
- 原生js写一个无缝轮播图插件(支持vue)
轮播图插件(Broadcast.js) 前言:写这个插件的原因 前段时间准备用vue加上网易云的nodejs接口,模拟网易云音乐移动端.因为想自己写一遍所有的代码以及加固自己的flex布局,所以没有使 ...
- cocoapods相关的知识点
目录 1.安装和卸载cocoapods 安装 卸载 2.常规问题解决思路 50%报错问题可以通过 pod install或者pod update解决 指定swift编译版本 由于墙的原因,可能会ins ...
- Everything-快速找到你的文件,电脑前的你值得拥有
如果你也是一位电脑使用者,那么你可以考虑下载这个"Everything". Everything是一款非常非常强大的软件.相信不少电脑用户,特别是Windows用户,都尝试使用过W ...
- Springboot与Maven多环境配置文件夹解决方案
Profile用法 我们在application.yml中为jdbc.name赋予一个值,这个值为一个变量 jdbc: username: ${jdbc.username} Maven中的profil ...
- python之嵌套 闭包 装饰器 global、nonlocal关键字
嵌套: 在函数的内部定义函数闭包: 符合开放封闭原则:在不修改源代码与调用方式的情况下为函数添加新功能 # global 将局部变量变成全局变量 num = 100 def fn1(): globa ...
- 复盘MySQL分页查询优化方案
一.前言 MySQL分页查询作为Java面试的一道高频面试题,这里有必要实践一下,毕竟实践出真知. 很多同学在做测试时苦于没有海量数据,官方其实是有一套测试库的. 二.模拟数据 这里模拟数据分2种情况 ...
- 日常破解--从XCTF的app3题目简单了解安卓备份文件以及sqliteCipher加密数据库
一.题目来源 题目来源:XCTF app3题目 二.解题过程 1.下载好题目,下载完后发现是.ab后缀名的文件,如下图所示: 2.什么是.ab文件?.ab后缀名的文件是Andr ...
- 转:标签中的href如何调用js
在HTML中,<a>标签的href属性用于指定超链接的目标的URL.在所有浏览器中,链接的默认外观是: 未被访问的链接带有下划线而且是蓝色的 已被访问的链接带有下划线而且是紫色的 活动 ...
- PostgreSQL查询表以及字段的备注
目录 查询所有表名称以及字段含义 查看所有表名 查看表名和备注 查看特定表名备注 查看特定表名字段 查询所有表名称以及字段含义 select c.relname 表名,cast(obj_descrip ...
- Python接口测试(第一个接口返回的数据作为第二个参数的入参)
python代码如下 import requests url1="http://localhost:8080/pinter/com/getSku?id=1" respon=requ ...