`
本来不想注册
  • 浏览: 197409 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

equals() & hashCode()为什么有时需要重写

阅读更多
翻阅一些资料后:
段落1:
为什么要重写hashCode()方法呢,主要是为了return 我们想要的hashCode值,这些值是整型。
首先看看原始的Object类中的hashCode():
public native int hashCode();

看看对这个方法的描述:
   As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the Java TM programming language.)

hashCode是用来区别对象和对象用的,hashCode是int 值, 它对应这个对象在内存中的地址。

public class Employee {	
	private int id;
	
	public Employee(int id){
		this.id = id;
	}
	
	public static void main(String[] args){
		Employee emp1 = new Employee(11);
		Employee emp2 = new Employee(12);
		
		System.out.println(emp1.hashCode());
		System.out.println(emp2.hashCode());
	}
}


输出结果是:
3526198
7699183

段落2:
重写hashCode()后:
public class Employee {	
	private int id;
	
	public Employee(int id){
		this.id = id;
	}
	
	public int hashCode(){
		return id;
	}
	
	public static void main(String[] args){
		Employee emp1 = new Employee(11);
		Employee emp2 = new Employee(12);
		
		System.out.println(emp1.hashCode());
		System.out.println(emp2.hashCode());
	}
}

输出:
11
12

Q:什么时候我们需要重写hashCode()方法?
A:需要用该对象的hashCode值来区分对象的时候。比如将这些对象作为elements放入HashSet中,或者将这些对象存放作HashMap、Hashtable的Key值的时候。 还有补充吗?
而且,在重写hashCode()方法的同时,必须重写equals()方法,为什么?请看下面例子

只重写hashCode()的情况:
public class Employee {	
	private int id;
	
	public Employee(int id){
		this.id = id;
	}

	public int hashCode(){
		return id;
	}
}
public class EmpTester {
	public static void main(String[] args){
		Employee emp1 = new Employee(11);
		Employee emp2 = new Employee(12);
		Employee emp3 = new Employee(13);

		HashSet<Employee> hs = new HashSet<Employee>();
		
		hs.add(emp1);
		hs.add(emp2);
		hs.add(emp3);
		
		System.out.println(hs.size());
		System.out.println(hs.contains(new Employee(11)));
		System.out.println(hs.remove(new Employee(12)));
		System.out.println(hs.size());
	}
}

尽管两个Employee对象的hashCode是相同的,但因为没有重写equals()方法,结果是……
3
false
false
3



equals() & hashCode()都重写的情况:
public class Employee {	
	private int id;
	
	public Employee(int id){
		this.id = id;
	}
	
	public int hashCode(){
		return id;
	}
	
	public boolean equals(Object obj){
		if(this == obj)
			return true;
		if(obj instanceof Employee){
			Employee emp = (Employee)obj;
			if(emp.id == id){
				return true;
			}else
				return false;
		}else
			return false;
	}
}

public class EmpTester {
	public static void main(String[] args){
		Employee emp1 = new Employee(11);
		Employee emp2 = new Employee(12);
		Employee emp3 = new Employee(13);

		HashSet<Employee> hs = new HashSet<Employee>();
		
		hs.add(emp1);
		hs.add(emp2);
		hs.add(emp3);
		
		System.out.println(hs.size());
		System.out.println(hs.contains(new Employee(11)));
		System.out.println(hs.remove(new Employee(12)));
		System.out.println(hs.size());
	}
}

结果是:
3
true
true
2




差不多了
具体请参考:
http://www.javaworld.com/community/?q=node/1006
http://www.javaworld.com/javaworld/jw-01-1999/jw-01-object.html?page=1
分享到:
评论

相关推荐

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

    重写 `hashCode()` 方法时,我们需要确保当两个对象满足 `equals()` 的条件时,它们的哈希码也相同。同时,为了提高性能,我们应该尽量让不同的对象产生不同的哈希码。例如,对于上述Person类,可以这样重写 `...

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

    在使用 `HashSet`、`HashMap` 等数据结构时,如果重写了 `equals()` 方法但没有重写 `hashCode()` 方法,可能会导致预期的行为不一致。因为这些数据结构依赖于 `hashCode()` 来确定对象的存储位置,而 `equals()` 来...

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

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

    关于重写equals,hashcode以及compareTo方法!

    在某些情况下,我们需要重写hashcode()方法,使其生成对象的哈希码,并且使其与equals()方法保持一致。 例如,在Hashtable、HashMap、HashSet、LinkedHashMap等容器中,我们需要重写hashcode()方法,使其生成对象的...

    Java_重写equals()和hashCode()

    这就是为什么在设计类时,重写这两个方法是至关重要的,尤其是在实现集合类的元素或键值对时。 总之,理解并正确重写 `equals()` 和 `hashCode()` 方法对于编写高质量的Java代码至关重要,这直接影响到对象比较的...

    equals,hashcode,toString

    因此,重写`equals()`时,通常也需要重写`hashCode()`。 `toString()` 方法返回一个表示该对象的字符串。默认情况下,`toString()`返回的是类名和对象的哈希码。但在实际开发中,我们通常会重写这个方法,提供更...

    重写hashCode()和equals()方法详细介绍

    当自定义类时,有时需要根据业务逻辑重写这两个方法以满足特定需求。 首先,我们来详细了解`equals()`方法。`equals()`方法用于比较两个对象是否“相等”。默认的`equals()`行为是基于引用的相等性,即只有当两个...

    equals与hashCode方法讲解

    equals 与 hashCode 方法讲解 equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的...在实际开发中,我们需要根据具体情况来重写这两个方法,以确保对象的正确比较和哈希码计算。

    Java中equals,hashcode和==的区别

    通常情况下,hashcode 方法需要和 equals 方法一起使用,以确保两个对象的散列码相同,如果它们的内容相同。 例如,在 HashSet 中,我们可以使用 hashcode 方法来比较两个对象是否相同。如果两个对象的散列码相同,...

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

    在实际开发中,我们经常需要重写equals和hashCode方法,以便于正确地比较和存储对象。下面是一个简单的示例代码: public class Student { private String name; private int age; private String QQ; @...

    为什么重写equals方法,还必须要重写hashcode方法

    为什么重写equals方法,还必须要重写hashcode方法

    【面试】hashCode与equals两者之间的关系 / == 和equals / 为什么要重写equals方法 / 重写equals /hashcode方法 / 为什么要重写hashCode方法

    3、**为什么要重写equals()方法?** 默认情况下,`equals()`方法继承自`Object`类,比较的是对象的引用。在处理自定义类时,我们可能关心的是对象的属性是否相等,而不是它们的内存地址。因此,为了基于对象的内容...

    关于重写equals()为什么一定要重写hashcode()自己的一点心得

    首先我们看下下面代码及输出和String重写equals和hashcode的源码: package com.zzy.test; public class Test6 { public static void main(String[] args) { String s1="aaa"; String s2="aaa"; String s3=new ...

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

    重写equals方法需要遵守通用约定,hashCode方法的实现需要保证equals相同的两个对象的hashCode结果一致。ArrayList、Vector和LinkedList是Java中三种常见的容器集合,每种集合都有其特点和应用场景。

    面试官瞬间就饱了,重写equals函数,需要重写hashCode函数吗?

    这就是为什么在重写 `equals()` 时,通常也需要重写 `hashCode()`。 来看看 `String` 的 `hashCode()` 源码: ```java public int hashCode() { int h = hash; if (h == 0 && value.length &gt; 0) { char val[] =...

    Java中的equals和hashCode方法详解1

    在重写`equals()`方法时,通常也需要重写`hashCode()`方法,以保持一致性。如果不这样做,可能会导致在使用哈希表时出现意想不到的行为。例如,如果一个类的两个实例通过`equals()`判断相等,但它们的`hashCode()`...

    重写equals方法

    什么时候需要重写 equals 方法? ------------------------- 第一种情况:如果类中提供的 equals 方法无法满足需求,则需要重写 equals 方法。例如,在 String 类中,equals 方法用于比较两个字符串的内容是否相同...

    为什么在重写 equals方法的同时必须重写 hashcode方法

    因此,为了保证对象在集合中的正确行为,当重写 `equals` 方法时,必须同时重写 `hashCode` 方法,确保相等的对象具有相同的哈希值。这样,集合可以正确地识别和处理相等的对象,避免数据一致性问题。同时,遵循这个...

    equals 和 hashCode两者效果分析详解.docx

    例如,`Integer`类已经重写了`equals()`,使得两个表示相同数值的`Integer`对象能够被正确识别为相等。如果我们在自定义类中没有重写`equals()`,则会得到不正确的比较结果。 接下来,`hashCode()`方法的目的是生成...

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

    默认情况下,`hashCode()` 返回对象的内存地址的某种表示,但通常我们需要重写这个方法,使得具有相同逻辑内容的对象返回相同的哈希码。 2. **equals()**:同样来自Object类,它用于比较两个对象是否相等。默认行为...

Global site tag (gtag.js) - Google Analytics