`
NicholasBugs
  • 浏览: 51795 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

关于hashcode的一点理解

    博客分类:
  • Java
阅读更多
hashcode()是java.lang.Object的一个函数,它的主要被使用在对Collection中对象的存取中。
java.lang.Object中对hashcode()方法的描述是这样的:
   
引用

     The general contract of hashCode  is:
     I:   Whenever it is invoked on the same object more than once during
           an execution of a Java application, the hashCode  method
           must consistently return the same integer, provided no information
           used in  equals  comparisons on the object is modified.
           This integer need not remain consistent from one execution of an
           application to another execution of the same application.
     II:   If two objects are equal according to the  equals(Object) 
           method, then calling the hashCode method on each of
           the two objects must produce the same integer result.
     III:  It is *not* required that if two objects are unequal
           according to the  java.lang.Object#equals(java.lang.Object)
           method, then calling the hashCode  method on each of the
           two objects must produce distinct integer results.  However, the
           programmer should be aware that producing distinct integer results
           for unequal objects may improve the performance of hashtables.
   

再来看看java.util.HashMap 中 存取对象时对hashcode()函数的使用:   
 
public V get(Object key) {
	if (key == null)
	    return getForNullKey();
        //对key的hash码进行映射 
        int hash = hash(key.hashCode());
        /**
         *把得到的hash码处理成0到table.length之间的值,做为查找对象的index,沿着
         *这条链表查找该key对应的对象(hashMap 中使用链表数组储存对象)。
         *e.hash与该key的hash码相等的Entry对象中的value被返回。
         */              
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                return e.value;
        }
        return null;
    }

由此看来如果一个class的hashcode函数效果不够好,就可能使得hashMap的链表数组中的某个链表非常长,从而影响了hashMap的存取效率。
分享到:
评论

相关推荐

    Java_重写equals()和hashCode()

    当同时重写 `equals()` 和 `hashCode()` 时,需要注意的一点是,如果 `equals()` 返回true,那么两个对象的 `hashCode()` 必须相等。反之则不一定,因为不同的对象可能会产生相同的哈希码。这就是为什么在设计类时,...

    浅谈Java中的hashcode方法(推荐)

    虽然某些JVM实现可能会这样做,但Java规范并没有规定这一点。实际上,`hashCode()`的实现通常会基于对象的字段值或其他相关属性来生成一个独特的哈希码,以确保不同对象的哈希码尽可能不同,从而降低哈希冲突的可能...

    详解Java中用于查找对象哈希码值的hashCode()函数

    首先,理解`hashCode()`的作用非常重要。当你向哈希表(如HashMap)中添加对象时,`hashCode()`被调用来计算对象的哈希码,这个哈希码随后用于确定对象在数组中的位置,因为哈希表本质上是一个基于数组的结构。哈希...

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

    为了实现这一点,每个对象都需要提供一个`hashCode()`方法,该方法返回一个整数值作为对象的哈希码。这样,当向集合中添加新元素时,可以通过计算元素的哈希码来快速找到其应存储的位置,大大提高了查找和插入的效率...

    Java初学者问题图解(动力节点Java学院整理)

    理解这一点对于避免并发问题至关重要。 7. **Java对象在堆中的内存结构**:在Java中,对象实例通常存储在堆内存中,而方法和局部变量(包括引用和基本类型)存储在栈内存中。然而,特定情况(如栈上分配、字符串...

    最新面试宝典 绝对好用

    关于equals()和hashCode(),面试中可能会考察你对这两个方法在对象比较和哈希表中的作用的理解,虽然两个对象equals()相等,但hashCode()不一定相等,尤其是在自定义类中重写这些方法时。 继承String类在Java中是不...

    2023最新Android 面试篇(2303版).pdf

    本资源摘要信息涵盖Java基础知识点,主要涉及Java中的数据类型、equals和hashCode方法、基本数据类型和引用类型的区别、多态的理解、String、StringBuffer和StringBuilder的区别等。 1. Java中==和equals和hashCode...

    Java 最常见面试题总结.pdf

    - **示例**:下面通过一个简单的例子来理解这一点: ```java class Cat { public Cat(String name) { this.name = name; } private String name; public String getName() { return name; } public ...

    Object.doc

    为了实现这一点,子类通常会覆盖 `equals` 方法来提供自定义的行为。 **语法**: ```java public boolean equals(Object obj); ``` **示例**: 假设有一个 `Circle` 类,包含一个 `radius` 属性,我们可以重写 `...

    DSL.rar_scala 计算器

    4. **案例类**:Scala的`case class`不仅提供数据封装,还自动生成`equals`, `hashCode`, `toString`等方法,便于构建和比较表达式。它们在构建DSL时经常被用来表示特定的语义实体。 5. **函数组合**:函数可以被视...

    JDK7u21反序列链学习.doc

    当反序列化一个恶意构造的`LinkedHashSet`时,攻击者可以利用这一点来执行非预期的操作。 接着,我们提到`AnnotationInvocationHandler`,这是一个用于处理注解的动态代理类。在反序列化过程中,`...

    Java语言编程-常用类

    数组的下标从0开始,这一点非常重要,因为在访问数组元素时,如果忘记这一规则,很容易引发`ArrayIndexOutOfBoundsException`异常。 ### 数组的声明与创建 数组的声明类似于其他引用类型的变量声明,但具有特定的...

    java 注释风格和java格式风格模版

    在Java编程中,保持代码的清晰性和可读性至关重要,这不仅有利于个人开发时的理解,也方便团队协作和后续的维护。注释风格和代码格式是实现这一目标的关键要素。本文将详细介绍Java中的注释风格和代码格式模板,并...

    2021-2022计算机二级等级考试试题及答案No.2931.docx

    - **知识点说明**:Excel 提供了丰富的图表工具,可以将表格中的数据以图表形式展示出来,便于数据的分析和理解。 ### 15. Access 数据库的类型 - **知识点说明**:Microsoft Access 是一个关系型数据库管理系统,...

    Java进阶路线

    理解这一点对于正确处理变量和对象之间的交互至关重要。 **2. hashCode & equals** `hashCode()` 和 `equals()` 方法通常一起重写以确保对象的唯一性和相等性判断。正确的实现可以提高哈希表(如HashMap)的效率。...

    有趣的代码段实现去重

    2. **额外空间消耗**:需要额外的空间来存储临时的 `HashSet` 对象,对于内存敏感的应用可能需要注意这一点。 ### 四、扩展应用 除了简单的去重之外,这种方法还可以进一步扩展应用于其他场景,例如: - **统计...

    HashMap 概述 精讲 .md

    - **性能**:在添加元素时,HashSet可能稍微快一点,因为它只需要存储一个键(即元素本身),而HashMap需要存储键和对应的值。 ### HashMap 底层结构 #### AbstractMap 类 AbstractMap是HashMap的父类之一,提供...

    ValidarPalabras等于

    标题“ValidarPalabras等于”很可能是指一个Java项目或程序,其主要功能是验证单词或字符串是否...通过阅读和分析`ValidarPalabrasEquals-master`项目的源代码,我们可以深入理解这些知识点在实际应用中的具体实现。

    东南融通面试题 内部

    ### 东南融通面试题解析 #### Java基础 1. **状态模式的缺点:** - 实现复杂:状态模式需要定义多个类来表示不同的状态,这可能导致代码量...通过深入理解这些知识点,可以帮助开发者更好地应对实际项目中的挑战。

    现代编程语言- Kotlin 之美 - 当下最火的编程语言欣赏.pdf

    这些优势不仅限于易于理解和避免不必要的对象创建,还包括能够灵活地返回原类型的任何子类型。虽然Kotlin并没有提供“static”关键字或静态成员的概念,但它通过引入“伴生对象”这一概念,巧妙地实现了类似的功能。...

Global site tag (gtag.js) - Google Analytics