Разница между методами Map.put и Map.putAll? - PullRequest
12 голосов
/ 28 апреля 2011

Map.putAll эквивалентно вызову Map.put(k, v) на карте один раз для каждого сопоставления от ключа k до значения v в указанной карте.Так что с функциональным аспектом оба одинаковы.

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

Ответы [ 8 ]

9 голосов
/ 28 апреля 2011

Ну, это зависит.

put и putAll являются интерфейсными методами, поэтому каждая реальная реализация этого интерфейса гарантирует, что метод put помещает одинпара ключ / значение на карте, в то время как putAll поместит все пары ключ / значение из источника.

Но разработчик должен как это сделать и что делать дополнительно(внутренне).

Конечно, тривиальная реализация будет вызывать put для каждой записи исходной карты, но, возможно, кто-то придумывает другой метод для достижения цели.Или putAll выполнит некоторые другие внутренние операции с картой до / после / при вводе пар.

Мое правило: если вам нужно поместить все пары ключ / значение с одной карты на другую, тоположитесь на разумность разработчика и используйте метод putAll.Всегда есть хороший шанс, что он даст лучшую производительность, чем вызов put для всех пар вручную.

5 голосов
/ 28 апреля 2011

Как указано в документах:

Map.put

Связывает указанное значение с указанный ключ на этой карте (необязательная операция). Если карта ранее содержал отображение для ключ, старое значение заменяется указанное значение. (Карта м называется содержат отображение для ключа к, если и только если m.containsKey (k) вернется верно.)

Позволяет поместить одну пару ключ-значение в карту.

Map.putAll

Копирует все сопоставления из указанная карта к этой карте (необязательно операция). Эффект этого вызова эквивалентно вызову пут (к, v) на этой карте один раз для каждого отображения от ключа k до значения v в указанном карта. Поведение этой операции не определено, если указанная карта изменено во время операции прогресс.

поместить все данные с одной карты на другую карту.


когда использовать какой?

Если вы хотите скопировать полные данные с одной карты на другую, вы можете использовать map.putAll, иначе вы можете просто добавить одну пару ключ-значение, используя map.put.


Map.putAll эквивалентно вызывая Map.put (k, v) на карте один раз для каждого отображения от ключа к значению v в указанной карте. Так с функциональные аспекты одинаковы.

Нет, когда вы реализуете карту в hasmap, тогда копирование одной карты в другую с помощью put (k, v) потребует больше усилий, и вы можете сказать больше кодирования, используя putAll (m), мы можем скопировать карту с помощью однострочного кода.

5 голосов
/ 28 апреля 2011

Используйте putAll(Map), когда у вас есть Карта нескольких значений, которые вы хотите добавить на свою Карту, и используйте put(K,V), когда у вас есть одно или несколько значений, которые вы хотите добавить на свою Карту.

putAll(Map) в большинстве реализаций просто вызывает put(K,V) в цикле, прочитайте source .

4 голосов
/ 28 апреля 2011

Поскольку Map - это просто интерфейс, без какой-либо реализации, между putAll и повторным путем не может быть никакой разницы, кроме функциональной разницы, то есть ни одной. Если вы посмотрите на отдельные реализации Map (например, HashMap), может возникнуть проблема с производительностью. Один метод putAll должен быть по меньшей мере таким же эффективным, как и повторный метод put для любой разумной реализации, но он может быть точно таким же.

2 голосов
/ 28 апреля 2011

Наиболее очевидным отличием являются синхронизированные коллекции.

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

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


Я видел / реализовал транзакционные операции для put () и putAll ().Когда putAll является транзакционным, все или никакие ключи / значения будут добавлены.например, если ключ или значение не могут быть добавлены по какой-либо причине.Если вы используете put (), будет остановлен только индивидуальный ключ / значение (и, возможно, любой не добавленный), что может привести к неполному обновлению.

1 голос
/ 17 марта 2017

Я вижу огромное преимущество в производительности при использовании putAll вместо put.Смотрите пример программы ниже:

открытый класс SampleTest {

public static void main(final String[] args) {

    final Map<String, String> testMap = new HashMap<>();
    final Map<String, String> testMap2 = new HashMap<>();

    final LocalDateTime startTestTime = LocalDateTime.now();
    for(int i=0; i < 1000000; i++) {
        testMap.put(i+"", i+"");
    }
    final LocalDateTime endTestTime = LocalDateTime.now();
    System.out.println("<<<<<<<<<Time for put>>>>>>>>>>>");
    System.out.println(ChronoUnit.MILLIS.between(startTestTime, endTestTime));

    final LocalDateTime startTestTime1 = LocalDateTime.now();
    testMap2.putAll(testMap);
    final LocalDateTime endTestTime1 = LocalDateTime.now();
    System.out.println("<<<<<<<<<Time for put all>>>>>>>>>>>");
    System.out.println(ChronoUnit.MILLIS.between(startTestTime1, endTestTime1));
}

}

Возвращает (в миллисекундах):

<<<<<<<<<Time for put>>>>>>>>>>>
1934
<<<<<<<<<Time for put all>>>>>>>>>>>
116

Вывод:putAll () определенно более производительный, чем put () с приведенными ниже оговорками.1. Этот результат находится на моей машине (т.е. зависит от конфигурации машины).Но вы все еще видите большую разницу.2. Как упоминалось выше, Map является интерфейсом, поэтому производительность будет зависеть от реализации, я рассмотрел HashMap, поскольку он широко используется.Поэтому, если производительность является ограничением, вы можете предпочесть putAll () для HashMap по крайней мере.

1 голос
/ 28 апреля 2011

метод putAll ()

Copies all the elements from a specified map to the current Map object.    

метод put ()

Adds an element at a specific key entry to a Map object.
0 голосов
/ 28 апреля 2011

Map.put(Object key, Object value) позволяет вам добавить одну запись в то время как Map.putAll(Map t) добавляет все записи, содержащиеся в карте t, к указанной карте.Метод putAll () полезен при объединении двух карт.

...