Ответ 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. Потому что вы абсолютно хотите избежать того, что "этот код является уродливым, но может дать лучшую производительность" мысли проникнут в ваш дизайн. Сосредоточьтесь на написании чистого кода, который выполняет работу прямолинейно. никогда пишите менее выразительный код, потому что считаете, что он быстрее. Когда у вас возникла проблема с производительностью - профилируйте свой код, определите причину и устраните ее.
Но не допускайте, чтобы преждевременные мысли оптимизации влияли на качество вашего кода.