热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

谁在将元素放入HashMap时调用类的equals方法?

如何解决《谁在将元素放入HashMap时调用类的equals方法?》经验,为你挑选了2个好方法。

我是Java新手(非常新)。我试图了解HashMap和类的equals方法,以及它如何覆盖重复项。请参见以下代码:

public class Student {

    Integer StudentId;
    String Name;
    String City;

    public Student(Integer studentId, String name, String city) {
        super();
        StudentId = studentId;
        Name = name;
        City = city;
    }

    public Integer getStudentId() {
        return StudentId;
    }

    public String getName() {
        return Name;
    }

    public String getCity() {
        return City;
    }




    @Override
    public int hashCode() {
        System.out.println("haschode is called for " + this);

        final int prime = 31;
        int result = 1;
        result = prime * result + ((StudentId == null) ? 0 : StudentId.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        System.out.println("equals is called for " + this);

        if (this == obj)
            return true;

        if (obj == null)
            return false;

        if (getClass() != obj.getClass())
            return false;

        Student other = (Student) obj;

        if (StudentId == null) {
            if (other.StudentId != null)
                return false;

        } else if (!StudentId.equals(other.StudentId))
            return false;

        return true;
    } 


    @Override
    public String toString() {
        return "\n Student [StudentId=" + StudentId + ", Name=" + Name + ", City=" + City + "] \n";
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub


         Map myMap = new HashMap();

         myMap.put(new Student(1, "andy", "p"), "Great");     //Line 1
         myMap.put(new Student(2, "sachin", "m"), "Better");
         myMap.put(new Student(3, "dev", "s"), "Good");
         myMap.put(new Student(1, "andy", "p"), "Excellent"); // Line 4

         System.out.println(myMap);


    }

}

现在,仅当我编写再次放置相同键(即“第4行”)的代码时,用main()编写的代码才调用equals方法(请参见我的代码缩进)。

为什么没有为“第2行”和“第3行”调用equals方法?它应该为每条推杆线都要求等于....对吗?

我在这里缺少一些理解,并留有以下问题:(1)为什么每个看跌期权都不调用equals方法来检查类成员的相等性?(2)谁触发Student类equals方法的调用?



1> Zircon..:

它应该为每条推杆线都要求等于....对吗?

否。HashMap equals仅在遇到现有键和中给定的键之间的哈希冲突后才会调用put

改写后,它hashCode首先调用以确定将密钥放入哪个“哈希存储桶”,如果目标存储桶中已存在密钥,则它将equals用于比较存储桶中的密钥是否相等。

由于的值Student.hashCode()仅基于ID,因此在插入期间,仅equals当映射遇到Student与插入的ID具有相同ID 的键时,才需要调用该映射。如果没有现有键与hashCode要插入的键相同,则无需调用equals

HashMap在插入期间非常有效。这也是为什么hashCode和之间存在契约的原因equals:如果两个对象定义相同equals,则它们也必须具有相同的含义hashCode(但不一定相反)。



2> daniu..:

equals()如果hashCode()结果不同,则不调用。它仅与1号线和4号线相同(学生ID为1),因此equals()被称为。

请注意,hashCode()对于两个不同的对象可能是相同的equals(),但是两个equals()对象绝不能有不同hashCode()

如果根据equals(Object)方法,两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。

根据equals(java.lang.Object)方法,如果两个对象不相等,则不需要在两个对象中的每个对象上调用hashCode方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

因此,最初不同的哈希码足以在equals()以后不调用。


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每 ... [详细]
  • 本篇文章给大家分享的是有关Java中怎么对HashMap按键值排序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话 ... [详细]
  • 将学生对象和学生的归属地通过键与值存储到map集合中。importjava.util.HashMap;importjava.util.Iterator;importjava.uti ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • 转载自:http:www.blogjava.netCarpenterLeearchive20160427430268.html总体介绍之所以把HashSet和HashMa ... [详细]
  • 类Hashtable<K,V>所有已实现的接口:Serializable,Cloneable,Map<K,V>此类实现一个哈希表,该哈希表将键映 ... [详细]
  • 01Map集合概述A:Map集合概述:我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同a:Collection中的集合 ... [详细]
  • Java面试 HashMap、HashSet源码解析
    本章所有源代码基于JDK1.8版本HashMap和HashSet是JavaCollectionFramework的两个重要成员,其中HashMap是Map接口的常用实现类,Hash ... [详细]
author-avatar
梦露的殇_192
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有