ashCode和equal两个方法都是Object基类定义实现的方法。hashCode即哈希码,就是获取对象对应的hash值的函数;equal即相等,就是判断两个对象是否相等的函数。为什么Object对象会有这两个方法呢,equal方法好理解,用来比较两个对象是否相等,但是hashCode有什么用呢?
先看下面一段代码,Person类没有重写这两个方法,继承了Object类的方法,我们来看看Object类中定义的这两个方法是如何实现的。
- package com.basic.equal;
- public class BasicEqual {
- public static void main(String argv[]) {
- Person p1 = new Person("lee", "changsha","123");
- Person p2 = new Person("lee", "changsha","123");
- System.out.println(p1 + " " + p1.hashCode());
- System.out.println(p2 + " " + p2.hashCode());
- System.out.println(p1.equals(p2));
- }
- }
- class Person {
- private String name;
- private String address;
- private String number;
- public Person(String name, String address, String number) {
- this.address = address;
- this.name = name;
- this.number = number;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- public String getNumber() {
- return number;
- }
- public void setNumber(String number) {
- this.number = number;
- }
- }
运行结果如下:
- com.basic.equal.Person@3ce53108 1021653256
- com.basic.equal.Person@6af62373 1794515827
- false
从上面的结果我们可以看出,Object类的HashCode方法其实返回的就是对象的地址,而equal方法不是很清楚,但通过Object类的源码我们知道equal方法比较的是两个对象的地址。
下面,我们再看一段代码,Person类没有重写这两个方法,继承了Object类的方法
- package com.basic.equal;
- import java.util.HashSet;
- import java.util.Iterator;
- public class BasicEqual {
- public static void main(String argv[]) {
- Person p1 = new Person("lee", "changsha","123");
- Person p2 = new Person("lee", "changsha","123");
- HashSet<Person> set = new HashSet<Person>();
- set.add(p1);
- set.add(p2);
- Iterator<Person> it= set.iterator();
- while(it.hasNext())
- {
- Person p = it.next();
- System.out.println(p + " " + p.getName());
- }
- }
- }
- class Person {
- private String name;
- private String address;
- private String number;
- public Person(String name, String address, String number) {
- this.address = address;
- this.name = name;
- this.number = number;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- public String getNumber() {
- return number;
- }
- public void setNumber(String number) {
- this.number = number;
- }
- }
运行结果如下:
- com.basic.equal.Person@6af62373 lee
- com.basic.equal.Person@3ce53108 lee
Hashset不是说保证添加的对象不重复吗,我们构造的对象明明有相同的名字,地址和电话,为什么HashSet认为p1和p2是不同的对象呢,这个就和HashSet判断对象是否相等的方法相关了,HashSet比较两个对象是否相等的,有两个步骤,1)比较HashCode、2)比较equal。下面我们来验证一下是否是这样的,基于下面的代码:
- package com.basic.equal;
- import java.util.HashSet;
- import java.util.Iterator;
- public class BasicEqual {
- public static void main(String argv[]) {
- Person p1 = new Person("lee", "changsha","123");
- Person p2 = new Person("lee", "changsha","123");
- HashSet<Person> set = new HashSet<Person>();
- set.add(p1);
- set.add(p2);
- Iterator<Person> it= set.iterator();
- while(it.hasNext())
- {
- Person p = it.next();
- System.out.println(p + " " + p.hashCode() + " " +p.getName());
- }
- }
- }
- class Person {
- private String name;
- private String address;
- private String number;
- public Person(String name, String address, String number) {
- this.address = address;
- this.name = name;
- this.number = number;
- }
- @Override
- public int hashCode() {
- return 1;
- }
- @Override
- public boolean equals(Object obj) {
- return true;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- public String getNumber() {
- return number;
- }
- public void setNumber(String number) {
- this.number = number;
- }
- }
上面代码的运行结果:
- com.basic.equal.Person@1 1 lee
我们发现只有一条记录,也就是说hashset认为两个对象是同一个对象,那是因为hashcode值相等了,equal方法返回true了。如果我们让hashcode方法继承object,或者让equal方法继承Object,得到的结果如下:
com.basic.equal.Person@1 1 lee
com.basic.equal.Person@1 1 lee
从上面的试验我们验证了Hashset比较对象的两个方法。通过上面的例子,我们可以看到,其实HashCode方法我们可以不关心直接让它返回固定值,我们只需要实现我们的equal方法就行了,那HashCode方法是不是就没有用了呢,其实它的作用还是很大的,它的作用就是用来提高效率的,我们之所以选择Hahset或hashmap数据结构就是因为它们的效率,比较对象时先通过hashcode缩小范围,然后再使用equal方法比较是否相等,如果我们都是一个hashcode值,相当于比较一个对象时,就需要和所有的对象使用equal方法比较,这样效率就非常的低。我想现在应该差不多明白这两者之间的关系了,^_^。
另外附加hashcode和equals的标准写法:
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((name == null) ? 0 : name.hashCode());
- result = prime * result + ((address == null) ? 0 : address.hashCode());
- result = prime * result + ((number == null) ? 0 : number.hashCode());
- return result;
- }
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if(getClass() != obj.getClass()) {
- return false;
- }
- Person p = (Person)obj;
- if (name == null) {
- if(p.name != null) {
- return false;
- }
- } else if (!name.equals(p.name)) {
- return false;
- }
- if (address == null) {
- if (p.address != null) {
- return false;
- }
- } else if (!address.equals(p.address)) {
- return false;
- }
- if (number == null) {
- if (p.number != null) {
- return false;
- }
- } else if (!number.equals(p.number)) {
- return false;
- }
- return true;
- }
http://blog.csdn.net/pingnanlee/article/details/17228579
相关推荐
Java 中的每个对象都有 hashCode() 和 equals() 方法,这两个方法的正确实现对于 Java 开发人员来说是非常重要的。本文将详细介绍 hashCode() 和 equals() 的本质区别和联系,并探讨在创建 Java 类时如何定义这些...
在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将详细介绍这两个方法的工作原理、使用场景以及它们之间的关系...
字符串哈希码 字符串的其他实用程序。... equal ( code , code2 ) ;原料药hashCode(str)参数: str:字符串对象返回: 编号:哈希码返回字符串的哈希码。 请注意,哈希码对于特定字符串是不可变的。执照麻省理工学院
hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。 使用hashCode()和equals() hashCode()方法被用来获取给定对象的整数。这个整数被用来确定对象被...
在这个个人总结中,我们将探讨几个关键的Java知识点,包括对象创建、equals与hashCode方法、对象序列化以及String、StringBuffer和StringBuilder的区别。 首先,让我们来看看创建Java对象的四种方式: 1. **New**...
在Java编程语言中,`==` 和 `equals()` 是两种常用的比较操作符,它们在不同情况下有着不同的含义和用途。本文将深入探讨这两者之间的差异,并通过实例代码和理论解释来帮助理解。 首先,`==` 操作符主要用于基本...
1、何时需要重写equals() ... 如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。 简单的说,“相等的对象必须具有相等的散列码”。 3、什么是equals()与如何设计equals()
### Java常用类总结 #### 一、概述 在Java编程语言中,常用类是指那些频繁使用的内置类,它们为开发者提供了便利的操作接口。本篇文档将重点介绍`String`类及与之相关的类如`Integer`、`Character`以及枚举类型等...
Java中的`hashCode`方法是Java编程语言中的一个重要概念,它主要与对象的散列处理相关。在Java的`Object`类中定义了一个本地方法(native)`hashCode()`,该方法返回一个`int`类型的数值。这个数值是根据对象的状态...
总结来说,当重写 `equals()` 方法以比较对象内容时,也需要重写 `hashCode()` 方法以保持对象平等性和哈希码的一致性。这样可以确保散列数据结构能够正确处理相等的对象,防止出现不应有的重复元素。对于 Java ...
equals() 方法和 hashCode() 方法是 Java 中两个非常重要的方法,它们的作用是分别比较两个对象的值和哈希值。图 2 展示了这两个方法的区别: * 如果两个对象相等(equal),那么他们一定有相同的哈希值。 * 如果两...
【面试】中提到的几个关键知识点集中在对象比较、equals()和hashCode()方法的使用以及它们之间的关系上。这些概念在Java编程中至关重要,特别是在处理集合类和比较对象时。 1、**hashCode与equals两者之间的关系**...
作为一名 Java 开发者,需要具备扎实的 Java 基础知识和综合的编程能力。以下是 Java 面试中常见的知识点: 字符串不变性 在 Java 中,字符串是不可变的,意味着一旦创建了字符串对象,就不能修改它的值。例如,在...
Java中的Java反射和对象比较 项目介绍 首先,通过以下方式设计Java类: 2个私有数据成员int IntValue; 字符串StringValue; 空构造函数定义公共方法void setIntValue(int iIn){...}定义公共方法void ...
1.9 String、StringBuffer、StringBuilder、hashCode和equal - String是不可变的字符串序列。 - StringBuffer和StringBuilder是可变字符序列,其中StringBuffer是线程安全的,StringBuilder则没有线程安全保证。 - ...
### Java笔试题详解 #### 一、Try-Catch-Finally机制 在Java中,`try-catch-finally`是用于处理异常的一种结构。其主要作用是确保即使...以上内容总结了Java笔试题中涉及的一些核心知识点,希望能对学习者有所帮助。
面试是求职过程中至关重要的环节,对于Java和.NET程序员来说,了解并掌握常见的面试题是提升成功几率的关键。以下是对这些题目涉及的知识点的详细说明: 非技术问题: 1. 个人履历的介绍应包括教育背景、工作经验和...
在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,要设计另外一个。在多数情况 下,这两个函数是不用考虑的,直接使用它们的默认设计可以了。但是在一些情况下,这两个...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们与对象的比较和哈希表(如 `HashMap`)的操作密切相关。在面试中,面试官提出的问题直指这两个方法的重要关联。 首先,`equals()` ...
### Java面试知识点详解 #### 一、`switch`语句支持的数据类型 ...通过以上解析,我们不仅了解了这些Java面试题目的答案,还深入探讨了它们背后的概念和技术细节,帮助理解Java语言的核心概念和技术。