Java 集合/列表之间的循环和操作

Java 集合/列表之间的循环和操作,java,set,iteration,Java,Set,Iteration,我很难给这篇文章起个名字。 基本上,我有两套:我们称之为A和B 我想执行以下操作(\代表除外): 我的第一次成功尝试是: // B and A are lists List<T> C = new LinkedList<>(A); C.removeAll(B); for (T other : C) operationX(other); List<T> D = new LinkedList<>(B); D.removeAll(A); for

我很难给这篇文章起个名字。 基本上,我有两套:我们称之为
A
B

我想执行以下操作(
\
代表除外):

我的第一次成功尝试是:

// B and A are lists

List<T> C = new LinkedList<>(A);
C.removeAll(B);
for (T other : C)
    operationX(other);

List<T> D = new LinkedList<>(B);
D.removeAll(A);
for (T other : D)
    operationY(other);

for (T other : B)
    operationZ(other);
//B和A是列表
列表C=新链接列表(A);
C.removeAll(B);
对于(T其他:C)
操作X(其他);
列表D=新的链接列表(B);
D.removeAll(A);
对于(T其他:D)
操作(其他);
对于(T其他:B)
操作Z(其他);
但这似乎太慢了。这个函数应该每秒调用数百次,这些集合可以包含数百个对象


实现这一点的有效方法是什么?

如果您只是计划迭代它,那么根本不需要创建
C
。您只需过滤掉
A
中包含在
B
中的每个元素,然后对每个过滤后的元素调用
operationX

Set<T> bSet = new HashSet<>(B);

A.stream()
 .filter(a -> !bSet.contains(a))
 .forEach(this::operationX);
如果
operationY
只需要为
B
中的每个元素调用一次,即使存在重复项,我建议使用以下代码:

bSet.removeAll(A);
bSet.forEach(this::operationY);
B.forEach(this::operationZ);

要计算C=A\B,您可以首先从B构建一个哈希集,然后迭代A,并将所有元素添加到最初为空的集C中,这些元素不在哈希集中


此外,如果您经常在大型列表上进行迭代,则应尽可能使用ArrayList而不是LinkedList,因为在大型链表上进行迭代非常慢,因为会发生许多缓存未命中。

您是否确实尝试使用集合?LinkedList是最慢的集合。这里也不需要复制。我还将使用在第一个集合上迭代的流进行测试,并过滤掉属于第二个集合的元素。我会将其与您的方法进行比较,但是使用HashSet或ArrayList。当然,如果集合从未更改,您应该存储这两个差异并重新使用它们。@JBNizet它们当然会不断更改。
Set<T> aSet = new HashSet<>(A);

B.stream()
 .filter(b -> !aSet.contains(b))
 .forEach(this::operationY);

B.forEach(this::operationZ);
bSet.removeAll(A);
bSet.forEach(this::operationY);
B.forEach(this::operationZ);