`
guoke456
  • 浏览: 9586 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

HASHCODE认知

    博客分类:
  • java
阅读更多
   说实话,工作以来,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 的用法详解 hashCode 是一种用于查找和排序的机制,在数据结构中 plays a crucial role。下面我们将对 hashCode 的用法进行详细的解释。 hashCode 的作用 hashCode 的主要作用是用于查找和排序。在查找...

    深入 HashCode 方法~

    ### 深入理解 HashCode 方法 #### 一、HashCode 的基本概念与作用 在 Java 编程语言中,`HashCode` 是一个非常重要且基础的概念。简单来说,`HashCode` 是一个整数值,用于快速定位对象的位置。在 Java 中,每一个...

    java中Hashcode的作用.docx

    "Java中Hashcode的作用" Hashcode是Java编程语言中一个非常重要的概念,它在equals方法中扮演着关键角色。在Java中,每个对象都具有一个独特的Hashcode,它可以用来标识对象的身份。但是Hashcode是什么?它是如何...

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...

    hashcode的作用

    ### HashCode的作用详解 #### 一、HashCode的基本概念 在Java中,`hashCode()` 方法是 `Object` 类的一个重要成员方法,它返回一个整数,这个整数通常用来表示对象的哈希值。哈希值在Java集合框架中扮演着至关重要...

    equals与hashCode方法讲解

    equals 与 hashCode 方法讲解 equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java...

    深入HashCode

    《深入HashCode》 在计算机科学领域,特别是在Java和许多其他面向对象编程语言中,`hashCode()`方法是一个至关重要的概念。这个方法是每个对象都具备的,它返回一个整数值,通常用于快速比较对象或者在哈希表(如...

    hashCode的作用

    ### hashCode的作用 在Java编程语言中,`hashCode`方法是一个重要的概念,主要用于对象的查找与存储,尤其是在集合框架中有着广泛的应用。为了更好地理解`hashCode`的作用及其在实际开发中的重要性,我们可以从以下...

    hashcode和equals方法

    equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.

    HashCode相同equals不同的2位字符集合算法

    在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个...

    Java理论与实践:hashCode()和equals()方法

    本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...

    复写hashCode()方法,和equasl()方法

    ### 复写`hashCode()`方法与`equals()`方法 在Java编程中,`hashCode()`方法与`equals()`方法是对象比较中的两个非常重要的方法。它们主要用于判断对象是否相等以及对象的散列值,这对于集合类(如`HashSet`)来说...

    Java重写equals同时需要重写hashCode的代码说明

    Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.

    PPT浅析hashcode

    PPT浅析hashcode定义和作用;和简单的代码演示PPT.很简单的

    关于HashCode码的重复问题 两种验证实例

    1,如果两个对象相同,那么它们的hashCode值一定要相同; 2,如果两个对象的hashCode相同,它们并不一定相同 上面说的对象相同指的是用eqauls方法比较。 3,HashCode码不唯一

    java中hashcode()和equals()的详解

    在Java编程语言中,`hashCode()`和`equals()`方法是对象身份验证的关键组成部分,它们主要用于对象的比较和哈希表(如HashMap、HashSet等)的操作。理解这两个方法的工作原理对于编写高效和可靠的代码至关重要。 ...

    hashCode的理解

    java中hashCode()的理解

    利用反射绕过编译器和hashcode高级应用

    本主题将深入探讨如何利用反射技术绕过编译器的一些限制,并介绍hashcode在高级应用中的用法。 首先,让我们理解反射的基本概念。在Java中,反射提供了一种方式,使我们能够在运行时动态地获取类的信息(如类名、...

    java中hashcode()和equals()方法详解

    ### Java中`hashCode()`与`equals()`方法详解 #### 前言 在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将...

Global site tag (gtag.js) - Google Analytics