Re: [问题] 请问JAVA的哈希不能用Indexof该怎么办?

楼主: gasbomb (虚空雷神兽)   2018-12-03 11:50:47
→ adrianshum: 一般map 应该会concurrent modification exception 11/28 22:34
→ adrianshum: 之类吧,iterate 过程中remove... 11/28 22:34
对不起, 我考虑不周, 上面的程式真的会 ConcurrentModificationException
→ Cavalier: 是的 正确方法是 break 以后再 remove 11/29 02:46
break 之后再 remove 吗?
不过以 for each 来说, break 之后就拿不到里面的变量 key 了
这样还有办法 remove 吗?
for (Object key : hashmap.keySet()) {
if (hashmap.get(key) == target) {
hashmap.remove(key);
break;
}
}
倒是 break 加在最后就可以正常执行了
→ qrtt1: 用 iterator 去 remove 比较方便 11/29 07:32
确实用 iterator 改写就不会例外了
Iterator it = hashmap.keySet().iterator();
while(it.hasNext()) {
if(hashmap.get(it.next()) == target) {
it.remove();
}
}
其实我自己用过几次这个方法
就天真的以为反正 for each 也是 compiler 自动帮你展开 iterator
所以 for each 应该也可以正常的移除元素
不过事情没有这么简单, 今天看了 ConcurrentModificationException 的文件
跟 HashMap 原始码发现有所谓的 fail-fast 机制
HashMap 里面有个变量 modCount 计算了 HashMap 被修改的次数
Iterator 还有另外一个变量 expectedModCount
在开始的时候 expectedModCount = modCount
只要 iterate 中这两个数字兜不起来马上丢出例外, 用意可能是想预防错误吧
毕竟这样做会发生什么结果完全无法预期
甚至 for each 里面写个 add() put() 之类的进去还会无穷循环 XD
只有 Iterator.remove() 这个方法不会触发例外
因为逻辑上来说这种操作不会有出错的可能
请问这样的理解正确吗?
推 jej: 用iterator+1 用map.remove反序的时候会遇到可怕的状况 11/29 22:20
这我就看不懂了, 反序? map 不是没有顺序吗?
愿闻其详
-
上面打了一堆, 回头又翻了一下文件
结果文件早就说得很明白了 QQ
If the map is modified while an iteration over the set is in progress, the
results of the iteration are undefined.
(except through the iterator's own remove operation)
话又说回来, 如果在 value 已知的状况下
Collection c = hashmap.values();
c.remove(target);
好像才是最快最方便的?
作者: adrianshum (Alien)   2017-11-28 22:34:00
一般map 应该会concurrent modification exception之类吧,iterate 过程中remove...
作者: Cavalier (Cavalier)   2017-11-29 02:46:00
是的 正确方法是 break 以后再 remove
作者: qrtt1 (有些事,有时候。。。)   2017-11-29 07:32:00
用 iterator 去 remove 比较方便
作者: jej (晃奶大馬桶)   2017-11-29 22:20:00
用iterator+1 用map.remove反序的时候会遇到可怕的状况
作者: qrtt1 (有些事,有时候。。。)   2018-12-03 13:02:00
Iterator 没事是因为你目前是单一 thread
作者: adrianshum (Alien)   2018-12-04 10:22:00
Concurrent modification exception 单thread 也会出现
作者: alan23273850   2018-12-12 09:42:00
learned a lesson!

Links booklink

Contact Us: admin [ a t ] ucptt.com