我目前正在尝试用java lwjgl / OpenGL写一个小游戏。

当运行代码时,从某些ConcurrentHashMap中读取时,我得到的值为NULL。
我已经编写了一个简单的程序来重现相同的问题,而且可以肯定的是,我可以。

让我向您展示代码:
该计划包括三个类别。
主类:

package main;

public class Main {

    private MapContainer con = new MapContainer();

    public static void main(String[] args) {

        new Main();

    }

    public Main() {

        ValueContainer vc = new ValueContainer(1, 2, 3);
        this.con.set(vc, "Just a String");
        System.out.println(this.con.get(vc));

    }

}



然后是MapContainer类。
基本上,这是一个包含ConcurrentHashMap和两个访问它的方法的类:

package main;

import java.util.concurrent.ConcurrentHashMap;

public class MapContainer {

    private ConcurrentHashMap<ValueContainer, String> map = new ConcurrentHashMap<>();

    public void set(ValueContainer key, String value) {
        this.map.put(key, value);
    }

    public String get(ValueContainer key) {
        return this.map.get(key);
    }

}


最后是ValueContainer。
此类仅包含三个整数x,y和z,以及用于设置这些值的构造方法。

package main;

public class ValueContainer {

    public ValueContainer(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public int x, y, z;

}


因此,当我运行主类时,我将创建一个具有值1、2、3的新ValueContainer并将其与字符串“ Just a String”一起放入映射容器中。
然后,我读取具有该确切值容器的字符串并打印出来。
果然程序可以正常工作,并且我在控制台中打印了“ Just a String”。

所以现在有了我的游戏:
在我的游戏中,我必须访问类似的ConcurrentHashMap,但是我不能使用相同的ValueContainer来访问String,但是我必须使用new ValueContainer(1, 2, 3);创建一个新的
因此很明显,ConcurrentHashMap不能返回“ Just a String”,因为它不是同一个ValueContainer,所以它给出了NULL。
这是经过一些小的修改的Main类的代码:

package main;

public class Main {

    private MapContainer con = new MapContainer();

    public static void main(String[] args) {

        new Main();

    }

    public Main() {

        this.con.set(new ValueContainer(1, 2, 3), "Just a String");
        System.out.println(this.con.get(new ValueContainer(1, 2, 3)));

    }

}


现在我的问题是:

有什么办法让我在第二个主类中使用该版本,但是没有问题,所以我
在控制台中打印出“只是一个字符串”?

谢谢。

最佳答案

是的,非常简单。

您必须在类Object.hashCode()中重写两个方法Object.equals()ValueContainer

请看一下添加两种方法的API文档。
API

也许您使用诸如Ecplise oder IntelliJ之类的IDE,它将为您提供详细信息。

10-08 13:09