LinkedList 类数组
LinkedList 实现了 List 接口,容许 Null 元素。此外 LinkedList 提供额外的 Get、Remove、Insert 等方法在 LinkedList 的首部或尾部操做数据。这些操做使得 LinkedList 可被用做堆栈(Stack)、队列(Queue)或双向队列(Deque)。请注意 LinkedList 没有同步方法,它不是线程同步的,即若是多个线程同时访问一个 List,则必须本身实现访问同步。一种解决方法是在建立 List 时构造一个同步的 List,方法如函数
List list = Collections.synchronizedList(new LinkedList(...));性能
ArrayList 类测试
ArrayList 实现了可变大小的数组。它容许全部元素,包括 Null。Size、IsEmpty、Get、Set 等方法的运行时间为常数,可是 Add 方法开销为分摊的常数,添加 N 个元素须要 O(N) 的时间,其余的方法运行时间为线性。spa
每 个 ArrayList 实例都有一个容量(Capacity),用于存储元素的数组的大小,这个容量可随着不断添加新元素而自动增长。当须要插入大量元素时,在插入前能够调用 ensureCapacity 方法来增长 ArrayList 的容量以提升插入效率。和 LinkedList 同样,ArrayList 也是线程非同步的(unsynchronized)。线程
ArrayList 提供的主要方法:code
Boolean add(Object o) 将指定元素添加到列表的末尾;对象
Boolean add(int index,Object element) 在列表中指定位置加入指定元素;继承
Boolean addAll(Collection c) 将指定集合添加到列表末尾;接口
Boolean addAll(int index,Collection c) 在列表中指定位置加入指定集合;
Boolean clear() 删除列表中全部元素;
Boolean clone() 返回该列表实例的一个拷贝;
Boolean contains(Object o) 判断列表中是否包含元素;
Boolean ensureCapacity(int m) 增长列表的容量,若是必须,该列表可以容纳 m 个元素;
Object get(int index) 返回列表中指定位置的元素;
Int indexOf(Object elem) 在列表中查找指定元素的下标;
Int size() 返回当前列表的元素个数。
Vector 类
Vector 很是相似于 ArrayList,区别是 Vector 是线程同步的。由 Vector 建立的 Iterator,虽然和 ArrayList 建立的 Iterator 是同一接口,可是,由于 Vector 是同步的,当一个 Iterator 被建立并且正在被使用,另外一个线程改变了 Vector 的状态(例如,添加或删除了一些元素),这时调用 Iterator 的方法时将抛出 ConcurrentModificationException,所以必须捕获该异常。
Stack 类
Stack 继承自 Vector,实现了一个后进先出的堆栈。Stack 提供 5 个额外的方法使得 Vector 得以被看成堆栈使用。除了基本的 Push 和 Pop 方法,还有 Peek 方法获得栈顶的元素,Empty 方法测试堆栈是否为空,Search 方法检测一个元素在堆栈中的位置。注意,Stack 刚建立后是空栈。
Set 类
Set 是一种不包含重复的元素的 Collection,即任意的两个元素 e1 和 e2 都有 e1.equals(e2)=false。Set 最多有一个 null 元素。很明显,Set 的构造函数有一个约束条件,传入的 Collection 参数不能包含重复的元素。请注意,必须当心操做可变对象(Mutable Object),若是一个 Set 中的可变元素改变了自身状态,这可能会致使一些问题。
Hashtable 类
Hashtable 继承 Map 接口,实现了一个基于 Key-Value 映射的哈希表。任何非空(non-null)的对象均可做为 Key 或者 Value。添加数据使用 Put(Key,Value),取出数据使用 Get(Key),这两个基本操做的时间开销为常数。
Hashtable 经过 Initial Capacity 和 Load Factor 两个参数调整性能。一般缺省的 Load Factor 0.75 较好地实现了时间和空间的均衡。增大 Load Factor 能够节省空间但相应的查找时间将增大,会影响像 Get 和 Put 这样的操做。使用 Hashtable 的简单示例,将 一、二、3 这三个数字放到 Hashtable 里面,他们的 Key 分别是”one”、”two”、”three”,代码如清单 2 所示。
Hashtable numbers = new Hashtable(); numbers.put(“one”, new Integer(1)); numbers.put(“two”, new Integer(2)); numbers.put(“three”, new Integer(3));
若是咱们须要取出一个数,好比 2,能够用相应的 key 来取出,代码如清单 3 所示。
Integer n = (Integer)numbers.get(“two”); System.out.println(“two =”+ n);
因为做为 Key 的对象将经过计算其散列函数来肯定与之对应的 Value 的位置,所以任何做为 key 的对象都必须实现 HashCode 和 Equals 方法。HashCode 和 Equals 方法继承自根类 Object,若是你用自定义的类看成 Key 的话,要至关当心,按照散列函数的定义,若是两个对象相同,即 obj1.equals(obj2)=true,则它们的 HashCode 必须相同,但若是两个对象不一样,则它们的 HashCode 不必定不一样,若是两个不一样对象的 HashCode 相同,这种现象称为冲突,冲突会致使操做哈希表的时间开销增大,因此尽可能定义好的 HashCode() 方法,能加快哈希表的操做。
若是相同的对象有不一样的 HashCode,对哈希表的操做会出现意想不到的结果(期待的 Get 方法返回 Null),要避免这种问题,最好同时复写 Equals 方法和 HashCode 方法,而不要只写其中一个。
HashMap 类
HashMap 和 Hashtable 相似,不一样之处在于 HashMap 是线程非同步的,而且容许 Null,即 Null Value 和 Null Key。可是将 HashMap 视为 Collection 时(values() 方法可返回 Collection),其迭代子操做时间开销和 HashMap 的容量成比例。所以,若是迭代操做的性能至关重要的话,不要将 HashMap 的初始化容量设得太高,或者 Load Factor 参数设置太低。
WeakHashMap 类
WeakHashMap 是一种改进的 HashMap,它对 Key 实行“弱引用”,若是一个 Key 再也不被外部所引用,那么该 Key 能够被 GC 回收。