提问者:小点点

如何将List<String>转换为ArrayList<String>


此API调用返回一个可能较大的列表

排序、搜索和访问一个潜在的大型LinkedList将非常缓慢,对我的程序来说是不可接受的。因此,我需要将列表转换为ArrayList,以确保程序的实际效率。但是,由于列表很可能已经是ArrayList,因此不必要地创建列表的新ArrayList副本将效率低下。

考虑到这些约束,我提出了以下方法将列表转换为ArrayList:

private static <T> ArrayList<T> asArrayList(List<T> list) {
  if (list instanceof ArrayList) {
    return (ArrayList<T>) (list);
  } else {
    return new ArrayList<T>(list);
  }
}

我的问题是:这是处理具有未知实现的列表的最有效方法吗?有没有更好的方法将列表转换为ArrayList?有没有比将列表转换为ArrayList更好的选择?


共3个答案

匿名用户

你真的没有比你所拥有的更简单的了——在我看来,这是最有效的。

这就是说,这听起来很像是过早的优化——如果您使用的API的作者更改了链接列表,那么您只需要担心这一点。如果您现在对此感到担忧,那么您可能会花费大量的时间和精力来规划未来的场景,而这些场景甚至可能不会成为现实——这可能是最好花在寻找其他问题来解决的时间。想必,您更改API版本的唯一时间是在您自己的应用程序版本之间-如果有的话,请在此时处理问题。

匿名用户

正如您自己所见,代码很简单,而且非常有效,因为它只在必要时创建一个副本。

因此,答案是,除了一种完全不同类型的解决方案之外,没有比这更好的选择了,例如,可以对列表进行排序的解决方案。

(请记住,很少需要这种程度的优化,因此这不是一个非常常见的问题。)

更新:只是事后思考L作为一般规则,编写良好的API不会返回与其可能包含的数据量不合适的数据类型。这并不是说您应该盲目信任它们,但这不是一个完全不合理的假设。

匿名用户

排序、搜索和访问一个潜在的大型LinkedList将非常缓慢,对我的程序来说是不可接受的。

事实上,情况并没有那么糟。IIRC,集合。排序方法将列表复制到临时数组,对数组进行排序,清除()原始列表,然后将数组复制回它。对于足够大的列表,排序阶段将主导复制阶段。