`

HashCode和HashSet

阅读更多
当对象存储到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
	}
}
0
0
分享到:
评论

相关推荐

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    在自定义类中,为了使对象能被HashSet或HashMap正确处理,通常需要重写hashCode()和equals()方法,确保它们遵循一致性原则。 在ArrayList和HashSet的比较中,我们可以总结以下几点: 1. 数据结构:ArrayList基于...

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

    在Java编程中,`equals()` 和 `hashCode()` 方法是Object类中的两个重要方法,它们在处理对象相等性以及在哈希表(如HashSet、HashMap)中起到关键作用。当自定义类时,有时需要根据业务逻辑重写这两个方法以满足...

    HashCode的用法详解

    hashCode 是一种用于查找和排序的机制,在数据结构中 plays a crucial role。下面我们将对 hashCode 的用法进行详细的解释。 hashCode 的作用 hashCode 的主要作用是用于查找和排序。在查找和排序的过程中,我们...

    Java中equals,hashcode和==的区别

    例如,在 HashSet 中,我们可以使用 hashcode 方法来比较两个对象是否相同。如果两个对象的散列码相同,我们可以认为它们是相同的对象。 == 号、equals 方法和 hashcode 方法都是用来比较对象的,但是它们之间存在...

    HashSet去重

    通过上述分析可以看出,`HashSet`能够高效地去除重复元素,并且它的实现主要依赖于`hashCode`和`equals`方法。为了确保`HashSet`正确地识别重复元素,用户自定义的类必须重写`equals`和`hashCode`方法,以保证逻辑...

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

    在使用Java集合类时,如HashSet或HashMap,`equals()` 和 `hashCode()` 的一致性非常重要。如果你只重写了 `equals()` 而不重写 `hashCode()`,可能会导致无法正确地将对象添加到集合或从集合中查找对象。例如,在...

    集合的概念及应用和HashSet保证数据不重复的原理

    在添加元素时,HashSet会调用对象的hashCode()方法生成哈希码,然后根据哈希码快速定位元素在HashMap中的位置。如果已有元素占据了这个位置,那么会调用equals()方法来判断新元素是否与已存在元素相等。如果equals()...

    hashcode和equals的分析

    为了使`Person`对象能够正确地工作在`HashSet`中,我们需要重写`hashCode`方法: ```java public class Person { private String name; private int age; // 构造器、getters和setters省略... @Override ...

    复写hashCode()方法,和equasl()方法

    在集合类(如`HashSet`)中,元素的存储依赖于`hashCode()`和`equals()`方法。如果两个元素的`hashCode()`相同,则需要通过`equals()`方法进一步确认是否为相同的元素。这在处理大量数据时可以显著提高效率。 #### ...

    HashSet类的用法.pdf

    - 当`HashSet`中的元素为自定义类型时,必须正确地重写`equals()`和`hashCode()`方法以确保元素的唯一性和性能。 以上是对`HashSet`类的基本用法及特性的一个详细介绍。希望这些内容能帮助读者更好地理解和使用`...

    java中Hashcode的作用.docx

    在Java中的散列表(如HashMap、HashSet等)中,Hashcode扮演着关键角色。它可以快速地判断两个对象是否相等,从而提高散列表的性能。 证明Hashcode不是内存地址 有人认为Hashcode是对象在内存中的地址,但这是一种...

    Java_重写equals()和hashCode()

    这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入探讨这两个方法的重写规则和应用场景。 首先,`equals()` 方法是Object类中的一个基础方法,用于比较两个对象是否相等...

    java中hashcode()和equals()方法详解

    为了确保集合类如`HashSet`和`HashMap`的正确行为,`hashCode()`和`equals()`之间必须满足以下条件: - 如果`equals()`方法判定两个对象相等,则这两个对象的`hashCode()`值必须相同。 - 相反,如果两个对象的`...

    hashcode()和equals()

    在Java编程语言中,`hashCode()` 和 `equals()` 方法是两个非常重要的概念,尤其是在处理对象比较和哈希表(如 `HashMap` 或 `HashSet`)时。这两个方法来源于 `Object` 类,是所有Java类的基类,因此,每个自定义类...

    hashCode的作用

    ### hashCode的作用 ...正确地实现`hashCode`方法和与其相匹配的`equals`方法对于确保程序的正确性和性能至关重要。在实际开发中,应当注意对这两个方法的合理使用和重写,以满足具体应用场景的需求。

    set接口经常用的hashCode和equals方法详解

    ### set接口中hashCode和equals方法详解 #### 一、引言 在Java编程语言中,`Set`接口作为集合框架的重要组成部分,在实现无重复元素的数据结构方面扮演着关键角色。为了确保元素的唯一性,`Set`接口依赖于对象的`...

    HashSet和TreeSet.doc

    1. 对于 HashSet,确保添加的对象正确实现了 `hashCode()` 和 `equals()` 方法,以确保元素的唯一性和哈希表的高效性。 2. 如果需要保持元素的特定顺序,或者执行范围查询,那么应该选择 TreeSet,因为它提供了排序...

    java中hashcode()和equals()的详解

    在Java编程语言中,`hashCode()`和`equals()`方法是对象身份验证的关键组成部分,它们主要用于对象的比较和哈希表(如HashMap、HashSet等)的操作。理解这两个方法的工作原理对于编写高效和可靠的代码至关重要。 ...

    HashMap 和 HashSet的区别

    当你尝试向HashSet中添加一个新元素时,它会通过调用该对象的`equals()`和`hashCode()`方法来检查该元素是否已经存在于集合中。如果对象的`equals()`方法返回true,表示两个对象相等,`hashCode()`方法返回相同的值...

    java 序列化和重写 hashCode 的原因

    在Java编程语言中,序列化(Serialization)和重写`hashCode`及`equals`方法是两个重要的概念,它们各自有着特定的用途,并且在某些情况下相互关联。下面将详细阐述这两个概念及其应用。 首先,Java序列化是将一个...

Global site tag (gtag.js) - Google Analytics