主要内容

  1. 快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
  2. 算法:二叉树中和为某一值的路径

快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

什么是快速失败?

在使用迭代器遍历一个集合对象时,迭代器是直接访问的集合中的内容,并且如果遍历过程中对集合对象的结构进行了修改,就会抛出ConcurrentModeficationException
在集合类中维护了一个 protected transient int modCount = 0;每当读集合的结构发送修改的时候,该值就会进行自增。而在迭代器中也维护了一个expectedModCount.在hashNext()/next()方法中会进行一个判断,但检测到modCount != expectedModCount就会抛出异常ConcurrentModificationException
如果集合发送了变化但modCount的值又刚好等于expectedModCount的话,就不会抛出异常。因此不能依赖这个异常是否抛出而进行并发操作的编程,这个异常只建议用来检测并发修改的bug。

什么是安全失败?

在使用安全失败机制的集合容器中,在遍历时不是直接在集合内容上访问的,而是复制原有的集合的内容,在拷贝的集合上进行遍历。因此在原集合上的修改对于迭代器来说是不知道的。
java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。

算法:二叉树中和为某一值的路径

题目描述:
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Solution {
private ArrayList<ArrayList<Integer>> result=new ArrayList<ArrayList<Integer>>();
private ArrayList<Integer> list=new ArrayList<Integer>();

public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null){
return result;
}
list.add(root.val);
target-=root.val;
if(target==0&&root.left==null&&root.right==null){
result.add(new ArrayList<Integer>(list));
}
FindPath(root.left,target);
FindPath(root.right,target);
list.remove(list.size()-1);
return result;
}
}