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中的使用的更多相关文章

  1. Java 中正确使用 hashCode 和 equals 方法

    在这篇文章中,我将告诉大家我对hashCode和equals方法的理解.我将讨论他们的默认实现,以及如何正确的重写他们.我也将使用Apache Commons提供的工具包做一个实现. 目录: hash ...

  2. K:java中的hashCode和equals方法

      hashCode和equals方法是Object类的相关方法,而所有的类都是直接或间接的继承于Object类而存在的,为此,所有的类中都存在着hashCode和equals.通过翻看Object类 ...

  3. (转)Java 中正确使用 hashCode 和 equals 方法

    背景:最近在编写持久化对象时候遇到重写equals和hashCode方法的情况,对这两个方法的重写做一个总结. 链接:https://www.oschina.net/question/82993_75 ...

  4. 关于java中的hashcode和equals方法原理

    关于java中的hashcode和equals方法原理 1.介绍 java编程思想和很多资料都会对自定义javabean要求必须重写hashcode和equals方法,但并没有清晰给出为何重写此两个方 ...

  5. Java中Set的contains()方法——hashCode与equals方法的约定及重写原则

    转自:http://blog.csdn.net/renfufei/article/details/14163329 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashC ...

  6. Java中正确使用hashCode和equals方法

    在这篇文章中,我将告诉大家我对hashCode和equals方法的理解.我将讨论他们的默认实现,以及如何正确的重写他们.我也将使用Apache Commons提供的工具包做一个实现. 目录: hash ...

  7. 用HashSet的add方法谈hashcode和equals方法重写

    本文主要通过用HashSet的add方法讲一下hashCode和equals方法重写.错误的地方望指正. 1.了解HashSet的add方法 了解一个方法的好办法是看源码,所以先看源码 private ...

  8. JAVA中的各种 哈希码(HashCode) 与 equals方法在HIBERNATE的实际应用[转载]

    1.什么是哈希码(HashCode) 在Java中,哈希码代表对象的特征.例如对象 Java代码 String str1 = “aa”, str1.hashCode= 3104 String str2 ...

  9. 为什么要重写hashcode和equals方法?初级程序员在面试中很少能说清楚。

    我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...

随机推荐

  1. webpack从0到1超详细超基础学习教程

    概念 自己是一个一听到webpack就头大,看着一堆不知道那是什么玩意的东西总觉得自己做好前端就行了,但是在使用vue-cli的时候总觉得要改其中的一些东西进行项目初始化的时候能够更好使用!所以想要根 ...

  2. 【django】 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求

    如果是后台上传文件: setting配置: STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ...

  3. 数据库--Redis

    原因: 源码是官方configure过的,但官方configure时,生成的文件有时间戳信息,所以如果你的虚拟机的时间不对,比如说是2022年,就可能会出错 解决: date -s ‘yyyy-mm- ...

  4. 研究开源源码之Myrmec

    好久没写博客了,自己也弄不清是懒了还是忙了.毕竟白天需要工作,晚上有时候看看资料,有时候陪家人,有时候约朋友......更加累了,可能由于累了就懒得总结了. 今天有同事问我关于代码检查文件类型的问题. ...

  5. disruptor 链路实战 三

    一.创建Event类 Trade import java.util.concurrent.atomic.AtomicInteger; public class Trade { private Stri ...

  6. HashMap 速描

    HashMap 速描 之前简单的整理了Java集合的相关知识,发现HashMap并不是三言两语能够讲明白的,所以专门整理一下HashMap的相关知识. HashMap 存储结构 HashMap是一个哈 ...

  7. 将root用户权限赋予普通用户

    将root用户权限赋予普通用户 普通用户想要拥有root用户的权限,必须修改/etc/sudoers文件 ,还必须使用visudo命令修改.一是因为这个命令能防止多个用户同时修改这个文件,二是能进行有 ...

  8. JS循环嵌套的执行原理

    [逆战班] 循环嵌套是指在一个循环语句中再定义一个循环语句的语法结构,外循环执行一次,内循环全部执行完,直到外循环执行完毕,整个循环结束. while.do.. while和for循环语句都可以进行嵌 ...

  9. C++ 随机函数/伪随机函数

    使用rand()函数时,每次随机数都是固定(伪随机数),在前面加上以下函数,每次生成的随机数为随机, srand((int)time(NULL)); rand();

  10. python基础学习day02

    pycharm的安装以及简单使用 辅助开发软件,代码逐行调试,设计高端 python的种类: ​ CPython:官方推荐可以转换成c能够识别的字节码. ​ JPython:可以转化为Java语言能够 ...