【问题标题】:What type of list is generated by List.of() in JavaJava中的List.of()生成什么类型​​的列表
【发布时间】:2018-10-29 18:25:35
【问题描述】:
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

【问题讨论】:

  • 两者都不是。查看该方法的实现是个好主意。
  • 它类似于ArrayList,因为它是一个由数组支持的列表。但是,它没有与 java.util.ArrayList 相同的运行时属性,例如它是不可变的。
  • 为什么这很重要?无论实现如何,您都会将返回的对象视为 List 实例。
  • @VGR 出于性能原因。
  • 好吧,既然 grepcode 已经不存在了,我到底在哪里可以找到 java src。

标签: java list collections


【解决方案1】:

两者都没有。根据List.of() 的文档,它返回:

返回一个包含任意数量元素的不可变列表。

注意,ListArrayListLinkedList 实现的接口

如果我们运行这段代码:

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

我们得到:

class java.util.ImmutableCollections$ListN

【讨论】:

  • List 类型的变量只是一个指向实际对象的指针,我认为它应该是某个类的实例,对吧?那么底层的类类型是什么?
  • @mettleap 类类型为class java.util.ImmutableCollections$ListN
  • class java.util.ImmutableCollections$ListN - 具有可变数量元素的 List 的不可变实现
【解决方案2】:

你可以看看不同的List#of methods in the OpenJDK source code

(该模式显然受到了相应的 Guava 类的启发。见Why does Guava's ImmutableList have so many overloaded of() methods?

专用于特定数量参数的方法会创建 ImmutableCollections.ListN 的实例,该实例在内部仅存储 varargs-array 的副本 (!) 并提供List 访问数组的方法。

但正如其他人指出的那样:确切的类型并不重要!

唯一重要的一点是返回的列表也实现了RandomAccess。虽然这似乎没有在documentation for unmodifiable lists 中明确指定,但这是我个人所依赖的。他们永远不会将其更改为某种链表……

【讨论】:

    【解决方案3】:
    List<Employee> employeeList = List.of(john, camila, pat);
    

    或多或少等于

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

    如果您对List 的具体实现感到担忧,请自己动手,这样会好很多。

    【讨论】:

      【解决方案4】:

      List.of() 作为静态工厂方法返回 List 的基本不可变实现。

      访问https://4comprehension.com/the-curious-case-of-jdk9-immutable-collections/

      【讨论】:

        猜你喜欢
        • 2020-01-15
        • 2015-07-05
        • 1970-01-01
        • 2015-09-20
        • 2011-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多