Какой тип списка генерируется List.of() в Java

Employee john = new Employee("John", "Brown", 32, 100);
Employee camila = new Employee("Camila", "Smith", 25, 101);
Employee pat = new Employee("Pat", "Hanson", 23, 102);

List<Employee> employeeList = List.of(john, camila, pat);

Какой тип List генерируется List.of() метод. Это ArrayList или LinkedList?

5 ответов

Ни. Согласно документам для List.of() это возвращает:

Возвращает неизменный список, содержащий произвольное количество элементов.

Обратите внимание, что это интерфейс List тот ArrayList а также LinkedList воплощать в жизнь

Если мы запустим этот код:

List<Integer> listOf = List.of(1,2,3);
System.out.println(listOf.getClass());

Мы получаем:

class java.util.ImmutableCollections$ListN
List<Employee> employeeList = List.of(john, camila, pat);

более или менее равен

List<Employee> employeeList = Collections.unmodifiableList(Arrays.asList(john, camila, pat));

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

Вы можете взглянуть на разные List#of методы в исходном коде OpenJDK.

(Очевидно, что шаблон был вдохновлен соответствующими классами Guava. См. Почему в ImmutableList Guava так много перегруженных методов ()?)

Метод, который не специализирован для определенного числа аргументов, создает экземпляр ImmutableCollections.ListN, который внутри просто хранит копию (!) массива varargs и обеспечивает прямую реализацию List методы доступа к массиву.

Но, как уже отмечали другие: точный тип не должен иметь значения!

Единственное, что может иметь значение, это то, что возвращаемый список также реализует RandomAccess, Хотя в документации по немодифицируемым спискам это явно не указано явно, на это я бы лично положился. Они никогда не изменят это, чтобы стать чем-то вроде связанного списка или около того...

Я не совсем уверен, поскольку я все еще учусь, но просто полагаюсь на основы.

например, аналогично статическим методам в классе Math

значение int = Math.sqrt(9) ; //это статическая функция, которая просто возвращает значение

  • в этом случаеList.of(john, camila, pat);также является статической функцией и просто возвращает список и не имеет никакого состояния или поведения.

Я понял, что оба приведенных ниже примера не одинаковы: один назначает объект типа списка массивов, а другой просто вызывает статическую функцию и создает список.

      List<Employee> employeeList = new ArrayList<>();

List<Employee> employeeList = List.of(john, camila, pat);

List.of() как статический фабричный метод возвращает базовую неизменяемую реализацию List.

Посетите https://4comprehension.com/the-curious-case-of-jdk9-immutable-collections/

Другие вопросы по тегам