Squeak.ru - шаблоны программирования

Список против карты/словаря

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

Зачем вам когда-либо использовать список, когда карта предоставляет точно такую ​​​​же функциональность, что и доступ по индексу (в данном случае целое число...).

Разве Карта не всегда должна быть предпочтительнее списка? Что мне здесь не хватает?

15.03.2011


Ответы:


1

Дубликат этого вопроса.

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

Рассмотрим этот код:

public void add(Map map, Object o) {
    int index = map.size();
    map.put(index, o);
}

public static void add(List list, Object o) {
    list.add(o);
}

Теперь посмотрим, во что компилятор превращает это (используя javap или откройте файл класса в среде IDE, такой как Eclipse):

public void add(java.util.Map map, java.lang.Object o);
     0  aload_1 [map]
     1  invokeinterface java.util.Map.size() : int [16] [nargs: 1]
     6  istore_3 [index]
     7  aload_1 [map]
     8  iload_3 [index]
     9  invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [22]
    12  aload_2 [o]
    13  invokeinterface java.util.Map.put(java.lang.Object, java.lang.Object) : java.lang.Object [28] [nargs: 3]
    18  pop
    19  return
      Line numbers:
        [pc: 0, line: 8]
        [pc: 7, line: 9]
        [pc: 19, line: 10]
      Local variable table:
        [pc: 0, pc: 20] local: this index: 0 type: MapListTest
        [pc: 0, pc: 20] local: map index: 1 type: java.util.Map
        [pc: 0, pc: 20] local: o index: 2 type: java.lang.Object
        [pc: 7, pc: 20] local: index index: 3 type: int

  // Method descriptor #38 (Ljava/util/List;Ljava/lang/Object;)V
  // Stack: 2, Locals: 2
  public static void add(java.util.List list, java.lang.Object o);
    0  aload_0 [list]
    1  aload_1 [o]
    2  invokeinterface java.util.List.add(java.lang.Object) : boolean [39] [nargs: 2]
    7  pop
    8  return
      Line numbers:
        [pc: 0, line: 13]
        [pc: 8, line: 14]
      Local variable table:
        [pc: 0, pc: 9] local: list index: 0 type: java.util.List
        [pc: 0, pc: 9] local: o index: 1 type: java.lang.Object

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

15.03.2011

2

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

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

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

15.03.2011

3

Различия между Map<Integer, E> и List<E> с семантической точки зрения таковы:

  • Список содержит все индексы от 0 до list.size(), а карта может содержать любые индексы (даже отрицательные), с большими дырами.
  • При добавлении элементов в список без индекса вы автоматически получаете новый индекс. Для карт такой операции нет. (Однако вы можете легко реализовать это на SortedMaps.)
  • При добавлении элементов с индексом или их удалении в списке последующие индексы сдвигаются на единицу. В карте такого смещения нет (и добавленные элементы могут заменять существующие).

Тем не менее, однажды я создал разреженный список (в основном содержащий null), поддерживаемый HashMap<Integer, E>, но там я отключил структурные модификации (аналогично Arrays.asList).

15.03.2011
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...