Java 集合类提供了如线性表,链表和哈希表等基础数据结构的实现,通过它可以实现各种你想要的数据结构,如stack ,queue 等,了解Java 集合类的工作原理可以编出更高效性能的程序,另外了解其工作原理可以更好地使用它,避免因为滥用而出现性能上的问题。事实证明,很多性能上的问题都是因为使用不当引起的。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
└SortedSet
└HashSet
└TreeSet
Map
├Hashtable
├HashMap
├SortedMap
└TreeMap
└WeakHashMap
Java2 的集合框架,抽其核心,主要有三种: List 、 Set 和 Map
1. List 的主要特性
1) 有序的 Collection
2) 使用该接口可以精确定义元素插入的位置。
3) 用户能够通过索引来访问 List 的元素。
4) 元素允许重复,允许有 null 元素,基于 array 的 list 适合查询, linkedList 适合添加删除操作。
2. List 的主要方法
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
boolean add(E e)
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean addAll(int index, Collection<? extends E> c);
boolean removeAll(Collection<?> c);
boolean retainAll(Collection<?> c);
void clear();
E get(int index);
E set(int index, E element);
void add(int index, E element);
E remove(int index);
int indexOf(Object o);
int lastIndexOf(Object o);
2.Set 是不含重复元素的、无序的 Collection
3.Map 是一种以 key 和 value 形成对应关系的容器, key 重复会覆盖 value
在我们软件开发的过程中,当碰到问题了,我们第一步就是重现问题,然后进行 debug ,找出问题的原因,但往往有些 bug 隐藏的比较深,经过 n 次特定的操作的在特定的环境下才会重现,或者出错后,报错的 stack traces的没有指出错误的真正起点。
所以我们设计一个 Fail Fast 的系统显得很重要了。
很多人设计的系统,为了增强系统的健壮性,自动的将系统中出现的问题处理掉,并继续运行,但是在未来的某个时间引发奇怪的错误。
而 fail fast 的系统的做法却是相反的,当有问题发生,立即出错,并将出错信息显示出来。这样 bug 就很容易被发现,而不会进入到最终的产品中。
java.util 包中的集合类都返回 fail-fast 迭代器,这意味着它们假设线程在集合内容中进行迭代时,集合不会更改它的内容。如果 fail-fast 迭代器检测到在迭代过程中进行了更改操作,那么它会抛出ConcurrentModificationException ,这是不可控异常。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TestFastFail {
public static void main(String[] args) {
List<String> list = new ArrayList<String>(20);
for ( int i = 0; i < 20; i++) {
list.add( "test" );
}
// 在迭代器迭代过程中,如果集合被修改被抛出 java.util.ConcurrentModificationException
// 这就是 fast fail 的意义,早点发现程序的错误,并抛出异常
Iterator<String> iterator = list.iterator();
for ( int i = 0; iterator.hasNext(); i++) {
String string = iterator.next();
System. out .println(string);
list.add( "" );
}
}
}