2015-06-30 53 views
1

// sampleMap總是空,即使在addMap方法初始化首次爲什麼靜態HashMap中總是空以下情況下

公共類樣品{

private static HashMap<Long, Long> sampleMap; 

public Sample() { 
    addToMap(sampleMap, 100L, 100L); 
    addToMap(sampleMap, 200L, 200L); 
    addToMap(sampleMap, 300L, 300L); 
    addToMap(sampleMap, 400L, 400L); 
} 

public HashMap<Long, Long> getSampleMap() { 
    return sampleMap; 
} 

private void addToMap(HashMap<Long, Long> map, Long key, Long value) { 
    if (map == null) { 
     map = new HashMap<Long, Long>(); 
    } 
    map.put(key, value); 
} 

public static void main(String[] args) { 
    Sample obj = new Sample(); 
    obj.getSampleMap(); 
} 

}

+0

請仔細閱讀[當有人回答我的問題,我應該怎麼辦(http://stackoverflow.com/幫助/人,答案) – CKing

回答

2

addToMap創建一個HashMap實例並將其分配給一個局部變量。它不會更改sampleMap靜態變量的值。

Java是一種通過價值語言。因此,當您將一個變量傳遞給方法時,該方法不能更改該變量的值。如果該方法爲該變量賦予一個新值,則該賦值對該方法而言是本地的,並且不會更改傳遞給該方法的原始變量的值。

你有幾種選擇。下面是其中一些:

初始化sampleMap當它宣佈:

private static HashMap<Long, Long> sampleMap = new HashMap<Long, Long>(); 

或初始化sampleMap之前先調用addToMap

public Sample() { 
    sampleMap = new HashMap<Long, Long>(); 
    addToMap(sampleMap, 100L, 100L); 
    addToMap(sampleMap, 200L, 200L); 
    addToMap(sampleMap, 300L, 300L); 
    addToMap(sampleMap, 400L, 400L); 
} 

或不通過sampleMapaddToMapaddToMap可以直接訪問它:

private void addToMap(Long key, Long value) { 
    if (sampleMap == null) { 
     sampleMap = new HashMap<Long, Long>(); 
    } 
    sampleMap.put(key, value); 
} 

最後一件事。實例方法返回靜態成員是沒有意義的。使getSampleMap()靜態,或使sampleMap爲實例變量(即非靜態)。這與addToMap()相關。

1

Java始終是pass-by-value。您不能在方法內重新分配引用。

這就是說,沒有必要通過mapadMap方法。只需使用staticsampleMap直接:

private void addToMap(Long key, Long value) { 
    if (sampleMap== null) { 
     sampleMap= new HashMap<Long, Long>(); 
    } 
    sampleMap.put(key, value); 
} 

然後你可以改變你的construcotr爲:

public Sample() { 
    addToMap(100L, 100L); 
    addToMap(200L, 200L); 
    addToMap(300L, 300L); 
    addToMap(400L, 400L); 
} 
相關問題