`
liujiawinds
  • 浏览: 135796 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

hashCode和hashSet的关系和作用。

    博客分类:
  • java
阅读更多
hashCode
当使用toString方法的时候返回一个 "类型名@#$%#^%$ "的东西,比如一个****@4e57de。"@ "前面的是你的类名,后面的就是散列码的16进制表示。

hashCode 叫哈希代码或称散列码,简单的说就是通过哈希算法算出来的一大窜数字之类的东西和内存有关。默认的实现是将对象内部地址转化为整数作为HashCode,这当然能保证每个对象具有不同的HasCode,因为不同的对象内部地址肯定不同(废话)。因此你可以简单理解为对象在内存中的地址 担不是绝对物理地址。

hashSet
他是一个集合,Java中的集合(Collection)有两类,一类是List,再有一类是Set。前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复
当我们向HashSet集合中添加元素时,它是按hash算法来存储集合中的元素。首先HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。如果两个元素通过equals方法比较返回true,但它们的hashCode()方法返回值不相等,HashSet将会把它们存储在不同位置,也就添加成功。
HashSet集合判断两个元素的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值也相等

总结:hashCode方法对于hashSet的作用
表面上看来,HashSet集合里面的元素都是没有索引的,实际上当程序向HashSet集合中添加元素的时候,HashSet集合会根据这个元素的HashCode值来决定他的存储位置--这个就是说,每个元素的hashCode就是他的"索引";
为什么不直接使用数组呢,还需要使用HashSet呢?,因为数组元素的索引是连续的 ,而且数组的长度是固定的,无法自由增加数组的长度,而且HashSet就不一样了,HashSet来根据每个元素HashCode作为索引,从而自由增加了HashSet的长度,并可以根据元素的HashCode值来访问元素,所以,从HashSet中访问元素的时候,HashSet先计算元素的HashCode值(也就是调用这个对象的HashCode()方法的返回值),安徽直接到这个HashCode对于的位置去取出这个元素---这就是HashSet集合速度很快的原因

如下一个例子;

import java.util.*;
/**
* 
*/

//类A的equals方法总是返回true,但没有重写其hashCode()方法
class A
{
        public boolean equals(Object obj)
        {
                return true;
        }
}
//类B的hashCode()方法总是返回1,但没有重写其equals()方法
class B
{
        public int hashCode()
        {
                return 1;
        }
}
//类C的hashCode()方法总是返回2,且重写其equals()方法
class C
{
        public int hashCode()
        {
                return 2;
        }
        public boolean equals(Object obj)
        {
                return true;
        }
}
public class HashCode
{
        public static void main(String[] args) 
        {
                HashSet books = new HashSet();
                //分别向books集合中添加2个A对象,2个B对象,2个C对象
                books.add(new A());
                books.add(new A());
                books.add(new B());
                books.add(new B());
                books.add(new C());//C类重写了equals()方法总是返回true、hashCode()总是返回2.导致HashSet将会把两个C对象当成一个对象。
                books.add(new C());
                System.out.println(books);
        }
}
结果为[B@1, B@1, C@2, A@1fb8ee3, A@c17164]
分享到:
评论

相关推荐

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

    本篇将深入探讨ArrayList与HashSet的区别,并分析Hashcode在其中的作用。 ArrayList是基于动态数组实现的,它提供了按索引访问元素的能力,就像在数组中一样。由于内部维护了一个数组,ArrayList保证了元素的顺序性...

    java中Hashcode的作用.docx

    Hashcode和equals方法的关系 Hashcode和equals方法是紧密相连的两个概念。在Java中,如果两个对象的equals方法返回true,那么这两个对象的Hashcode一定相同。反之,如果两个对象的Hashcode相同,那么这两个对象不...

    hashCode的作用

    以下是一段示例代码,展示了如何使用`hashCode`方法和`equals`方法,并且解释了它们之间的关系: ```java public class Test { public static void main(String[] args) { HashSet<Demo1> set = new HashSet(); ...

    HashCode的用法详解

    equals() 和 hashCode() 的关系 equals() 和 hashCode() 是两个相关的概念。equals() 用于判断两个对象是否相等,而 hashCode() 用于确定对象的存储地址。在实际应用中,我们需要同时重新定义 equals() 和 hashCode...

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

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

    HashSet去重

    - **`equals`方法的作用**:当两个对象的`hashCode`相同时,`HashSet`会调用这两个对象的`equals`方法来最终确定是否为同一个对象。 - **效率问题**:对于大量数据而言,`HashSet`的效率非常高。哈希表通过`hashCode...

    Java中equals,hashcode和==的区别

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

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

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

    java 序列化和重写 hashCode 的原因

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

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

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

    hashcode和equals的分析

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

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

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

    Java_重写equals()和hashCode()

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...

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

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

    HashSet和TreeSet.doc

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

    HashSet类的用法.pdf

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

    hashcode()和equals()

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

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

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

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

    在`Set`接口中,特别是对于基于哈希表的实现(如`HashSet`),`hashCode`方法的作用尤为重要: - **定位元素**: 当向`HashSet`添加元素时,会首先调用该元素的`hashCode`方法,计算出其哈希码。哈希码被用来确定该...

    利用反射绕过编译器和hashcode高级应用

    1. 哈希表优化:`hashCode()`方法是实现哈希数据结构(如HashMap和HashSet)的关键。正确实现`hashCode()`和`equals()`方法对于提高查找效率至关重要。当我们创建自定义类时,应确保这两个方法遵守一致性原则,即两...

Global site tag (gtag.js) - Google Analytics