java 以构造函数为键的 ConcurrentHashMap
java ConcurrentHashMap with constructor as key
我目前正在尝试在 java lwjgl/OpenGL 中编写一个小游戏。
当 运行 连接代码时,我从某些 ConcurrentHashMap 读取时得到值 NULL。
我写了一个简单的程序来重现同样的问题,果然,我可以。
让我向您展示代码:
该计划由三个 classes 组成。
主 class:
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 class。
它基本上是一个 class,包含一个 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。
class 只包含三个整数 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;
}
所以当我 运行 main class 时,我创建了一个新的 ValueContainer,其值为 1、2、3,并将其与 String "Just a String".
然后我用那个确切的值容器读取字符串并将其打印出来。
果然程序运行正常,我在控制台中打印了 "Just a String"。
所以现在是我的游戏:
在我的游戏中,我必须访问类似的 ConcurrentHashMap,但我不能使用相同的 ValueContainer 来访问字符串,但我必须使用 new ValueContainer(1, 2, 3);
创建一个新的
所以显然 ConcurrentHashMap 不能返回 "Just a String",因为它不是同一个 ValueContainer,所以它返回 NULL。
这是 Main class 的代码,稍作修改:
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)));
}
}
现在我的问题是:
有什么方法可以让我使用第二主class中的版本,但没有问题,所以我
在控制台中打印出来 "Just a String"?
谢谢。
是的,很简单。
您必须在 class ValueContainer
.
中覆盖 Object.hashCode()
和 Object.equals()
这两个方法
请查看添加这两种方法的API-文档。
API
也许您使用 IDE 之类的 Ecplise 或 IntelliJ,这将帮助您了解细节。
我目前正在尝试在 java lwjgl/OpenGL 中编写一个小游戏。
当 运行 连接代码时,我从某些 ConcurrentHashMap 读取时得到值 NULL。 我写了一个简单的程序来重现同样的问题,果然,我可以。
让我向您展示代码: 该计划由三个 classes 组成。 主 class:
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 class。 它基本上是一个 class,包含一个 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。 class 只包含三个整数 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;
}
所以当我 运行 main class 时,我创建了一个新的 ValueContainer,其值为 1、2、3,并将其与 String "Just a String". 然后我用那个确切的值容器读取字符串并将其打印出来。 果然程序运行正常,我在控制台中打印了 "Just a String"。
所以现在是我的游戏:
在我的游戏中,我必须访问类似的 ConcurrentHashMap,但我不能使用相同的 ValueContainer 来访问字符串,但我必须使用 new ValueContainer(1, 2, 3);
创建一个新的
所以显然 ConcurrentHashMap 不能返回 "Just a String",因为它不是同一个 ValueContainer,所以它返回 NULL。
这是 Main class 的代码,稍作修改:
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)));
}
}
现在我的问题是:
有什么方法可以让我使用第二主class中的版本,但没有问题,所以我 在控制台中打印出来 "Just a String"?
谢谢。
是的,很简单。
您必须在 class ValueContainer
.
Object.hashCode()
和 Object.equals()
这两个方法
请查看添加这两种方法的API-文档。 API
也许您使用 IDE 之类的 Ecplise 或 IntelliJ,这将帮助您了解细节。