当前位置: 首页 > 面试题库 >

为什么iterator.remove()被描述为可选操作?

楚博雅
2023-03-14
问题内容

我通过文档(去http://java.sun.com/javase/6/docs/api/java/util/Iterator.html)的Iterator.remove()
存在remove()被描述成

void remove()

从基础集合中移除迭代器返回的最后一个元素(可选操作)。每次调用next只能调用一次此方法。如果在迭代进行过程中以其他方式(而不是通过调用此方法)修改了基础集合,则未指定迭代器的行为。

  1. 因此,任何人都可以说出“可选”的含义。
  2. 这会影响操作的鲁棒性吗?(像c ++一样,它不能保证操作的鲁棒性。)
  3. 为什么在此明确指定了“可选”。
  4. 文档第二行中的“修改”是什么意思

如果基础集合被修改,则迭代器的行为未指定


问题答案:

#1:可选,意味着您可以实现它 抛出一个UnsupportedOperationException

#2:此操作是可选的,因为有时您只是不想修改迭代器的内容。或您对“操作的鲁棒性”了解什么?

编辑 #4:behavior of an iterator is unspecified if the underlying collection is modified

通常,您可以通过执行

List<String> c = new ArrayList<String>();
c.add("Item 1");
c.add("Item 2");
c.add("Item 3");
...
for (Iterator<String> i = c.iterator(); i.hasNext();)
{
  String s = i.next();
  ...
}

如果您现在想 在遍历 列表 删除项目, 可以致电

c.remove("Item 2");

不是干净的 ,可能会 破坏 您的List / Collection / …中的数据,应 避免使用 。而是 通过迭代器
remove()将该项目移除:

i.remove();


 类似资料:
  • 问题内容: 有什么不同之处与使得迭代器不会引发异常而引发异常?最后,两者都在修改集合大小。 请在这里忽略多线程。我只是在谈论一个for-each循环和一个迭代器循环。据我所知,for-each循环仅在内部创建迭代器。 我很困惑。 问题答案: 不会抛出,因为这是在迭代时修改集合的 允许 方式。这是什么的Javadoc的说: 从基础集合中移除此迭代器返回的最后一个元素(可选操作)。每次调用next()

  • 我正在讨论以下问题:使用Java 8的可选和stream::FlatMap并希望向自定义的添加一个方法,然后检查它是否工作。 更准确地说,我希望向我的添加一个。如果不存在值,则返回一个空流,如果存在,则返回一个包含单个元素的流。 但是,我得出的结论是,声明为final。 为什么会这样呢?有一些类没有声明为final,我个人认为这里没有理由声明final。 作为第二个问题,为什么不是所有的方法都是f

  • 问题内容: 它以空字符串开头,而不是nil。即使将其显式设置为nil,它仍然是一个空字符串。我不明白 也许通过分配nil使其易于清除?用它编写代码很麻烦。 问题答案: 这是历史性的事情。空字符串和字符串之间没有任何区别。在Objective- C中,无需在两者之间进行区别,因为您可以在Objective-C中调用方法。 同样,在Objective-C中也无法阻止用户分配给属性。生成的合同可以是可选

  • Python 中,通过使用描述符,可以让程序员在引用一个对象属性时自定义要完成的工作。 本质上看,描述符就是一个类,只不过它定义了另一个类中属性的访问方式。换句话说,一个类可以将属性管理全权委托给描述符类。 描述符是 Python 中复杂属性访问的基础,它在内部被用于实现 property、方法、类方法、静态方法和 super 类型。 描述符类基于以下 3 个特殊方法,换句话说,这 3 个方法组成

  • 问题内容: 为什么只有知道文件的inode却不搜索链接到该inode的文件却无法访问文件?到文件的硬链接只包含名称和数字,告诉您在哪里可以找到有关该文件的所有 真实 信息的索引节点。当我被告知没有用户模式直接使用inode编号打开文件时,我感到很惊讶。 对于系统而言,这似乎是一种无害且有用的功能。为什么不提供? 问题答案: 某些操作系统 确实 具有该功能。例如,OS X需要它来支持Carbon F

  • 问题内容: 什么是类描述符? 它是特定类的对象吗? 问题答案: 是的,对象是某个“类”的类描述符。 从API中: 此类的实例表示正在运行的Java应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组还属于一个反映为Class对象的类,该类对象由元素类型和维数相同的所有数组共享。原始Java类型(布尔型,字节型,字符型,短型,整型,长型,浮点型和双精度型)以及关键字void也都表示为对象。