gpt4 book ai didi

java - 在迭代期间从集合中删除

转载 作者:行者123 更新时间:2023-12-01 08:11:45 24 4
gpt4 key购买 nike

我有一组具有 send 方法的 connection 对象(我无法更改的库代码)。如果发送失败,它们会回调我实现的通用 onClosed 监听器,该监听器在我的代码中调用 removeConnection(),这将从集合中删除连接。

onClosed 回调是通用的,可以随时调用。例如,当对等方关闭连接时调用它,而不仅仅是在写入失败时调用。

但是,如果我有一些代码在我的连接上循环并发送,那么 onClosed 回调将尝试在迭代。

我当前的代码在每次迭代之前创建连接列表的副本;然而,在分析中,这已经证明是非常昂贵的。

Set<Connection> connections = new ....;

public void addConnection(Connection conn) {
connections.add(conn);
conn.addClosedListener(this);
}

@Override void onClosed(Connection conn) {
connections.remove(conn);
}

void send(Message msg) {
// how to make this so that the onClosed callback can be safely invoked, and efficient?
for(Connection conn: connections)
conn.send(msg);
}

如何在迭代过程中有效地处理集合的修改?

最佳答案

要通过并发修改来迭代集合而不出现任何异常,请使用List Iterator

http://www.mkyong.com/java/how-do-loop-iterate-a-list-in-java/ - 示例

如果您使用简单的 forforeach 循环,您将在删除元素期间收到 ConcurrentModificationException - 请小心。

作为补充,您可以用自己的迭代器覆盖列表迭代器并添加所需的逻辑。只需实现java.util.Iterator接口(interface)即可。

关于java - 在迭代期间从集合中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16730501/

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