hashTable是fail-fast还是fail-safe?

hashTable是fail-fast还是fail-safe?

在这里插入图片描述在这里插入图片描述
根据jdk1.8的官方文档,我们可以确定hashTable是fail-fast机制的,那为什么网上有很多人说是fail-safe机制的呢?

hashTable和hashMap有一个相同的迭代器 Iterator,都是实现Map接口得来的。用法:Iterator iterator = map.keySet().iterator(); 众所周知hashMap的 Iterator 是fail-fast的,hashTable的 Iterator自然也是fasil-fast的,而hashTable还有另外一个迭代器 Enumeration 这个迭代器是fail-safe的,为什么这么说呢,试一下下面的案例就知道了。
hashTable是fail-fast还是fail-safe?_第1张图片

public void rangeIterator(Hashtable ht){
     
        Iterator iterator = ht.keySet().iterator();
        while(iterator.hasNext()){
     
            ht.remove("name");
            String k = (String)iterator.next();  //这里抛出java.util.ConcurrentModificationException
            System.out.println("it-k=>"+k);
        }
    }

    public void rangeEnumeration(Hashtable ht){
     
        Enumeration enumeration = ht.keys();
        while (enumeration.hasMoreElements()){
     
            ht.remove("name");
            String k = (String)enumeration.nextElement();
            System.out.println("em-k=>"+k);
        }
    }

通过以上测试我们可以看出,hashTable在遍历时将遍历到的元素删除,使用Enumeration不报错,而使用Iterator抛出ConcurrentModificationException(fail-fast标志性异常) 。

总结以上,hashTable是fail-fast机制的,他有两个迭代器,Iterator 使用fail-fast机制、Enumeration 使用fail-safe机制。

参考:https://www.zhihu.com/question/394275440

你可能感兴趣的:(Java,hashtable)