当前位置: 首页 > 面试题库 >

创建hashCode()方法-Java

虞俊美
2023-03-14
问题内容

我在hashCode()为自己创建的类编写方法时遇到了麻烦。此类旨在在TreeSet中使用,因此,它实现Comparable。该类具有以下变量:

public class Node implements Comparable<Node> {
   Matrix matrix;
   int[] coordinates= new int[2];
   Node father;
   int depth;
   int cost;

这是该compareTo()方法的实现。我希望TreeSet按其成本来组织这些Node结构,因此,compareTo()返回简单减法的结果。

public int compareTo(Node nodeToCompare) {
    return this.cost - nodeToCompare.cost;
}

我还实现了一种equals()方法。

public boolean equals(Object objectToCompare) {
    if(objectToCompare== this) {return true;}
    if(objectToCompare== null || objectToCompare.getClass()!= this.getClass()) {return false;}

    Node objectNode= (Node) objectToCompare;
    return this.father.equals(objectNode.father) &&
            this.depth== objectNode.depth &&
            this.cost== objectNode.cost &&
            this.matrix.equals(objectNode.matrix) &&
            Arrays.equals(this.coordinates, objectNode.coordinates);
}

说了这么多,我有几个问题:

  1. 由于实施了新equals()方法,因此应该实施新hashCode()方法吗?
  2. 如何method()使用这些变量实施新的hashCode ?(请注意,Matrix类型的变量矩阵已hashCode()实现了一种方法)

就这样!


问题答案:

您的compareTo方法与您的equals方法不一致:您的compareTo方法说两个实例具有相同的含义cost(例如,TreeSet一个实例最多只能包含一个具有给定实例的实例),cost但是您的equals方法却说它们仅等效于它们具有相同性,cost
并且 在其他各种方式中相同。

因此,假设您的equals方法正确:

  • 您需要修复compareTo方法以使其与之一致。
  • 您需要创建一个hashCode与之一致的方法。我建议使用与相同的逻辑java.util.List.hashCode(),这是一种以特定顺序组装组件对象的哈希码的简单有效的方法;基本上,你会写类似:
        int hashCode = 1;
    hashCode = 31 * hashCode +(父亲== null?0:father.hashCode());
    hashCode = 31 * hashCode +深度;
    hashCode = 31 * hashCode +费用;
    hashCode = 31 * hashCode + matrix.hashCode();
    hashCode = 31 * hashCode + java.util.Arrays.hashCode(坐标);
    返回hashCode;


 类似资料:
  • 本文向大家介绍Java实现hashCode()方法,包括了Java实现hashCode()方法的使用技巧和注意事项,需要的朋友参考一下 示例 要轻松实现对象的hashCode方法,可以使用HashCodeBuilder类。 选择字段: 使用反射: 布尔参数指示是否应使用瞬态字段。 使用反射避免某些字段:            

  • 我需要一些帮助,从理论上更好地理解方法。我读过(强调我的): 当对两个单独的对象调用时(根据方法,这两个对象是相等的),它将返回相同的哈希代码值。但是,如果在两个不相等的对象上调用它,它不一定会返回不同的整数值。 上述例外情况会发生在哪里?

  • 问题内容: 改善这个问题 来自链接: http://www.tutorialspoint.com/java/java_string_hashcode.htm Java中的hashCode和equals方法之间的关系 好的hashCode()实现 但是我不了解哈希码。 这是一个例子: 这个简单的程序给我输出: 谁能告诉我:它是如何给我的输出:? 问题答案: 字符串的 哈希码 计算如下: 使用算术,其

  • 问题内容: 我正在为学校进度设计基于文本的冒险游戏。我将每个“级别”设置为一个类,并将每个可探索区域(节点)设置为相应类中的一个方法。 困扰我的是从一个节点移动到另一个节点的代码。由于每个节点最多连接四个其他节点,因此我必须在每种方法中重复一个极为相似的代码块。 我更愿意做的是在每个节点的开头包含一个方法数组,如下所示: 然后将该数组发送到通用方法,然后将播放器发送到正确的节点: 我简化了代码,但

  • 本文向大家介绍Java PropertyPermission hashCode()方法及示例,包括了Java PropertyPermission hashCode()方法及示例的使用技巧和注意事项,需要的朋友参考一下 PropertyPermission类方法 hashCode()方法在java.util包中可用。 hashCode()方法用于获取此PropertyPermission对象的哈希

  • 本文向大家介绍Java中的hashcode方法介绍,包括了Java中的hashcode方法介绍的使用技巧和注意事项,需要的朋友参考一下 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法: 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。 为何Objec