翻阅一些资料后:
段落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
分享到:
相关推荐
重写 `hashCode()` 方法时,我们需要确保当两个对象满足 `equals()` 的条件时,它们的哈希码也相同。同时,为了提高性能,我们应该尽量让不同的对象产生不同的哈希码。例如,对于上述Person类,可以这样重写 `...
在使用 `HashSet`、`HashMap` 等数据结构时,如果重写了 `equals()` 方法但没有重写 `hashCode()` 方法,可能会导致预期的行为不一致。因为这些数据结构依赖于 `hashCode()` 来确定对象的存储位置,而 `equals()` 来...
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
在某些情况下,我们需要重写hashcode()方法,使其生成对象的哈希码,并且使其与equals()方法保持一致。 例如,在Hashtable、HashMap、HashSet、LinkedHashMap等容器中,我们需要重写hashcode()方法,使其生成对象的...
这就是为什么在设计类时,重写这两个方法是至关重要的,尤其是在实现集合类的元素或键值对时。 总之,理解并正确重写 `equals()` 和 `hashCode()` 方法对于编写高质量的Java代码至关重要,这直接影响到对象比较的...
因此,重写`equals()`时,通常也需要重写`hashCode()`。 `toString()` 方法返回一个表示该对象的字符串。默认情况下,`toString()`返回的是类名和对象的哈希码。但在实际开发中,我们通常会重写这个方法,提供更...
当自定义类时,有时需要根据业务逻辑重写这两个方法以满足特定需求。 首先,我们来详细了解`equals()`方法。`equals()`方法用于比较两个对象是否“相等”。默认的`equals()`行为是基于引用的相等性,即只有当两个...
equals 与 hashCode 方法讲解 equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的...在实际开发中,我们需要根据具体情况来重写这两个方法,以确保对象的正确比较和哈希码计算。
通常情况下,hashcode 方法需要和 equals 方法一起使用,以确保两个对象的散列码相同,如果它们的内容相同。 例如,在 HashSet 中,我们可以使用 hashcode 方法来比较两个对象是否相同。如果两个对象的散列码相同,...
在实际开发中,我们经常需要重写equals和hashCode方法,以便于正确地比较和存储对象。下面是一个简单的示例代码: public class Student { private String name; private int age; private String QQ; @...
为什么重写equals方法,还必须要重写hashcode方法
3、**为什么要重写equals()方法?** 默认情况下,`equals()`方法继承自`Object`类,比较的是对象的引用。在处理自定义类时,我们可能关心的是对象的属性是否相等,而不是它们的内存地址。因此,为了基于对象的内容...
首先我们看下下面代码及输出和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 ...
重写equals方法需要遵守通用约定,hashCode方法的实现需要保证equals相同的两个对象的hashCode结果一致。ArrayList、Vector和LinkedList是Java中三种常见的容器集合,每种集合都有其特点和应用场景。
这就是为什么在重写 `equals()` 时,通常也需要重写 `hashCode()`。 来看看 `String` 的 `hashCode()` 源码: ```java public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] =...
在重写`equals()`方法时,通常也需要重写`hashCode()`方法,以保持一致性。如果不这样做,可能会导致在使用哈希表时出现意想不到的行为。例如,如果一个类的两个实例通过`equals()`判断相等,但它们的`hashCode()`...
什么时候需要重写 equals 方法? ------------------------- 第一种情况:如果类中提供的 equals 方法无法满足需求,则需要重写 equals 方法。例如,在 String 类中,equals 方法用于比较两个字符串的内容是否相同...
因此,为了保证对象在集合中的正确行为,当重写 `equals` 方法时,必须同时重写 `hashCode` 方法,确保相等的对象具有相同的哈希值。这样,集合可以正确地识别和处理相等的对象,避免数据一致性问题。同时,遵循这个...
例如,`Integer`类已经重写了`equals()`,使得两个表示相同数值的`Integer`对象能够被正确识别为相等。如果我们在自定义类中没有重写`equals()`,则会得到不正确的比较结果。 接下来,`hashCode()`方法的目的是生成...
默认情况下,`hashCode()` 返回对象的内存地址的某种表示,但通常我们需要重写这个方法,使得具有相同逻辑内容的对象返回相同的哈希码。 2. **equals()**:同样来自Object类,它用于比较两个对象是否相等。默认行为...