2017-10-13 28 views
0

我有這個類:將條目添加到HashMap中成爲法後空結束

public class MyClass{ 

     private static Map<int[], Terrain> allTerrain = new HashMap<int[], Terrain>(); 

     public static void main(String[] args){ 
      populate(); 
      int[] test = {0, 0}; 
      System.out.println(allTerrain.get(test)); 
     } 

     private static void populate() { 
      for (int i=0; i<10; i++) { 
       int[] index = {i, i}; 
       allTerrain.put(index, new Terrain()); 
      } 
      int[] test = {0, 0}; 
      System.out.println(allTerrain.get(test)); 
     } 

    } 

裏面的allTerrain.get()方法返回對象實例的方法,但是當我使用allTerrain.get()外的方法,它返回null爲所有條目。 一切運行在主線程上,所以併發性不是問題(我認爲)。 關於如何解決這個問題的任何想法?

回答

2

它不在範圍內和外部從allTerrain圖中檢索值。

null 
null 

的問題是,當你在一個HashMap使用密鑰的對象,它需要實現hashcodeequals以有用的方式。具有相同值的數組不被視爲相等。因此,他們不參考相同的密鑰

Boolean equal = new int[]{1, 2}.equals(new int[]{1, 2}) // is false 
+0

嗯,我不知道爲什麼,但是當它在方法內部運行時,它會返回如下內容:'com.terrain.Terrain @ 4f47d241' – spcan

0

因爲數組是僅當它們是相同的對象相等。其中一個int[]{0,0}與另一個int[]{0,0}不一樣。你可以定義一個類型類用於存儲組合鍵或者我會說使用lombok@value註釋,它創建明智的equals和hashCode方法。