关于Java API中文文档一些术语的疑问

justinavril 2008-07-29 12:21:46
因为Java的类和方法实在太繁多了,所以不可能全部记住。所以要经常查阅Java的API文档,
一是巩固知识,二是看有没有遗漏的知识点。昨天怎么好看到了Vector类,他无非就是容量可自动调整的“数组”。
但是我看到它的注释有下面一段话:
由 Vector 的 iterator 和 listIterator 方法所返回的迭代器是快速失败的:

如果在迭代器创建后的任意时间从结构上修改了向量(通过迭代器自身的 remove 或 add 方法之外的任何其他方式),则迭代器将抛出 ConcurrentModificationException。

因此,面对并发的修改,迭代器很快就完全失败,而不是冒着在将来不确定的时间任意发生不确定行为的风险。Vector 的 elements 方法返回的 Enumeration 不是 快速失败的。

这里面有一个词,叫“快速失败”;
还有个叫“完全失败”。哎,是不是翻译的太差了,我不懂什么意思。
以前就想问,老忘记,这次提出来,大家给我解释下。谢谢!


另外如果大家有什么疑问的,也可以提出来,一起交流...



版主修改原因:
版主:kokobox
动作:帮助lz换行......
...全文
302 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
是的,这样会导致 java.util.AbstractList 中 protected 属性 modCount 与集合中
返回 Iterator 时预保留的 modCount 值会不一致,只要 modCount 与预保留的值不
一致就会产生这个异常,迭代器的内部就是这样判断的,这样可以在并发修改原集合
中的内容时能快速地检查出异常。

关于 modCount 可以看看 java.util.AbstractList API DOC 的字段说明。

举的这个例子在迭代中是禁止的!仅能通过 Iterator 的 remove 移除元素(注意非原
集合的 remove 方法),Iterator 中的 remove 额外地维护了 modCount 并修改了得到
Iterator 对象时所预保留的 modCount 值。
justinavril 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 bao110908 的回复:]
是的,这样会导致 java.util.AbstractList 中 protected 属性 modCount 与集合中
返回 Iterator 时预保留的 modCount 值会不一致,只要 modCount 与预保留的值不
一致就会产生这个异常,迭代器的内部就是这样判断的,这样可以在并发修改原集合
中的内容时能快速地检查出异常。

关于 modCount 可以看看 java.util.AbstractList API DOC 的字段说明。

举的这个例子在迭代中是禁止的!仅能通过 Iterator 的 remove 移…
[/Quote]
懂了 用Iterator的remove方法可以在迭代的时候删除Vector里的元素 是吧?
wolfgang_l 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 karlpan01 的回复:]
为什么非要咬文嚼字呢!?
你懂什么意思不就是了!
[/Quote]
ZangXT 2008-07-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mayuanfei 的回复:]
我靠,这是TMD的什么翻译啊.简直了....
[/Quote]
很多是社区人员翻译的,基本是爱好,估计也不会有人给钱.可以不看,可以提问题,不过最好尊重别人的劳动.
kokobox 2008-07-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 justinavril 的回复:]
晕 不会自动换行啊 我倒...
[/Quote]

o(∩_∩)o...哈哈




lz还是直接去看英文版的吧
mayuanfei 2008-07-29
  • 打赏
  • 举报
回复
我靠,这是TMD的什么翻译啊.简直了....
不过这里的ConcurrentModificationException这个异常我的确遇到过.就是在遍历一个List的时候移除里面的元素.
tonggj 2008-07-29
  • 打赏
  • 举报
回复
还要用vector么
karlpan01 2008-07-29
  • 打赏
  • 举报
回复
为什么非要咬文嚼字呢!?
你懂什么意思不就是了!
justinavril 2008-07-29
  • 打赏
  • 举报
回复
晕 不会自动换行啊 我倒...
justinavril 2008-07-29
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 kokobox 的回复:]
引用 15 楼 bao110908 的回复:
引用 6 楼 kokobox 的回复:
引用 2 楼 justinavril 的回复:
晕 不会自动换行啊 我倒...


