当前位置: 首页 > 知识库问答 >
问题:

从Iterable创建列表时使用哪个实现

翟棋
2023-03-14
Iterator<A> itr = iterableOfA.getIterator();
List<B> list = new ArrayList<>(); // how about LinkedList?
while (itr.hasNext()) {
    B obj = iter.next().getB();
    list.add(obj);
}
someMethod(list); // this method takes an Iterable
Iterator<A> itr = iterableOfA.getIterator();
int size = Iterables.size(iterableOfA); // from Guava
List<B> list = new ArrayList<>(size);
// and the rest...

这意味着对iterableofa进行双重迭代。当可迭代的大小是未知的并且可能变化很大时,哪个选项是最好的:

  1. 只需使用ArrayList.
  2. 只需使用LinkedList.
  3. 计算iterableofa中的元素并分配ArrayList.

澄清一些细节:

    null

共有1个答案

赵炯
2023-03-14

当可迭代的大小是未知的并且可能变化很大时,哪种选择是最好的

这取决于你在优化什么。

>

  • 如果要优化性能,那么使用ArrayList可能更快。尽管ArrayList需要调整支持数组的大小,但它使用指数增长模式进行调整。然而,这取决于迭代的开销。

    >

  • 在此问题上花费更多时间之前,先对应用程序进行概要分析。在很多情况下,您会发现这根本不值得您努力优化。

    使用应用程序中的类和典型数据结构,对您正在考虑的两个备选方案进行基准测试。

    目前,如果iterableofa有5000个元素,这将导致列表支持数组的许多大小调整。

  •  类似资料:
    • 我有一个学生名单a和学生名单B。 学生对象包含如下字段:否、年龄、城市、出生日期、工资 我的列表A包含这些对象 我的列表B包含这些对象 我想做的是提取ListA有但listB没有的学生对象,以及ListA和listB有但薪水不同的学生对象(如否、年龄、城市)。我还想写工资差异。 我想在java 8中使用流api。首先,我想将students对象提取到列表中,但我现在可以提取常见的student对象

    • 问题内容: 我有以下Java6和Java8代码: Java8中有什么方法可以使用Lambda以更简洁的方式处理前一个问题? 问题答案: 流绑定到给定的可迭代/集合,因此您不能真正地“并行”迭代两个集合。 一种解决方法是创建索引流,但不一定比for循环有所改进。流版本可能如下所示:

    • 问题内容: 有一个对象列表。 使用它创建一个unmodifiableList。 我了解不支持添加/删除/设置操作。同时,它不是不变的,因为它引用了现有的可修改列表,并且每当对该列表进行更改时,这些更改也会反映出来。 这样就创建了一个不可变的列表。 由于使用了转换构造函数,因此创建了一个不可变的列表。无法执行添加/删除/设置操作,原始列表中的任何更改都不会反映在中。让我们假设对象也是不可变的。 现在

    • 在这个例子中,我们将引入from()函数。使用这个特殊的“创建”函数,我们可以从一个列表中创建一个Observable。Observable将发射出列表中的每一个元素,我们可以通过订阅它们来对这些发出的元素做出响应。 为了实现和第一个例子同样的结果,我们在每一个onNext()函数更新我们的适配器,添加元素并通知插入。 我们将复用和第一个例子同样的结构。主要的不同的是我们不再检索已安装的应用列表。

    • 问题内容: 我需要将列表转换成字典,如下所示。奇数元素具有键,偶数元素具有值。 -> 获得相同结果的更好方法? 添加 似乎在工作 问题答案: dict(x[i:i+2] for i in range(0, len(x), 2))

    • 问题内容: 我有一张地图,其中“值”是项目列表: 我想从地图中提取项目,但仅提取1个项目列表: 我已经看到了答案,但它们不适用于我的情况。我不想要这个结果: 我想要的结果是: 如何使用JAVA 8 Streams实现此目的?谢谢。莱昂纳多。 问题答案: 感谢@Holger的回答。 在值映射中的Collection为Null的情况下避免NullPointerException的代码: