Метод map = null и map.clear () одинаковы? - PullRequest
2 голосов
/ 07 марта 2012

Код:

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 голосов
/ 07 марта 2012

NO. они не одинаковы.

  • map = null присваивает NULL ссылку на карту.
  • map.clear() очищает содержимое карты, но объект все еще существует и map все еще ссылается на него.
7 голосов
/ 07 марта 2012

void methodFillMap () { MyMap = NULL; myMap.put (.....)

просто выдаст исключение NullPointerException.

Чтобы очистить карту, вы должны использовать myMap.clear ().

Кстати, между повторным созданием карты и использованием clear есть два отличия:

- Ясно, что не будет изменять размеры карты. Если HashMap содержал n блоков, после очистки он все равно будет содержать n пустых блоков с последствиями для производительности (положительными или отрицательными в зависимости от вашего использования карты)

- если вы используете clear, вы не выбрасываете объект, таким образом, он не будет управляться в следующем GC, с влиянием (положительным) на время GC, если это часто случается.

3 голосов
/ 07 марта 2012

Последний вариант является лучшим, если вы не программируете систему с очень ограниченной памятью, тогда это первый вариант, который лучше всего

  1. В первом случае вы должны очистить хэш-тег, который требует некоторых вычислений.
  2. Звук даже не будет работать, так как вы только что получили нулевую ссылку, а не хэш-карту.
  3. В третьем случае вы просто выбрасываете старую хэш-карту и позволяете сборщику мусора обрабатывать старую.
2 голосов
/ 07 марта 2012

Это не одно и то же, потому что map = nul не отменяет записи на карте. map = null только обнуляет ссылку на карту. См. Четкую реализацию из JDK 7 ниже:

    public void clear() {
        modCount++;
        Entry[] tab = table;
        for (int i = 0; i < tab.length; i++)
            tab[i] = null;
        size = 0;
    }

Я бы использовал map.clear ().

2 голосов
/ 07 марта 2012

После установки карты в ноль, размещение чего-либо внутри нее приведет к NullPointerException.

...