o(∩_∩)o...哈哈


你还好意思笑,你不会去帮人家换换行啊?


只是觉得lz比较可爱 -_-

换好咯
[/Quote]
我17楼的代码是不是一个快速失败的例子啊...
kokobox 2008-07-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 bao110908 的回复:]
引用 6 楼 kokobox 的回复:
引用 2 楼 justinavril 的回复:
晕  不会自动换行啊  我倒...


o(∩_∩)o...哈哈


你还好意思笑,你不会去帮人家换换行啊?
[/Quote]

只是觉得lz比较可爱 -_-

换好咯

justinavril 2008-07-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 bao110908 的回复:]
所谓的快速失败(fail-fast)的意思是指在迭代的过程中,只要原集合对象的结构上有任何变化,
比如说 remove 一个,马上会在迭代器中反应出来,并抛出 ConcurrentModificationException 异常,
并不需要等到遍历结束时才知道少掉了一个。

因为在迭代器的每一个方法中开始就会检查集合是否被修改过。当 A 线程在遍历时,B 线程把集合中的数据
删掉一个,这样就是并发错误,所以产生的是 ConcurrentModificationExceptio…
[/Quote]
问个问题,是不是下面的代码返回的错误就是一个快速失败的例子?
import java.util.*;

public class TestVector {
public static void main (String args[]){
Vector vector = new Vector ();
int[] intArray = {1, 2, 3, 4, 5};

vector.add(intArray);

Iterator iterator = vector.iterator();

while (iterator.hasNext()){
vector.add(6);
System.out.print (iterator.next());
}

}
}

结果:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
at TestVector.main(TestVector.java:14)
sagezk 2008-07-29
  • 打赏
  • 举报
回复
火龙果正解。没办法,不只是翻译的问题,JDK API 英文文档中有些“术语”的含义本身就很模糊。
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kokobox 的回复:]
引用 2 楼 justinavril 的回复:
晕 不会自动换行啊 我倒...


o(∩_∩)o...哈哈
[/Quote]

你还好意思笑,你不会去帮人家换换行啊?
  • 打赏
  • 举报
回复
所谓的快速失败(fail-fast)的意思是指在迭代的过程中,只要原集合对象的结构上有任何变化,
比如说 remove 一个,马上会在迭代器中反应出来,并抛出 ConcurrentModificationException 异常,
并不需要等到遍历结束时才知道少掉了一个。

因为在迭代器的每一个方法中开始就会检查集合是否被修改过。当 A 线程在遍历时,B 线程把集合中的数据
删掉一个,这样就是并发错误,所以产生的是 ConcurrentModificationException 并发修改异常。

正因为这样,我们不能在迭代时不能往集合中 add 一个元素,也不能使用集合的 remove 方法移掉一个元素,
在 Iterator 中,可以使用迭代器的 remove 方法移除集合中的元素,这样就不会产生结构性修改问题。

快速失败我理解的意思:迭代器具有快速判断迭代失败的能力,不需要全部迭代完成才知道不对了。
完全失败(fails cleanly)我理解的意思:迭代器的最终状态。
亦风亦尘 2008-07-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 chuailong 的回复:]
那翻译的不好上网收下,什么讲的都很清楚的.API用到那看查那吧,你这么看也记不住多少.
[/Quote]
chuailong 2008-07-29
  • 打赏
  • 举报
回复
那翻译的不好上网收下,什么讲的都很清楚的.API用到那看查那吧,你这么看也记不住多少.
wxinb 2008-07-29
  • 打赏
  • 举报
回复
楼主可以看英文的帮助文档嘛 没有必要在中文的翻译上咬文嚼字啊 中文翻译不可能是那么准确的哈
justinavril 2008-07-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tonggj 的回复:]
还要用vector么
[/Quote]
怎么了...不好用吗...
justinavril 2008-07-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 karlpan01 的回复:]
为什么非要咬文嚼字呢!?
你懂什么意思不就是了!
[/Quote]

我就是吃不透啊 才发帖子问得啊...

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