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

当我创建对象的新实例作为键时,Java HashMap.get()返回null

韩弘阔
2023-03-14
问题内容

我正在制作电子表格应用程序,并且正在使用HashMap将数据存储在单元格中。作为关键,我使用的是Point类,该类仅具有行数和列数。我遇到的问题是,如果我将HashMap.get()与新的Point一起使用,它将返回一个空值。

    HashMap<Point, String> cache = new HashMap<Point, String>();
    Point p1 = new Point(1,1);
    Point p2 = new Point(2,2);
    cache.put(p1, "Test: 1,1");
    cache.put(p2, "Test: 2,2");

    int maxRow = 2;
    int maxCol = 2;
    for (int i = 1; i <= maxRow; i++) {
        for (int j = 1; j <= maxCol; j++) {
            System.out.print(cache.get(new Point(i,j)));
            if (j < maxCol) 
                System.out.print("\t");
            if (j == maxRow)
                System.out.println("");
        }
    }

返回

null     null
null     null

我可能缺少明显的东西,但我自己找不到。另外,如果您碰巧知道是否有更好的数据结构来存储我希望听到的单元格中的数据。提前致谢!


问题答案:

为了在上面详细说明我的评论,您的Point类应该实现哈希码,并且应如下所示:(存在许多实现,这只是一个可行的实现)假设实例的变量为xy

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

        Point point = (Point) o;

        if (x != point.x) return false;
        if (y != point.y) return false;

        return true;
    }

    public int hashCode() {
        int result = x;
        result = 31 * result + y;
        return result;
    }

否则,如果您不重写这些方法,则ObjectJavadoc可以很好地说明您的问题:

As much as is reasonably practical, the hashCode method defined by
     * class {@code Object} does return distinct integers for distinct
     * objects. (This is typically implemented by converting the internal
     * address of the object into an integer, but this implementation
     * technique is not required by the
     * Java<font size="-2"><sup>TM</sup></font> programming language.)
     *
     * @return  a hash code value for this object.
     * @see     java.lang.Object#equals(java.lang.Object)
     * @see     java.lang.System#identityHashCode
     */
    public native int hashCode();

因此,new Point(1,2)将不会被视为等于new Point(1,2),因此永远不会从中检索到Map



 类似资料:
  • 在我的应用程序中,用户可以将电影标题添加到他们的观看列表中。在我的组件中,我有以下功能: 这目前有一些虚拟信息。 在我的服务中,我有: 所以我将电影对象和令牌传递给后端。 在我的电影ontroller.java我有: 以及movieService中的createMovie功能: 这一切都很好,但我想在电影成功添加到列表(数据库)时向angular应用程序返回一条消息。我想我应该使用@Respons

  • 我想尝试一下我在C中读到的关于按值返回的内容(在新对象为create的情况下,这与按值传递相同) 终端输出是这样的: > 我希望中的行为是:a.创建Kar2 b。将其复制到Kar 3并返回它(随后将Kar 3分配给Kar 1)。为什么不呢? 如果我取消注释< code > Kar k2 = foo();我得到编译器消息: 错误:没有匹配函数调用Kar::Kar(Kar) 当然,我不能添加构造函数,

  • 是否可以自动创建返回的setter? 尝试了以下操作,但这样它不起作用,但是这个例子显示了我想要实现的目标: 手动解决方案 编写coure的<code>setter</code>和<code>getter</code>我自己,如下所示: 问题 这个过程可以用kotlin自动化吗?有什么办法可以做到这一点吗?

  • 问题内容: 例如: 相对于: 一个比另一个更有效吗? 问题答案: 返回之前分配给临时变量使您有机会从newPerson()中进行错误检查和更正。返回新的调用要求newPerson()方法的调用者捕获错误并从错误中恢复。

  • 我得到了这个转义的JSON 我需要使用Jackson将其转换为Java对象。 然后我创建了一个方法来转换它 Data类中设置为public的变量,那么调用getter时,我将获得。Data类中设置为private的变量,那么调用getter时将得到。 getter和setter总是公共的。

  • 我的实现中有以下代码行: 我试着在我的测试课上模仿上述内容,如下所示: 但是当我调试测试代码时,我可以看到myService。getTypes正在返回一个空列表。有什么问题? 还有,有没有办法使用args来简化上述模拟?我发现的只是使用传递到方法中的参数,而不是传递到方法中的参数。