Какой тип списка генерируется 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/