`
spring5365
  • 浏览: 71525 次
  • 性别: Icon_minigender_1
  • 来自: 钓鱼岛
社区版块
存档分类
最新评论

java equals与hashCode

 
阅读更多

    如果只看jdk文档对于新手来说,很难理解java为什么要求重写这两个方法。在面向对象的世界里,如何确定两个对象是否相等(或者说逻辑上相等)是要解决的一个问题,Java通过equal方法来确定两个对象是否相等。Java对象的创建是在堆上进行的,如果用new关键字创建一个类的两个对象,java里时如何判定这两个对象是否相等的呢?

 

举个例子:

class Employee {
	Integer id;
	public void setId(Integer id) {
		this.id = id;
	}
} 

 假如一家公司认为只要员工编号相同就是同一个员工(虽然有点不太合理,但没想到更像样的例子)。接下来,如下代码来判断员工是否是同一个人

        Employee e1 = new Employee();
        Employee e2 = new Employee();
        e1.setId(1);
        e2.setId(1);
        
        System.out.println(e1.equals(e2));

 很遗憾,这段代码的输出为false。

为了达到判定这样的两个员工是同一个员工,需要重写equals方法。

class Employee {
	Integer id;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	
	@Override
	public boolean equals(Object o) {
		if(o == null) {
			return false;
		}
		if (o == this) {
			return true;
		}
		if (getClass() != o.getClass()) {
			return false;
		}
		Employee e = (Employee) o;
		return (this.getId() == e.getId());
	}
}

 

运行如下的测试方法

        Employee e1 = new Employee();
        Employee e2 = new Employee();
        e1.setId(1);
        e2.setId(1);
        
        System.out.println(e1.equals(e2));
         
        Set<Employee> employees = new HashSet<Employee>();
        employees.add(e1);
        employees.add(e2);
        
        System.out.println(employees);
        System.out.println(e1.equals(e2));

 程序运行结果如下:

true

[com.shunwang.meteor.example.Employee@dc8569, com.shunwang.meteor.example.Employee@1bab50a]

 

第一个运行结果是正确了,但第二个竟然输出了两个,Java中Set是能去重的,那问题出在哪里呢?

原来,Java中对于HashSet的存储利用了HashMap,而HashMap是采用数组加链表的数据结构的(如果不清楚请读一下HashMap的源代码,如果了解HashMap的存储结构,此问题就很好理解了)。HashMap首先通过对象的hashcode计算存储位置(如果hash冲突,该位置用一个链表解决冲突),再比较元素的值。上述问题早于未重写对象的hashcode方法(默认继承Object,默认返回对象的内存地址编号)。修改代码如下:

class Employee {
	Integer id;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	
	@Override
	public boolean equals(Object o) {
		if(o == null) {
			return false;
		}
		if (o == this) {
			return true;
		}
		if (getClass() != o.getClass()) {
			return false;
		}
		Employee e = (Employee) o;
		return (this.getId() == e.getId());
	}
	
	@Override
	public int hashCode() {
	    final int code = 31;
	    int result = 1;
	    result = code * result + getId();
	    return result;
	}
}

 

执行结果:

true

[com.shunwang.meteor.example.Employee@20]

 

如果理解这两个方法的用处,那些描述文章中描述的各种"性"就好理解了。

分享到:
评论

相关推荐

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

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

    equals与hashCode在实际开发中的重写写法

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...

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

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

    Java中equals,hashcode和==的区别

    "Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...

    equals与hashCode方法讲解

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

    equals,hashcode,toString

    `hashCode()` 方法则与`equals()`密切相关。在哈希表(如HashMap、HashSet)中,对象的哈希码用于快速定位对象存储的位置。当两个对象通过`equals()`方法判断为相等时,它们的`hashCode()`方法返回值也应该相等。...

    Java重写equals及hashcode方法流程解析

    "Java重写equals及hashcode方法流程解析" Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object类中的方法。在实际开发中,正确地重写这两个方法对于确保程序的正确性和性能至关重要。下面,我们将...

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

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

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    Java容器集合(equals和hashCode+基础数据结构+ArrayList+Vector和LinkedList) Java容器集合是Java中的一种基础数据结构,用于存储和管理数据。其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,...

    Java equals 方法与hashcode 方法的深入解析.rar

    在Java编程语言中,`equals()`方法和`hashCode()`方法是两个非常重要的概念,它们主要用于对象的比较和哈希表的高效运作。本解析将深入探讨这两个方法的用途、实现原理以及它们之间的关联。 首先,`equals()`方法是...

    Java equals 和 hashCode 的这几个问题可以说明白吗?.docx

    图文并茂吃透面试题,看完这个,吊打面试官,拿高薪offer!

    Java_重写equals()和hashCode()

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...

    Java中的equals和hashCode方法详解1

    在Java编程语言中,`equals()`和`hashCode()`方法是对象的基本组成部分,它们主要用于对象的比较和存储。这两个方法在`java.lang.Object`类中定义,因此所有的Java类都默认继承了这两个方法。然而,根据具体的应用...

    JAVA集合的使用(List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类、equals、hashCode)

    要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode

    java 举例分析 equals hashcode 基本类型与基本对象的比较 shot与Short int与Integer long与Long

    举例分析 equals 和 hashcode 方法,hashcode应该怎么样生成 8个基本类型与基本对象的比较:byte与Byte shot与Short int与Integer long与Long float与Float double与Double char与Character

    java中hashcode和equals的详解.pdf

    Java 中的 hashCode 和 equals 方法详解 本文详细介绍了 Java 中的 hashCode 和 equals 方法,探讨了这两个方法的作用、实现机制和使用场景。通过对 hashCode 和 equals 方法的深入分析,我们可以更好地理解 Java ...

    解析Java对象的equals()和hashCode()的使用

    深入解析Java对象的equals()和hashCode()的使用 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个。在多数情况下,这两个函数是不用考虑的,直接使用它们...

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

    `hashCode()`方法则与`equals()`密切相关,它返回一个整数值,代表对象的哈希码,这个值是基于对象的特定状态计算出来的。在哈希表中,对象通过其哈希码快速定位。如果两个对象根据`equals()`方法判断相等,那么它们...

    ordinary-zhang#java#equals和hashcode方法详解1

    1.概述 2.为什么重写equels方法要重写hashcode方法 3.例子

Global site tag (gtag.js) - Google Analytics