Подтвердить что ты не робот

Список <Карта <String, String >> vs List <Object>

В чем разница между использованием List<Map<String, String>> vs List<Object> с точки зрения использования и производительности. Предположим, что мне нужно создать список карт, имеющих только 3 типа пары значений ключа, вместо этого я могу создать объект, имеющий только 3 свойства и составляющий список объектов.

Вопрос здесь не в двух подходах, которые следует использовать в сценарии?

4b9b3361

Ответ 1

Давайте сначала разъясним, о чем идет речь: это

List<Map<String, String>> 

против

List<Foo>

где объекты Foo имеют ряд "свойств", которые будут храниться на карте (в виде пар ключей) с опцией 1.

В этом случае вы абсолютно выбираете вариант два. Просто потому, что хороший ООП - это создание полезных абстракций, а также моделей. Значение: когда у вас есть атрибуты, которые принадлежат друг другу, то использование класса для обертывания вокруг них является естественным путем.

Это дает вам небольшие преимущества по производительности (потому что вы избегаете доступа к карте), но главное - это: вы можете написать код время компиляции. Вы видите:

int foo = list.get(0).map.get("key");

может завершиться с ошибкой время выполнения - вы не знаете, содержит ли карта этот ключ, и если это целое число.

Но

int foo = list.get(0).getFoo(); // resp. ...get(0).fieldName 

может быть проверен компилятором! (да, те вызовы get() все равно могут не работать во время выполнения, но это то, чего вы не можете обойти)

Кроме того: не беспокойтесь о производительности на этом уровне: во-первых, вы должны понять, что действительно влияет на вашу производительность при написании кода Java. Потому что вы абсолютно хотите избежать того, что "этот код является уродливым, но может дать лучшую производительность" мысли проникнут в ваш дизайн. Сосредоточьтесь на написании чистого кода, который выполняет работу прямолинейно. никогда пишите менее выразительный код, потому что считаете, что он быстрее. Когда у вас возникла проблема с производительностью - профилируйте свой код, определите причину и устраните ее.

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

Ответ 2

Если ваш класс выглядит примерно так:

class Foo
{
    private final String a;
    private final String b;
    private final String c;

    // constructor and getters
}

Использование List<Foo> приведет к:

Производительность

Производительность использования класса, скорее всего, очень похожа на карту. Большинство реализаций карты, HashMap, например, обеспечивают операции O (1) get и put. Это не будет значительно медленнее, чем вызов метода getter для вашего объекта.

Использование, если 3 "клавиши" всегда одинаковы:

Класс, вероятно, намного проще в использовании. Если у вас есть Map<String, String>, нет простого способа обеспечить, чтобы каждая карта содержала ровно 3 ключа "A", "B" и "C". Что, если кто-то добавит ключ "D"? Что делать, если кто-то удаляет ключ A?

С помощью пользовательского класса это легко обеспечить с помощью конструктора - проверку времени компиляции.

Использование, если 3 "клавиши" не совпадают:

Без наличия нескольких классов и, возможно, какой-то иерархии классов вы не можете легко выполнить это. Возможно, карта лучше.