方法 map=null 和 map.clear() 是相同的吗?

3

代码:

public class MyClass {
 private Map<Integer,String> myMap=new HashMap<Integer, String>();
 ...........................


void methodFillMap(){
   myMap.put(.....);

 .....................
}

}

什么是正确的:

 void methodFillMap(){
 myMap.clear();
 myMap.put(.....);

 .....................
 }

或者
void methodFillMap(){
myMap=null;
myMap.put(.....);

 .....................

或者更好的选择

void methodFillMap(){
  myMap=new HashMap<Integer, String>();
  myMap.put(.....);

  .....................
}
5个回答

8

不是同一个意思。

  • map = null 将null赋值给Map的引用。
  • map.clear() 清空了map的内容,但对象仍然存在且map仍然引用它。

7

void methodFillMap(){ myMap=null; myMap.put(.....);

这段代码会抛出NullPointerException异常。

要清空一个map,应该使用myMap.clear()方法。

顺便提一下,重新实例化map和使用clear之间有两个区别:

-clear不会改变map的大小。如果HashMap包含n个bucket,在执行clear后,它仍将包含n个空桶,这会对性能产生影响(无论是积极的还是消极的,这取决于您使用map的方式)。

-如果您使用clear,那么您就没有丢弃对象,因此它不会通过下一个GC进行管理,如果这种情况经常发生,对GC时间有积极的影响。


3

如果您不是为具有非常有限内存的系统编码,则最后一个选项是最好的,否则第一个选项最佳。

  1. 在第一个情况下,您需要清除哈希表,这需要一些计算。
  2. 第二种情况甚至都不起作用,因为您只得到了一个空引用而不是哈希表。
  3. 在第三种情况下,您只需丢弃旧哈希表,让垃圾收集器处理旧哈希表即可。

1
1和3之间有一个重大的区别。如果其他任何东西都有对地图的活动引用(通过反射或只是另一个本地变量引用地图),那么只要存在其他引用,您的项目就会一直保留在内存中;更糟糕的是,事实上您将拥有两个具有单独实体的地图。通常应使用map.Clear(),除非清除所需的时间明显减慢了应用程序的运行速度。 - Seph

2
它们不同,因为"map=null"不会使地图条目变成null。它只是将地图的引用变为null。请参见JDK 7中的清晰实现:
    public void clear() {
        modCount++;
        Entry[] tab = table;
        for (int i = 0; i < tab.length; i++)
            tab[i] = null;
        size = 0;
    }

今日免费次数已满, 请开通会员/明日再来

2

将地图设置为null后,往里面放任何东西都会导致NullPointerException


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接