说实话,工作以来,hashcode一直知道,但是怎么用,为什么要重写重来没深究过,这次搞明白了,也分享一下。
equals方法在对象比较的时候相信大家都重写过,但是重写equals的同时重写hashcode方法,我所知道的大多数人是没有作这个操作的。
首先来说下,为什么要重写equals,如果不重写,那么默认比较的是对象的引用
public class Test3 {
private String name;
private String code;
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public static void main(String[] args) {
Test3 t1 = new Test3();
Test3 t2 = new Test3();
System.out.println(t1.equals(t2));
}
}
这段代码的执行结果是false,因为t1和t2都是一个新的对象,那么在工作中,很多时候我们会遇到比较2个对象要求其中几个值相同即可的情况,列如下面
public class Test3 {
private String name;
private String code;
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Test3){
return ((Test3) obj).getName().equals(name);
}
return super.equals(obj);
}
public static void main(String[] args) {
Test3 t1 = new Test3();
t1.setName("gk测试");
t1.setCode("1001");
Test3 t2 = new Test3();
t2.setName("gk测试");
t1.setCode("1002");
System.out.println(t1.equals(t2));
}
}
执行结果:true
重写equals之后只要name相同那么对象就会被认为相同。
说完了equals,来说一下hashcode,什么时候的比较会用到hashcode呢,Set和HashMap,大家都知道Set和HashMap的key值都备唯一性,那么这个唯一性是怎么判断的呢,不是简单的equals,试想一下,如果是equals,那么当装载数据量比较大的时候,岂不是每次数据新增都会equals 很多次,如果有10万条数据呢,这个显然是不现实的。实际上,Set和HashMap装载数据的时候都是先调用hashcde,如果hashcode不一样,那么就不会在进行一下比较了,如果hashcode存在,那么才会进行equals,这个时候的equals次数就非常少了,因为hashcode都确定了,这里得出一个结论,hashcode相同的对象不一定相同,但是hashcode不同的对象一定不同。
还是来段代码
public class Test3 {
private String name;
private String code;
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Test3){
return ((Test3) obj).getName().equals(name);
}
return super.equals(obj);
}
public static void main(String[] args) {
Test3 t1 = new Test3();
t1.setName("gk测试");
t1.setCode("1001");
Test3 t2 = new Test3();
t2.setName("gk测试");
t1.setCode("1002");
Set<Object> set = new HashSet<Object>();
set.add(t1);
set.add(t2);
System.out.println(set.size());
}
}
上面代码执行出来为2,这表明t1和t2并不被认为是相同的,但是刚刚equals的话t1和t2是相同的,接下来我在重写hashcode
public class Test3 {
private String name;
private String code;
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Test3){
return ((Test3) obj).getName().equals(name);
}
return super.equals(obj);
}
@Override
public int hashCode() {
return name.hashCode();
}
public static void main(String[] args) {
Test3 t1 = new Test3();
t1.setName("gk测试");
t1.setCode("1001");
Test3 t2 = new Test3();
t2.setName("gk测试");
t1.setCode("1002");
Set<Object> set = new HashSet<Object>();
set.add(t1);
set.add(t2);
System.out.println(set.size());
}
}
重写hashcode之后,现在发现执行结果是1,t1和t2被认为是相同的对象了。
分享到:
相关推荐
hashCode 的用法详解 hashCode 是一种用于查找和排序的机制,在数据结构中 plays a crucial role。下面我们将对 hashCode 的用法进行详细的解释。 hashCode 的作用 hashCode 的主要作用是用于查找和排序。在查找...
### 深入理解 HashCode 方法 #### 一、HashCode 的基本概念与作用 在 Java 编程语言中,`HashCode` 是一个非常重要且基础的概念。简单来说,`HashCode` 是一个整数值,用于快速定位对象的位置。在 Java 中,每一个...
"Java中Hashcode的作用" Hashcode是Java编程语言中一个非常重要的概念,它在equals方法中扮演着关键角色。在Java中,每个对象都具有一个独特的Hashcode,它可以用来标识对象的身份。但是Hashcode是什么?它是如何...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...
### HashCode的作用详解 #### 一、HashCode的基本概念 在Java中,`hashCode()` 方法是 `Object` 类的一个重要成员方法,它返回一个整数,这个整数通常用来表示对象的哈希值。哈希值在Java集合框架中扮演着至关重要...
equals 与 hashCode 方法讲解 equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java...
《深入HashCode》 在计算机科学领域,特别是在Java和许多其他面向对象编程语言中,`hashCode()`方法是一个至关重要的概念。这个方法是每个对象都具备的,它返回一个整数值,通常用于快速比较对象或者在哈希表(如...
### hashCode的作用 在Java编程语言中,`hashCode`方法是一个重要的概念,主要用于对象的查找与存储,尤其是在集合框架中有着广泛的应用。为了更好地理解`hashCode`的作用及其在实际开发中的重要性,我们可以从以下...
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个...
本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...
### 复写`hashCode()`方法与`equals()`方法 在Java编程中,`hashCode()`方法与`equals()`方法是对象比较中的两个非常重要的方法。它们主要用于判断对象是否相等以及对象的散列值,这对于集合类(如`HashSet`)来说...
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
PPT浅析hashcode定义和作用;和简单的代码演示PPT.很简单的
1,如果两个对象相同,那么它们的hashCode值一定要相同; 2,如果两个对象的hashCode相同,它们并不一定相同 上面说的对象相同指的是用eqauls方法比较。 3,HashCode码不唯一
在Java编程语言中,`hashCode()`和`equals()`方法是对象身份验证的关键组成部分,它们主要用于对象的比较和哈希表(如HashMap、HashSet等)的操作。理解这两个方法的工作原理对于编写高效和可靠的代码至关重要。 ...
java中hashCode()的理解
本主题将深入探讨如何利用反射技术绕过编译器的一些限制,并介绍hashcode在高级应用中的用法。 首先,让我们理解反射的基本概念。在Java中,反射提供了一种方式,使我们能够在运行时动态地获取类的信息(如类名、...
### Java中`hashCode()`与`equals()`方法详解 #### 前言 在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将...