我们知道比较两个对象相等的方法是重写这个对象的equals和hashCode方法。
但是这个hashCode方法到底有什么作用呢。我只重写equals方法到底行不行呢。
我们新建一个类看一下
public class Person {
private int age;
private String name;
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// @Override
// public int hashCode() {
// final int prime = 31;
// int result = 1;
// result = prime * result + age;
// result = prime * result + ((name == null) ? 0 : name.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;
final Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
这个类只重写了equals方法,测试一下
public static void main(String[] args) {
Collection<Person> list = new ArrayList<Person>();
Collection<Person> set = new HashSet<Person>();
CoTest ct = new CoTest();
list = ct.addEle(list);
System.out.println("ArrayList size == " + list.size());
set = ct.addEle(set);
System.out.println("HashSet size == " + set.size());
}
private Collection<Person> addEle(Collection<Person> col) {
Person p1 = new Person(1, "a");
Person p2 = new Person(1, "a");
Person p3 = new Person(2, "a");
Person p4 = new Person(3, "a");
col.add(p1);
col.add(p2);
col.add(p3);
col.add(p4);
return col;
}
打印出了如下的结果
ArrayList size == 4
HashSet size == 4
证明p1和p2两个对象还是不相等的
当我们把hashCode注释打开再运行一次
ArrayList size == 4
HashSet size == 3
证明了p1和p2两个对象已经相等
hashCode是一种算法,像这种HashSet HashMap基于哈希表存储的集合类型每次往里存储一个元素都要根据哈希算法计算出这个对象的哈希值,相同哈希值的元素被存储在以这个哈希值命名的一个空间里面,以后再往里面存储元素的话就可以直接根据这个元素的哈希值找到对应的空间判断这两个元素是否相等,这样存储的效率就会显著提高。
刚才那个问题,没有重写hashCode,那么元素的值就会没有规则的存放,把这个元素放到任意一个空间里如果没有则判断为不相等,其实相同的元素可能存在别的空间里。
好了,总结一下,如果为某个类编写了equals方法,那么同时应该编写hashCode方法,如果不编写hashCode方法,在使用基于哈希表结构的集合时就会发生意想不到的结果,为了避免这些问题,你应该谨记这条最佳实践。
分享到:
相关推荐
"Java中Hashcode的作用" Hashcode是Java编程语言中一个非常重要的概念,它在equals方法中扮演着关键角色。在Java中,每个对象都具有一个独特的Hashcode,它可以用来标识对象的身份。但是Hashcode是什么?它是如何...
在Java应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上equals比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需...
在Java编程语言中,`hashCode()`和`equals()`方法是对象身份验证的关键组成部分,它们...这两个方法在Java编程中起着至关重要的作用,尤其是在处理集合类和数据结构时。了解并正确使用它们能够确保程序的正确性和效率。
Java 中 HashCode 作用 HashCode 在 Java 中扮演着非常重要的角色,它对于一个对象的重要性不言而喻。本文将详细介绍 HashCode 的作用和重要性,为读者提供一个深入了解 HashCode 的机会。 HashCode 的作用 在 ...
Java 中HashCode重复的可能性 Java 中的 HashCode 重复可能性是 Java 开发中一个常见的问题。 HashCode 是 Java 中一个重要的概念,它用于标识对象的唯一性。然而,Hash Code 有可能重复,这会导致程序出错。下面...
总之,`hashCode()` 在Java中起着至关重要的作用。它不仅影响着数据结构的性能,还涉及到内存利用率等问题。因此,合理设计和实现 `hashCode()` 方法是非常重要的。开发者应当充分理解其工作原理,并结合实际情况...
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...
### hashCode的作用 在Java编程语言中,`hashCode`方法是一个重要的概念,主要用于对象的查找与存储,尤其是在集合框架中有着广泛的应用。为了更好地理解`hashCode`的作用及其在实际开发中的重要性,我们可以从以下...
Java集合中有两类,一类是List,一类是Set他们之间的区别就在于List集合中的元素师有序的,且可以重复,而Set集合中元素是无序不可重复的。对于List好处理,但是对于Set而言我们要如何来保证元素不重复呢?通过迭代...
本篇将深入探讨ArrayList与HashSet的区别,并分析Hashcode在其中的作用。 ArrayList是基于动态数组实现的,它提供了按索引访问元素的能力,就像在数组中一样。由于内部维护了一个数组,ArrayList保证了元素的顺序性...
1. **Java中的hashCode方法**:在Java中,对象的hashCode方法用于获取该对象的哈希码值,该值通常基于对象的内容计算得出。hashCode的目的是为了在使用如HashMap等哈希表数据结构时提高效率。Java中String类的...
Java 中的每个对象都有 hashCode() 和 equals() 方法,这两个方法的正确实现对于 Java 开发人员来说是非常重要的。本文将详细介绍 hashCode() 和 equals() 的本质区别和联系,并探讨在创建 Java 类时如何定义这些...
### Java 高级特性详解 #### 一、`hashCode` ...正确地重写 `equals` 和 `hashCode` 方法、使用 `Comparator` 进行排序、利用反射机制和序列化技术,以及实现 `clone` 方法都是开发高质量 Java 应用程序的重要技能。
本文详细介绍了 Java 中的 hashCode 和 equals 方法,探讨了这两个方法的作用、实现机制和使用场景。通过对 hashCode 和 equals 方法的深入分析,我们可以更好地理解 Java 集合的实现原理和哈希表的工作机制。 一、...
Java中的`hashCode()`方法是基于对象的内部状态计算出的一个整数值,它在处理集合特别是HashSet、HashMap等基于哈希表的数据结构时起着至关重要的作用。哈希码(Hash Code)被用来快速定位对象在哈希表中的位置,...
在Java编程中,`hashCode()`、`equals()`以及`==`是三个经常被提及的概念,它们在处理对象的比较和存储时起着关键作用。本文将深入探讨这三个概念的介绍、区别以及它们在Java对象比较中的应用。 首先,`hashCode()`...
`hashCode()`方法的主要作用在于提高查找效率。当向哈希集合中添加对象时,首先会调用对象的`hashCode()`方法来计算哈希码。如果哈希码在集合中不存在,那么对象可以直接被添加,无需进一步比较。如果哈希码已经存在...