河北省沧州建设厅网站,网站打开慢是什么原因,大余网站建设,域名备案网站源码字节面试#xff0c;问到的一个小知识点#xff0c;这里做一下总结#xff0c;其实小编之前有一篇文章#xff0c;已经对此有过涉及#xff0c;不过这里知识专项针对于问题#xff0c;把这个知识点拎出来说一下。 1.问题
什么是Fail-fast机制#xff1f; Hashmap是否拥… 字节面试问到的一个小知识点这里做一下总结其实小编之前有一篇文章已经对此有过涉及不过这里知识专项针对于问题把这个知识点拎出来说一下。 1.问题
什么是Fail-fast机制 Hashmap是否拥有Fail-fast机制 ConcurrentModificationException异常原因和解决方法是什么 哪些你常用的数据结构是Fail-fast的哪些不是举例说明一下 Enumeration与Iterator的异同 2.探索、解答
2.1 Fail-fast机制
从字面意思很好理解就是快速失败机制。映射到java设计中fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时就可能会产生fail-fast事件。例如当某一个线程A通过iterator去遍历某集合的过程中若该集合的内容被其他线程所改变了那么线程A访问集合时就会抛出ConcurrentModificationException异常产生fail-fast事件。
2.2 ConcurrentModificationException
List在for、while正常遍历过程中如果remove元素容易出现ConcurrentModificationException 异常根本原因的话之前ArrayList源码分析文章已经讲过各位有兴趣可以移步阅读。
ConcurrentModificationException发生是因为我们在使用迭代器遍历List的同时还使用了List相应的remove、add进行元素增加或删除导致不一。
2.3 Enumeration与Iterator的异同
2.3.1 Iterator
java中迭代器接口的源码很简单我们看下面 package java.util;import java.util.function.Consumer;public interface IteratorE {boolean hasNext();E next();default void remove() {throw new UnsupportedOperationException(remove);}default void forEachRemaining(Consumer? super E action) {Objects.requireNonNull(action);while (hasNext())action.accept(next());}
}
就是遍历、移除的接口定义这块知识我们在Android源码设计模式探索与实战【迭代器模式】一文中对于迭代器设计模式做过深入剖析迭代器模式重在容器类集合提供顺序遍历的方式其实从上面Demo、实践案例、源码中大家都可以看到迭代器模式实际上就是把不同类型的集合的遍历进行了封装 这样针对于客户端来说只需关注迭代器接口不再需要关心内部使用了什么类型的集合。
2.3.2 Enumeration
我们看一下这个接口的源码
package java.util;/*** see java.util.Iterator* see java.io.SequenceInputStream* see java.util.Enumeration#nextElement()* see java.util.Hashtable* see java.util.Hashtable#elements()* see java.util.Hashtable#keys()* see java.util.Vector* see java.util.Vector#elements()** author Lee Boynton* since JDK1.0*/
public interface EnumerationE {boolean hasMoreElements();E nextElement();
}
只有是否还有元素的判断接口、遍历下一个元素的两个方法定义并没有移除方法所以这个玩意自然而然就不存在Fail-fast和ConcurrentModificationException了。
2.3.3 Enumeration与Iterator异同总结
其实一看源码相信大家就立马明白了Enumeration与Iterator都是java定义的集合遍历接口不同的是Iterator提供了移除接口。 有了移除操作自然而然就是涉及到多线程安全性那么就引入了可能存在的ConcurrentModificationException。
2.4 Fail-fast举例
哪些你常用的数据结构是Fail-fast的哪些不是上面源码的时候其实大家已经看到了答案。 Arraylist、HashMapLinkedHashmap、HashSet本身就是继承与Hashmap的是有Fail-fast机制的因为他们都有迭代器Iterator。而HashTable、Vector的某些遍历方式是没有的因为它实现与Enumeration。 * see java.util.Iterator* see java.io.SequenceInputStream* see java.util.Enumeration#nextElement()* see java.util.Hashtable* see java.util.Hashtable#elements()* see java.util.Hashtable#keys()* see java.util.Vector* see java.util.Vector#elements()public class Itbird{
public static void main(String[] args){Vector v new Vector();v.addElement(my);v.addElement(you);Enumeration e v.elements();//返回Enumeration对象while(e.hasMoreElements()){String value (String)e.nextElement();//调用nextElement方法获得元素System.out.print(value);}}
}