代码之家  ›  专栏  ›  技术社区  ›  jxie0755

Java列表的方法非常混乱。

  •  3
  • jxie0755  · 技术社区  · 6 年前

    当我查看Java文档时 List of method

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

    它说:

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

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

    类型参数: e-列表的元素类型 参数: e1-第一个元素 e2-第二个元素 E3-第三个元素 E4-第四个元素 E5-第五元素

    我就是完全不明白,我能找到一种方法来使用它吗?

    3 回复  |  直到 6 年前
        1
  •  6
  •   nanofarad    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个这样的重载,从0到10个元素( () 变成一个空的不可修改的列表),并使用 vararg 带签名的重载 @SafeVarargs static <E> List<E> of​(E... elements) .

        2
  •  3
  •   Ryuzaki L    6 年前

    自从 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
    

    假设您需要一个可以在应用程序级别访问的列表,并且没有人可以修改该列表,那么您可以选择它们。

        3
  •  1
  •   Basil Bourque    6 年前

    三个接口 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
        )
    ;
    

    便利性

    能够声明和填充 , 集合 地图 在一行代码中是相当方便的。简洁、优雅,清晰地表达了程序员的意图。

    不可修改的

    通常,这样短的对象集合是只读的。也就是说,使用集合的程序员不能添加、删除或替换任何已收集的对象。

    注意内容 里面 收集到的对象可能 mutable . 这超出了征收税的范围。

    这个 Collections 实用程序类提供了使集合不可修改的方法,但您必须竭尽全力使用此功能。这样做意味着更多的代码行。新的 方法更简单。

    优化

    请注意,您返回的对象 界面 而不是一个班级。例如, 而不是 ArrayList , 集合 而不是 HashSet , 地图 而不是 HashMap . 您不知道返回的对象正在使用什么具体类。你也不在乎。

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

    例如,如果收集的对象属于 enum 类型,然后高度优化 EnumSet 可以在幕后完成你的请求 Set.of . 同样地, EnumMap 对于 Map.of . 见 集合 地图 此答案顶部的代码是 枚举 正在收集的对象,因此符合此优化的条件。

    Brian Goetz和其他人讨论过这种优化自由。