繁体   English   中英

转换由 List.of 或 ArrayList 设置?

[英]convert Set by List.of or ArrayList?

我想将一组转换为列表。 我应该更喜欢哪种方法(我不在乎它是否不可变):

版本 1:

return List.of(myHashSet().toArray());

或版本 2:

return new ArrayList<Strategy>(myHashSet());

除了版本 1 是不可变的之外,还有其他区别吗? 例如,与List.of相比,List.of 的空间效率更高。

我在您的 1 和 2 之间看到的唯一区别是:

  • List.of产生一个浅不可变的列表。 您不能在列表中添加或删除项目。 当然,如果列表中包含的每个 object 中的 state 已经是可变的,那么它仍然是可变的。 你的#1 导致一个不可变的列表,而#2 的ArrayList是可变的。
  • 使用#2,您知道并控制生成的List的具体 class 。 使用#1,您既不知道也不控制调用List.of List.of功能可免费使用任何实现List接口的 class,甚至可能是 class 未随 Java class 公开可用的 class List.of功能甚至可以聪明地选择适合您特定收集对象的优化 class。

你说:

与 ArrayList 相比,List.of 的空间效率更高。

如果您的意思是使用 memory (RAM),您不能提出该声明。 如上所述,在调用List.of时,您既不知道也不控制用于实现List接口的 class 的选择。 使用的 class 可能因您的数据而异,并且可能因运行时使用的 Java 版本而异。

至于toArray调用使用的 memory ,对象数组实际上只是引用(指针)数组。 创建该数组需要很少的 memory 并且速度很快。 Object 引用可能是四个或八个八位字节的值(取决于您的JVM是 32 位还是 64 位),尽管 ZD52387880E1EA22817A72D7.1 没有指定。 在创建数组时,元素对象的内容并没有被复制。 因此,对于大多数常见应用程序而言,该数组的简短创建和处置将是微不足道的。

而且,正如Kuhn 所评论的,Java 10 看到了一个新的工厂方法List.copyOf的到来,它需要一个Collection 所以不需要调用toArray

List<Strategy> myStrategyList = List.copyOf( myStrategySet ) ;

结论:

  • 如果您需要不可变列表,请使用List.copyOf
  • 如果您需要可变性或特定于List特定实现的任何其他功能,请使用该特定 class。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM