标签:
get方法与ArrayList没有什么变化。但是凡是需要改动Array的方法都使用了ReentrantLock进行加锁,然后每次的修改操作都是产生一个新的list,然后setArray设置回去,包括add,set,remove等操作都是。例如add方法,并没有使用ArrayList的扩容机制,而是每次添加元素都是新建一个Array,然后完全copy过去。因此如果频繁修改list,效率会很低。
public boolean add(E e) { final ReentrantLock lock = this.lock; lock.lock(); try { Object[] elements = getArray(); int len = elements.length; Object[] newElements = Arrays.copyOf(elements, len + 1); newElements[len] = e; setArray(newElements); return true; } finally { lock.unlock(); } }
对于迭代器来说,不用担心使用迭代器时修改list会报异常,在生成iterator时候会生成一个副本(snapshot),迭代遍历的是副本。但是迭代器的所有修改操作都是不支持的,会抛出 UnsupportedOperationException 异常。
标签:
原文地址:http://www.cnblogs.com/keep-curiosity/p/4736599.html