提问者:小点点

java以构造函数为键的并发HashMap


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

当运行代码时,我从一些并发哈希映射中读取时得到值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类。它基本上是一个类,其中包含一个并发HashMap和两个访问它的方法:

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,并将其与字符串“只是一个字符串”一起放入map Container。然后我用那个精确的Value容器读取字符串并将其打印出来。果然,程序正常工作,我在控制台中打印了“只是一个字符串”。

所以现在有了我的游戏:在我的游戏中,我必须访问一个类似的并发HashMap,但是我不能使用相同的ValueContainer来访问字符串,但是我必须使用new ValueContainer(1,2,3)创建一个新的;所以很明显,并发HashMap不能返回“只是一个字符串”,因为它不是同一个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)));

    }

}

现在我的问题是:

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

谢谢你。


共1个答案

匿名用户

是的,很简单。

您必须覆盖类ValueContainer中的两个方法Object. hashCode()Object.equals()

请看看添加API-留档的两种方法。API

也许你使用一个IDE,如Ecplise oder IntelliJ,这将帮助你了解细节。