Как удалить содержимое карты? - PullRequest
0 голосов
/ 29 июля 2011

Итак, я создал программу, и казалось, что все идет хорошо, пока я не дошел до стадии отладки.И одна из больших проблем, которую я обнаружил, заключалась в том, что используемый LinkedHashMap на самом деле не удалял его предыдущее содержимое, когда я вызывал map.clear() в конце цикла.Поэтому мне было интересно, знает ли кто-нибудь или мог бы показать мне хороший итеративный способ удаления содержимого карты?

Ответы [ 3 ]

4 голосов
/ 29 июля 2011

Это прекрасно работает в Open JDK 1.6.И если вы посмотрите на источник LinkedHashMap, просто нет шансов, что это не сработает.

public static void main(String[] args) {
    LinkedHashMap<String, String> test = new LinkedHashMap<String, String>();
    test.put("a", "1");
    test.put("b", "2");
    test.put("c", "3");
    test.put("d", "4");

    System.err.println(test);
    test.clear();
    System.err.println(test);
}

РЕДАКТИРОВАТЬ: это описывает вашу проблему?

2 голосов
/ 29 июля 2011

Интерфейс Map объявляет clear() как необязательную операцию. Тем не менее, ваш тег говорит, что вы используете LinkedHashMap, а Javadocs говорят, что карта должна быть пустой, когда вызов возвращается. Можете ли вы предоставить пример кода, демонстрирующий, что вы все еще можете извлечь элемент по некоторому ключу даже после вызова clear()?

РЕДАКТИРОВАТЬ # 1: Мне приходит в голову, что вы можете иметь в виду, что сами объекты не сразу собираются в мусор после удаления сопоставлений из вашего Map; это меня совсем не удивит. Очистка записей на карте не означает, что сами объекты должны быть собраны мусором или завершены сразу после завершения этого метода. Не могли бы вы уточнить, что вы ожидаете, пожалуйста?

РЕДАКТИРОВАТЬ # 2 Я написал следующий контрольный пример:

public static void main(String args[]) {
    Map<String, Object> map = new LinkedHashMap<>();
    map.put("one", 1);
    map.put("two", 2);
    map.put("three", 3);
    System.out.println(map);
    map.clear();
    System.out.println(map);
}

И заметил следующий вывод:

{one=1, two=2, three=3}
{}

Не могли бы вы предоставить пример кода, который демонстрирует, что именно вы делаете, и отличается от этого?

1 голос
/ 29 июля 2011

Объекты удаляются только тогда, когда они удаляются сборщиком мусора (расписание которого зависит от реализации).Поэтому единственное, что вы действительно можете сделать, это убедиться, что в вашем приложении нет ссылок на эти объекты.Если они есть, они не будут собирать мусор.

Вы можете попытаться вставить виртуальную машину в сборщик мусора, вызвав System.gc();.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...