当前位置: 首页 > 知识库问答 >
问题:

在HashMap中找不到自定义对象?

桑璞
2023-03-14

嗨,我正在尝试学习hashcode()和equals()方法的目的。我尝试了以下程序。

import java.util.HashMap;

public class LearnHascode {

public String name;
public int age;
LearnHascode(String na)
{
    name = na;
}
public int hashCode()
{
    return name.hashCode();
}
public boolean equals(LearnHascode obj)
{
    return this.name.equals(obj.name);
}
public static void main(String[] args)
{
    HashMap h = new HashMap();
    LearnHascode ob1 = new LearnHascode("Prabha");
    LearnHascode ob2 = new LearnHascode("Prabha");

    h.put(ob1, v1);
    h.put(ob2, v2);


    System.out.println(h);
    System.(h.out.printlncontainsKey(new LearnHascode("Prabha")));

}

}

输出:

{hash.LearnHascode@8ef7bdfc=Two, hash.LearnHascode@8ef7bdfc=one}
false

我有两个疑问:

1) 我认为HashMap将包含一个条目,因为两个对象(ob1和ob2)的hascode是相同的。有人能解释为什么HashMap中有两个条目吗?

2)为什么System.(h.out.printlncontainsKey(new LearnHascode("Pabha")));返回false?

共有2个答案

温智明
2023-03-14

您没有正确实现hashCode()和equals()方法。

公务舱员工{

private int empId;

private String empName;

public Employee(int id, String name){
    empId = id;
    empName = name;
}

public int getEmpId() {
    return empId;
}

public void setEmpId(int empId) {
    this.empId = empId;
}

public String getEmpName() {
    return empName;
}

public void setEmpName(String empName) {
    this.empName = empName;
}


public int hashCode(){
    System.out.println("In Hash Code");
    int hashCode = 20;
    hashCode *= this.empId;
    hashCode += this.empName.hashCode();
    return hashCode;
}

public boolean equals(Object obj){
    System.out.println("In equals");
    if(!(obj instanceof Employee)){
        return false;
    }
    Employee emp = (Employee) obj;
    return (emp.getEmpName().equals(this.getEmpName())) && (emp.getEmpId() == this.getEmpId());
}

}

申屠弘图
2023-03-14

你的equals()方法是错误的,这会破坏HashMapequals()的参数始终是对象;您必须检查它是什么类型的对象,并将其投射到方法体中。

hashCode()值用于将对象分类,但equals()用于确定两个对象是否实际上相同。您需要正确定义这两种方法才能使HashMap正常工作。

 类似资料:
  • 下面的代码没有给我正确的答案。 这给出; 一般来说,若给定了点的数组列表,我们如何在数组中找到特定点的索引?

  • Apache Ignite序列化/反序列化与字段反序列化的顺序有关。我需要在Ignite缓存中放置一个“b”实例,如下所示: 如果我运行以下代码: b1来自缓存映射值:null 问题是子字段在父字段之前被反序列化,因此当Ignite反序列化B时,它首先创建一个空的B对象(带有null“name”和“mapofb”),然后尝试反序列化mapofb。它创建Hashtable,然后反序列化它包含的每个对

  • 问题内容: 我是泛型新手,所以不确定我的问题的答案是否是真的。在下面的代码中,对一个对象条目的键进行大小写需要什么? 它似乎很容易被替换 更多参考: 问题答案: 这是一种极端的优化措施,对于通用编程实践来说可能不是必需的。这是一个可以回答您问题的讨论。下面的语句是从该帖子中复制的: 这是Doug Lea流行的一种编码风格。这是一个极端的优化,可能没有必要。您可以期望JIT进行相同的优化。(您可以尝

  • Maven告诉我:您的过滤器与任何原型都不匹配。我的系统: null 我已采取的步骤是: Create my project Navigate to my project in command prompt and run the command: cd返回到“我的项目”文件夹并运行命令 运行该命令后,我会看到:

  • 我正在尝试实现一个自定义的 Spring 存储库。我有界面: 其中RataEntity类是 它的实施 和以下存储库类 当我运行我的应用程序时,我得到这个错误: 未能创建方法公共摘要的查询java.util.Listit.aubay.PreliosPAN.repositories.RataRepositoryCustom.getRateFromTipo频率zaRimborso(java.lang.字