当我在以下位置查看Java文档时
List of
method
它非常重载,所有元素的数量从1到10 ...
它说:
返回一个包含五个元素的不可修改列表。
有关详细信息,请参见不可修改列表。
类型参数: E-列表的元素类型 参数: e1-第一个元素 e2-第二个元素 e3-第三个元素 e4-第四个元素 e5-第五元素
我根本不了解这一点,甚至可以找到一种方法来使用它?
答案 0 :(得分:6)
List.of()
方法是方便的静态助手,可以在一个调用中创建一个固定大小的列表(而不是创建一个空列表,然后多次调用add
)。碰巧,此调用返回的列表是不可修改的(不能添加或删除任何元素)。
例如,比较:
ArrayList<String> supportedLanguages = new ArrayList<>();
supportedLanguages.add("en-us");
supportedLanguages.add("en-gb");
supportedLanguages.add("de");
收件人:
List<String> supportedLanguages = List.of("en-us", "en-gb", "de");
碰巧有11种这样的重载,从零到十个元素(List.of()
变成了一个空的不可修改的列表),大的情况是使用带有签名{{1}的vararg重载来处理的}。
答案 1 :(得分:3)
自jdk-9
起,有10种重载方法和一种vararg方法List.of()
来创建不可修改的列表,这意味着您不能通过删除或添加元素来修改列表。
static <E> List<E> of() //Returns an unmodifiable list containing zero elements. See Unmodifiable Lists for details.
static <E> List<E> of(E e1) //Returns an unmodifiable list containing one element. See Unmodifiable Lists for details.
static <E> List<E> of(E e1, E e2) //Returns an unmodifiable list containing two elements. See Unmodifiable Lists for details.
static <E> List<E> of(E e1, E e2, E e3) //Returns an unmodifiable list containing three elements. See Unmodifiable Lists for details.
.
.
.
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) //Returns an unmodifiable list containing ten elements. See Unmodifiable Lists for details.
@SafeVarargs static <E> List<E> of(E... elements) //Returns an unmodifiable list containing an arbitrary number of elements. See Unmodifiable Lists for details.
E
是用于创建通用类型列表的类型参数
List<Integer> list = List.of(1,2,3); // unmodifiable list with 3 integer elements
List<String> list = List.of("hello","world"); //// unmodifiable list with 2 string elements
假设您需要一个可以在应用程序级别访问的列表,并且没有人可以修改该列表,那么您可以选择它们。
答案 2 :(得分:2)
三个接口List
,Set
和Map
都获得了新的重载.of
方法。
List< Integer > luckyNumbers = List.of( 7 , 11 , 42 ) ;
Set< DayOfWeek > weekend = Set.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY ) ;
Map< DayOfWeek , Employee > dutyRoster =
Map.of(
DayOfWeek.MONDAY , alice ,
DayOfWeek.TUESDAY , bob ,
DayOfWeek.WEDNESDAY , alice ,
DayOfWeek.THURSDAY , carol ,
DayOfWeek.FRIDAY , carol
)
;
能够在一行代码中声明并填充List
,Set
或Map
是非常方便的。简短,优雅,清楚地表达了程序员的意图。
通常,此类对象的简短集合是只读的。这意味着使用该集合的程序员无法添加,删除或替换任何收集的对象。
请注意,内部所收集对象的内容可能是mutable,也可能不是。这超出了收藏的职责范围。
Collections
实用工具类提供了使集合不可修改的方法,但是您必须竭尽所能来使用此功能。这样做意味着需要更多的代码行。新的.of
方法更简单。
请注意,您将获得 interface 的对象而不是类。因此,例如,List
而不是ArrayList
,Set
而不是HashSet
,Map
而不是HashMap
。您不知道返回的对象正在使用什么具体类。也不在乎。
这意味着Java团队可以自由地优化具体实现,将代码从一个发行版更改为另一个发行版。他们甚至可以在运行时选择使用不同的实现方式,具体取决于所收集对象的数量或类型。
例如,如果您收集的对象属于enum
类型,则可以在后台使用高度优化的EnumSet
来满足您对Set.of
的要求。同样,EnumMap
代表Map.of
。请参阅本答案顶部的Set
和Map
代码,以作为enum
对象被收集并因此有资格进行此优化的示例。
Brian Goetz和其他人已经讨论了这种优化的自由。