簡體   English   中英

java ConcurrentHashMap 以構造函數為鍵

[英]java ConcurrentHashMap with constructor as key

我目前正在嘗試用 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;

}

因此,當我運行主類時,我創建了一個新的 ValueContainer,其值為 1、2、3,並將其與字符串“Just a String”一起放入地圖容器中。 然后我用那個確切的值容器讀取字符串並將其打印出來。 果然程序可以工作,我在控制台中打印了“只是一個字符串”。

所以現在是我的游戲:在我的游戲中,我必須訪問一個類似的 ConcurrentHashMap,但我不能使用相同的 ValueContainer 來訪問 String,但我必須使用new ValueContainer(1, 2, 3);創建一個新的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)));

    }

}

現在我的問題:

有什么方法可以讓我在第二個主類中使用該版本,但沒有問題,以便我在控制台中打印出“只是一個字符串”?

謝謝你。

是的,很簡單。

您必須在ValueContainer類中覆蓋Object.hashCode()Object.equals()兩個方法。

請查看添加這兩種方法的 API 文檔。 應用程序接口

也許您使用像 Ecplise 或 IntelliJ 這樣的 IDE,它可以幫助您了解細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM