В чем разница между методами Map.putAll () и Map.clone ()? - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу выяснить, в чем плюсы и минусы этих двух методов.

Я пытался узнать об этом здесь и на некоторых других сайтах, но я не нашел этой конкретной информации.

import java.util.HashMap;
import java.util.Map;

public class Maps {
    private Map<Integer, String> map = new HashMap<>();
    private HashMap<Integer, String> map2 = new HashMap<>();
    private Map<Integer, String> map3 = new HashMap<>();

private void initialization() {
    map.put(1, "Hello");
    map.put(2, "everyone!");
    map.put(3, "Nice to");
    map.put(4, "meet you");
}

public static void main(String[] args) {
    Maps exe = new Maps();
    exe.initialization();
    exe.map2.putAll(exe.map);
    exe.map3 = (Map<Integer, String>) exe.map2.clone();
    System.out.println(exe.map2.values());
    System.out.println(exe.map3.values());

}

}

Я получаю тот же результат, но мне интересно, в какой ситуации мне следует использовать тот или иной метод.

1 Ответ

0 голосов
/ 29 декабря 2018

Map.putAll() добавляет все сопоставления из аргумента к существующей карте , на которой она вызывается.Если целевая карта уже имеет сопоставления для тех же ключей, исходные сопоставления будут заменены.Сопоставления для всех остальных ключей будут сохранены.

В общем, следует предположить, что Map.clone() будет выбрасывать CloneNotSupportedException, так как это поведение, унаследованное от класса Object и интерфейса Mapне определяет другое поведение.Тем не менее, HashMap, в частности, предоставляет метод clone(), который создает новую, пологую копию карты, на которой он вызывается.Обратите внимание, что существует большая разница между созданием новой карты, как это делает HashMap.clone(), и добавлением записей в существующую карту, как это делает Map.putAll(), хотя это имеет меньшее значение в случае, когда целевая карта putAll() изначально пуст.

Когда вы хотите создать копию Map, обычно лучше выбрать соответствующий класс реализации и создать его экземпляр с помощью конструктора, который принимает карту источника в качестве параметра.Такой конструктор не гарантированно присутствует, но он настоятельно рекомендуется для реализаций Map общего назначения, и каждая такая реализация в стандартной библиотеке Java предлагает его.Создание новой пустой карты с последующим использованием putAll() для ее заполнения - еще один вариант.Для безопасного использования clone() необходимо, чтобы вы знали, что используете реализацию Map, которая его поддерживает, поэтому редко вы можете безопасно clone(), но не можете нормально создать подходящую карту.

...