当对象存储到Hash集合里是,应该重写该对象所在类的hashcode方法,如果不用储存到hash集合中则可以不重写hashcode方法。重写的原则是:当x.equals(y)时,它们所对应的hashcode也应该相等,即:x.hashcode()==y.hashcode()为true。
一个HashSet的例子:
HashSet是一个无序不可以重复储存的集合。那么HashSet是如何判断两个对象是否重复呢?答案是靠它们的hashcode方法,如果对应的两个对象所返回的hashcode方法的值是相等的,则表明该两个对象“相等”。所以一般情况下,用户需要对要储存到HashSet的对象所在的类重写hashcode方法,而不是用继承自Object的hashcode方法,因为Object 类定义的 hashCode 方法会针对不同的对象返回不同的整数(这一般是通过将该对象的内部地址转换成一个整数来实现的),一般不符合用户的需求。
要想在HashSet中知道对象的位置,就要先计算该对象的hashcode,然后与散列表的列表的总数取余,所得结果就是保存这个元素的列表的索引。
当一个对象被储存进HashSet集合后,就不能再修改这个对象中的那些参与计算hashcode值的属性了,否则对象修改后的hashcode与最初储存到HashSet的值不一致,在这种情况下,即使在contains方法中使用该对象的当前引用作为参数区HashSet集合中检索对象,也将返回不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露。为什么会杀不了呢:因为,当集合调用remove方法的时候,会从对象得到hashcode,但是原先对象储存的时候所对应的hashcode不是现在的hashcode,所以定位的不是相同的对象,因此删除不了。
所谓内存泄露是指该对象已经不需要再用,但是一直占着内存空间。
以下是实验代码:
package April;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
public class HashSetTest {
public static void main(String[] args) {
Collection c = new HashSet();
Date d = new Date();
try {
Thread.sleep(500);//控制时间
} catch (InterruptedException e) {
e.printStackTrace();
}
Person p1 = new Person("p1",23,d);
Person p2 = new Person("p2",23,new Date());
Person p3 = new Person("p3",23,new Date());
c.add(p1);
c.add(p2);
c.add(p3);
p1.setName("p4");
c.remove(p1);
System.out.println(c.size());//size的值依然是3
}
}
分享到:
相关推荐
在自定义类中,为了使对象能被HashSet或HashMap正确处理,通常需要重写hashCode()和equals()方法,确保它们遵循一致性原则。 在ArrayList和HashSet的比较中,我们可以总结以下几点: 1. 数据结构:ArrayList基于...
在Java编程中,`equals()` 和 `hashCode()` 方法是Object类中的两个重要方法,它们在处理对象相等性以及在哈希表(如HashSet、HashMap)中起到关键作用。当自定义类时,有时需要根据业务逻辑重写这两个方法以满足...
hashCode 是一种用于查找和排序的机制,在数据结构中 plays a crucial role。下面我们将对 hashCode 的用法进行详细的解释。 hashCode 的作用 hashCode 的主要作用是用于查找和排序。在查找和排序的过程中,我们...
例如,在 HashSet 中,我们可以使用 hashcode 方法来比较两个对象是否相同。如果两个对象的散列码相同,我们可以认为它们是相同的对象。 == 号、equals 方法和 hashcode 方法都是用来比较对象的,但是它们之间存在...
通过上述分析可以看出,`HashSet`能够高效地去除重复元素,并且它的实现主要依赖于`hashCode`和`equals`方法。为了确保`HashSet`正确地识别重复元素,用户自定义的类必须重写`equals`和`hashCode`方法,以保证逻辑...
在使用Java集合类时,如HashSet或HashMap,`equals()` 和 `hashCode()` 的一致性非常重要。如果你只重写了 `equals()` 而不重写 `hashCode()`,可能会导致无法正确地将对象添加到集合或从集合中查找对象。例如,在...
在添加元素时,HashSet会调用对象的hashCode()方法生成哈希码,然后根据哈希码快速定位元素在HashMap中的位置。如果已有元素占据了这个位置,那么会调用equals()方法来判断新元素是否与已存在元素相等。如果equals()...
为了使`Person`对象能够正确地工作在`HashSet`中,我们需要重写`hashCode`方法: ```java public class Person { private String name; private int age; // 构造器、getters和setters省略... @Override ...
在集合类(如`HashSet`)中,元素的存储依赖于`hashCode()`和`equals()`方法。如果两个元素的`hashCode()`相同,则需要通过`equals()`方法进一步确认是否为相同的元素。这在处理大量数据时可以显著提高效率。 #### ...
- 当`HashSet`中的元素为自定义类型时,必须正确地重写`equals()`和`hashCode()`方法以确保元素的唯一性和性能。 以上是对`HashSet`类的基本用法及特性的一个详细介绍。希望这些内容能帮助读者更好地理解和使用`...
在Java中的散列表(如HashMap、HashSet等)中,Hashcode扮演着关键角色。它可以快速地判断两个对象是否相等,从而提高散列表的性能。 证明Hashcode不是内存地址 有人认为Hashcode是对象在内存中的地址,但这是一种...
这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入探讨这两个方法的重写规则和应用场景。 首先,`equals()` 方法是Object类中的一个基础方法,用于比较两个对象是否相等...
为了确保集合类如`HashSet`和`HashMap`的正确行为,`hashCode()`和`equals()`之间必须满足以下条件: - 如果`equals()`方法判定两个对象相等,则这两个对象的`hashCode()`值必须相同。 - 相反,如果两个对象的`...
在Java编程语言中,`hashCode()` 和 `equals()` 方法是两个非常重要的概念,尤其是在处理对象比较和哈希表(如 `HashMap` 或 `HashSet`)时。这两个方法来源于 `Object` 类,是所有Java类的基类,因此,每个自定义类...
### hashCode的作用 ...正确地实现`hashCode`方法和与其相匹配的`equals`方法对于确保程序的正确性和性能至关重要。在实际开发中,应当注意对这两个方法的合理使用和重写,以满足具体应用场景的需求。
### set接口中hashCode和equals方法详解 #### 一、引言 在Java编程语言中,`Set`接口作为集合框架的重要组成部分,在实现无重复元素的数据结构方面扮演着关键角色。为了确保元素的唯一性,`Set`接口依赖于对象的`...
1. 对于 HashSet,确保添加的对象正确实现了 `hashCode()` 和 `equals()` 方法,以确保元素的唯一性和哈希表的高效性。 2. 如果需要保持元素的特定顺序,或者执行范围查询,那么应该选择 TreeSet,因为它提供了排序...
在Java编程语言中,`hashCode()`和`equals()`方法是对象身份验证的关键组成部分,它们主要用于对象的比较和哈希表(如HashMap、HashSet等)的操作。理解这两个方法的工作原理对于编写高效和可靠的代码至关重要。 ...
当你尝试向HashSet中添加一个新元素时,它会通过调用该对象的`equals()`和`hashCode()`方法来检查该元素是否已经存在于集合中。如果对象的`equals()`方法返回true,表示两个对象相等,`hashCode()`方法返回相同的值...
在Java编程语言中,序列化(Serialization)和重写`hashCode`及`equals`方法是两个重要的概念,它们各自有着特定的用途,并且在某些情况下相互关联。下面将详细阐述这两个概念及其应用。 首先,Java序列化是将一个...