繁体   English   中英

为什么静态hashmap在下面的情况下始终为null

[英]Why static hashmap is always null in below case

//即使首次在addMap方法中初始化,sampleMap也始终为null

公共类Sample {

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();
}

}

addToMap创建一个HashMap实例并将其分配给局部变量。 它不会更改sampleMap静态变量的值。

Java是一种价值传递语言。 因此,将变量传递给方法时,该方法无法更改该变量的值。 如果方法为变量分配新值,则此赋值对于方法是本地的,并且不会更改传递给方法的原始变量的值。

你有几个选择。 这里是其中的一些 :

sampleMap时初始化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);
}

或者不要将sampleMap传递给addToMap addToMap可以直接访问它:

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

最后一件事。 实例方法返回静态成员没有多大意义。 要么使getSampleMap()静态,要么使sampleMap成为实例变量(即非静态)。 这与addToMap()相关。

Java始终是pass-by-value 您无法在方法内重新分配引用。

话虽这么说,没有必要将map传递给adMap方法。 只需直接使用static sampleMap

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM