gpt4 book ai didi

java - java迭代器背后的概念是什么?

转载 作者:搜寻专家 更新时间:2023-11-01 01:14:09 24 4
gpt4 key购买 nike

我正在研究 java iterator 接口(interface),不明白为什么要这样设计。

为什么 java 迭代器使用 hasNextnext 而不是将它们合并到一个方法中?

这是java迭代器的典型用法

Iterator iter = //iterator from a list
while(iter.hasNext()){
Object obj = iter.next();
// do something to obj
}

为什么不

Iterator iter = //iterator from a list
Object obj = null;
try {
while(true){
obj = iter.next();
// do something to obj
}
} catch (NoSuchElementException e) {}

很明显,这种方法看起来很难看,但是如果 next 在到达结束时返回 null 而不是抛出异常,会发生什么情况?比代码可以简化为

Iterator iter = //iterator from a list
Object obj = null;
while((obj = iter.next()) != null){
// do something to obj
}

这就是 Objective-C 中 NSEnumerator 的工作原理

NSEnumerator *enumerator = // from an array
while (id obj = [enumerator nextObject]) {
// do something to obj
}

这增加了实现自定义 iterator 的开销。

这也使得 java 迭代器不是线程安全的。例如,ArrayList 中有一个元素。两个线程都同时为该列表 hasNext 请求相同的迭代器。两个线程都将看到 true,并且它们将在该迭代器上调用 next。因为只有一个元素,而且迭代器被询问了两次,这肯定会导致异常或错误状态。

我知道有线程安全的迭代器,但我不确定它的实现是否热门,但我认为发生了很多阻塞,这使得它效率低下。

我认为问题是检查和更新不是自动发生的,我不明白为什么 java 设计这样的 iterator 接口(interface)。


更新

我看到 null 可以是一个值,所以我的方法是无效的。但是,对于我上面提到的问题,是否有任何可能的解决方法?

最佳答案

你的提议将使得集合中不可能有 null 值,因为它使用 null 作为“毒丸”来检测迭代的结束。

在极少数情况下,两个线程共享一个迭代器,您只需要将其包装在某个自定义类中并同步对迭代器的访问,以使先检查后执行操作成为原子操作。无论如何这是需要的,因为即使迭代器只有一个方法,后备集合(您的示例中的 ArrayList)也不是线程安全的。

关于java - java迭代器背后的概念是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9530582/

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