【问题标题】:Array to List or List to Array, which conversion is faster?Array to List 或 List to Array,哪个转换更快?
【发布时间】:2018-08-15 08:31:51
【问题描述】:

在java中,基本上这两种转换是很常见很流行的……

  • 数组到列表

    List<String> list = Arrays.asList(array);

  • 列表到数组

    String[] array = list.toArray(new String[list.size()]);

那么问题来了,Array to List 哪个更快呢?

现在,我为什么要问这个问题?因为我必须实现一个数组或列表的方法,两者都可以传入参数。我只需要迭代这个列表就可以了。所以在这里我必须决定我应该转换什么?要列出的数组或列出到数组的数组!

【问题讨论】:

  • 这不是类型转换。
  • 你为什么不自己运行一个基准测试?
  • 是转换,快一点没关系。您应该使用更适合设计的那个。你甚至可以同时实现。
  • 谨防过早的优化 永远不要出于性能考虑选择特定的语法或样式,除非您已经过验证通过测量你实际上一个性能问题有问题的代码确实是瓶颈替代真的解决问题。
  • 你选择哪一个并不重要。浪费时间当然没关系。

标签: java arrays list casting type-conversion


【解决方案1】:

Arrays.asList 更快,因为它不复制数据 - 它返回一个包装传递给它的数组的对象,并实现List 接口。 Collection.toArray() 将数据复制到数组中,因此它在 O(N) 而不是 O(1) 中运行。

【讨论】:

  • 补充说明:这并不一定意味着 OP 的代码会更快。 OP 提到他们已经接受了两个重载,一个数组和一个列表。 OP 需要收集有关每个重载调用频率的数据,以确定转换为 List 是否会更快。如果 %99.99 使用 Array 重载,您可能希望坚持使用数组实现
  • 您确定对 LinkedList 进行密集随机访问会比先将其转换为数组更好吗?
  • yole 准确地回答了这个问题。 Arrays.asList 是(理论上)更快的方法。对于特殊用例是否是正确的方法是完全不同的问题。
  • ArrayList 使用System.arraycopy 复制数据。我不认为它会明显变慢。
  • 对于关于 SO 的大多数关于性能的问题,OP 考虑的选项之间不会有任何可观察的差异。但是,当行为中存在对性能有影响的本质差异时,强调和理解它仍然很有用。
【解决方案2】:

Arrays.asList 会更快,因为它不必复制任何数据,而只需打包它。

【讨论】:

  • 打包?这里没有“包装”。也许你的意思是“包装”?
  • 是的,没错!
【解决方案3】:

恕我直言,您正在处理错误的一侧。要问的好问题是您的方法中是否需要数组或列表。顺便说一句,List 它只是一个接口,并且可能存在许多实现。例如,JDK 直接提供了由数组支持的ArrayList,因此转换为数组应该很快,LinkedList 是一个双链接实现,以及许多其他包括旨在帮助自定义实现的抽象类。

简而言之,知道要如何使用方法中的元素,因此只需使用更合适的容器

在我看来,如果您打算迭代元素,请使用List,如果您需要密集的随机访问并且可以接收链表实现,则使用数组。

【讨论】:

  • ArrayList.toArray() 仍然执行复制,因此它仍然在 O(N) 中运行,即使 ArrayList 确实由数组支持。
  • @yole 你是对的。我只是说转换时间不一定更重要。也许我试图回答 OP 应该问的问题,而不是他实际问的问题 ;-)
猜你喜欢
  • 1970-01-01
  • 2021-03-09
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多