2015-06-30 52 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); 
} 
相关问题