gpt4 book ai didi

java - addAll 方法的问题

转载 作者:行者123 更新时间:2023-12-01 09:38:13 29 4
gpt4 key购买 nike

每当调用 Collection#addAll 时,它都会创建参数列表的副本,然后将其附加到调用 addAll 的集合。

下面是案例一的代码:

        if (parentData != 0) {
if (nodeParentMap.get(parentData) != null) {
nodeParentMap.put(newNodeData, parentData);
//Creates new Nodes' parent and assigns its next to its parent, in that way I get the parents' linked list
Node parent = Node.build(parentData);
parent.next = parentListMap.get(parentData);

parentListMap.put(newNodeData, parent);
}
} else {
//Code for root
nodeParentMap.put(newNodeData, parentData);
parentListMap.put(newNodeData, null);
}

这里需要 N 次迭代才能找到第 N 个父级

下面是案例二的代码:

       if (parentData != 0) {
if (nodeParentMap.get(parentData) != null) {
nodeParentMap.put(newNodeData, parentData);

//Here all the parents of a node are present in arrayList #parents,
//so that I can fetch parent in O(1) as I know the index
ArrayList<Integer> parents = new ArrayList<>();
parents.add(parentData);
parents.addAll(parentListMap.get(parentData));

parentListMap.put(newNodeData, parents);
}
} else {
//Code for root
nodeParentMap.put(newNodeData, parentData);
parentListMap.put(newNodeData, new ArrayList<>());
}

但是在情况 II 中,当调用 ArrayList#addAll 时,它会创建传递的列表的副本,然后附加它。那么,有没有办法通过调用System#arrayCopy来执行ArrayList#addAll

谢谢。

最佳答案

一般来说,你不应该关心。除非您运行此代码数百万次,否则差异将不会明显。如果可能的话,您应该尽可能干净地编写代码,并使其显示您的意图。您有性能问题吗?您是否分析过您的代码并且分析器显示您花费了大量时间来复制数组元素?

测量,不要猜测。您需要一种方法来判断存在问题。并且您需要一种方法来判断代码更改后它是否消失。

如果有如此多的重复数据和如此多的元素复制,您也许可以使用更有效的结构或算法,您是否可以更改您的算法?例如,您可以使用 Iterables.concat() 谷歌 Guava 。生成的代码会更短,非常清楚地说明您的意图并且不会复制任何内容 - 底层 List将包含对原始数据结构的引用,并且只会延迟获取它。请注意,如果这是大规模链式的,那么您实际上并没有帮助自己......

如果毕竟你仍然认为你需要避免双数组复制,那么是什么阻止你这样做呢?

List<Integer> tempParents = parentListMap.get(parentData);
List<Integer> parents = new ArrayList<>(tempParents.size() + 1);
parents.add(parentData);
for (Integer i : tempParents) {
parents.add(i);
}

请注意,从性能角度来看,此代码通常与仅调用 addAll() 相当。 因为在 ArrayList 的重写实现 addAll() 中没有迭代,只有硬数组复制,它是 JVM 中固有的并且高度优化的。因此,上述版本仅适用于短列表(可能)或解决内存问题,而不是性能问题,因为迭代版本不需要任何额外的临时内存,而从 addAll() 复制版本则不需要任何额外的临时内存。确实如此。

关于java - addAll 方法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38671645/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com