Java List`of`方法非常令人困惑

时间:2019-03-09 03:28:40

标签: java list

当我在以下位置查看Java文档时 List of method

它非常重载,所有元素的数量从1到10 ...

它说:

  

返回一个包含五个元素的不可修改列表。

     

有关详细信息,请参见不可修改列表。

     

类型参数:   E-列表的元素类型   参数:   e1-第一个元素   e2-第二个元素   e3-第三个元素   e4-第四个元素   e5-第五元素

我根本不了解这一点,甚至可以找到一种方法来使用它?

3 个答案:

答案 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)

三个接口ListSetMap都获得了新的重载.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
    )
;

方便

能够在一行代码中声明并填充ListSetMap是非常方便的。简短,优雅,清楚地表达了程序员的意图。

不可修改

通常,此类对象的简短集合是只读的。这意味着使用该集合的程序员无法添加,删除或替换任何收集的对象。

请注意,内部所收集对象的内容可能是mutable,也可能不是。这超出了收藏的职责范围。

Collections实用工具类提供了使集合不可修改的方法,但是您必须竭尽所能来使用此功能。这样做意味着需要更多的代码行。新的.of方法更简单。

优化

请注意,您将获得 interface 的对象而不是类。因此,例如,List而不是ArrayListSet而不是HashSetMap而不是HashMap。您不知道返回的对象正在使用什么具体类。也不在乎。

这意味着Java团队可以自由地优化具体实现,将代码从一个发行版更改为另一个发行版。他们甚至可以在运行时选择使用不同的实现方式,具体取决于所收集对象的数量或类型。

例如,如果您收集的对象属于enum类型,则可以在后台使用高度优化的EnumSet来满足您对Set.of的要求。同样,EnumMap代表Map.of。请参阅本答案顶部的SetMap代码,以作为enum对象被收集并因此有资格进行此优化的示例。

Brian Goetz和其他人已经讨论了这种优化的自由。