Joyen.fu
日中则昃,月盈则食。

集合框架结构

java.util包中定义了一下类和接口对集合进行支持:

图中方法了解:

Collections

public class Collections extends Object

此类完全由在 collection 上进行操作或返回 collection 的静态方法组成。即:Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

Arrays

public class Arrays extends Object

此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。

除非特别注明,否则如果指定数组引用为 null,则此类中的方法都会抛出 NullPointerException

Comparator  接口

位于java.util包下

public interface Comparator<T>

 

Comparable  接口

位于java.lang包下

public interface Comparable<T>

 

Stack:

public class Stack<E>extends Vector<E>

Stack 类表示后进先出(LIFO)的对象堆栈,它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。

LinkedList

public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, Serializable

List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null),此实现不是同步的。

Vector

public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializable

初始化时容量可以设定,如果以new Vector()方式创建时,则初始容量为10,超过容量时以1倍容量增加。如果以new Vector(Collection c)方式创建时,初始容量为c.size()

*1.1,超过时以1倍容量增加。如果以new Vector(int initialCapacity, int capacityIncrement),则以capacityIncrement容量增加。

功能与ArrayList几乎相同,也是以数组实现,添加,删除,读取,设置都是基于线程同步的。

ArrayList

public class ArrayList<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializable

初始化时不可指定容量,如果以new ArrayList()方式创建时,初始容量为10个;如果以new ArrayList(Collection c)初始化时,容量为c.size()*1.1,即增加10%的容量;当向ArrayList中添加一个元素时,先进行容器的容量调整,如果容量不够时,则增加至原来的1.5倍加1,再然后把元素加入到容器中,即以原始容量的0.5倍比率增加。

ArrayLis是用数组实现的,读取速度快,插入与删除速度慢(因为插入与删除时要移动后面的元素),适合于随机访问。

AbstractSequentialList  抽象类

public abstract class AbstractSequentialList<E>extends AbstractList<E>

此类提供了 List 接口的骨干实现,从而最大限度地减少了实现受“连续访问”数据存储(如链接列表)支持的此接口所需的工作。对于随机访问数据(如数组),应该优先使用
AbstractList,而不是先使用此类。

AbstractList  抽象类

public abstract class AbstractList<E>extends AbstractCollection<E>implements List<E>

此类提供 List接口的骨干实现,以最大限度地减少实现“随机访问”数据存储(如数组)支持的该接口所需的工作。对于连续的访问数据(如链表),应优先使用 AbstractSequentialList,而不是此类。

AbstractCollection  抽象类

public abstract class AbstractCollection<E>extends Objectimplements Collection<E>

此类提供 Collection 接口的骨干实现,以最大限度地减少了实现此接口所需的工作。

要实现一个不可修改的 collection,编程人员只需扩展此类,并提供 iteratorsize 方法的实现。(iterator 方法返回的迭代器必须实现 hasNextnext。)

要实现可修改的 collection,编程人员必须另外重写此类的 add 方法(否则,会抛出 UnsupportedOperationException),iterator 方法返回的迭代器还必须另外实现其 remove 方法

ListIterator  接口

public interface ListIterator<E>extends Iterator<E>

允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator 没有当前元素;它的光标位置 始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。长度为 n 的列表的迭代器有 n+1 个可能的指针位置。

Iterator  接口

public interface Iterator<E>

对 collection 进行迭代的迭代器

HashSet

public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, Serializable

此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。

此实现是不同步的。

最常用的,查询速度最快,因为 内部以HashMap来实现,所以插入元素不能保持插入次序。

TreeSet

public class TreeSet<E>extends AbstractSet<E>implements NavigableSet<E>, Cloneable, Serializable

基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。

也就是说生成一个总是处于排序状态的set,它实现了SortedSet接口,内部以 TreeMap来实现

AbstractSet  抽象类

public abstract class AbstractSet<E>extends AbstractCollection<E>implements Set<E>

 

此类提供 Set 接口的骨干实现,从而最大限度地减少了实现此接口所需的工作。

通过扩展此类来实现一个 set 的过程与通过扩展 AbstractCollection 来实现 Collection 的过程是相同的,除了此类的子类中的所有方法和构造方法都必须服从 Set 接口所强加的额外限制(例如,add 方法必须不允许将一个对象的多个实例添加到一个 set 中)。

注意,此类并没有重写 AbstractCollection 类中的任何实现。它仅仅添加了 equals 和 hashCode 的实现。

SortedSet  接口

public interface SortedSet<E>extends Set<E>

进一步提供关于元素的总体排序 的 Set。这些元素使用其自然顺序进行排序,或者根据通常在创建有序 set 时提供的 Comparator 进行排序。该 set 的迭代器将按元素升序遍历 set。提供了一些附加的操作来利用这种排序。(此接口是 SortedMap 的 set 对应接口)。

插入有序 set 的所有元素都必须实现 Comparable 接口(或者被指定的比较器所接受)。

List  接口

public interface List<E>extends Collection<E>

 

有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

与 set 不同,列表通常允许重复的元素。并且列表本身允许为空,允许多列为空。

 

Set  接口

public interface Set<E>extends Collection<E>

 

一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。

Collection  接口

public interface Collection<E>extends Iterable<E>

 Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。

WeakHashMap

public class WeakHashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>

 

以弱键 实现的基于哈希表的 Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的 Map 实现有所不同。

null 值和 null 键都被支持。该类具有与 HashMap 类相似的性能特征,并具有相同的效能参数初始容量 和加载因子。

像大多数 collection 类一样,该类是不同步的。可以使用 Collections.synchronizedMap 方法来构造同步的 WeakHashMap。

Hashtable

public class Hashtable<K,V>extends Dictionary<K,V>implements Map<K,V>, Cloneable, Serializable

此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。

为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。

Hashtable是线程安全的,也就是说是同步的。

HashMap

public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable

基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

SortedMap  接口

public interface SortedMap<K,V>extends Map<K,V>

进一步提供关于键的总体排序 的 Map。该映射是根据其键的自然顺序进行排序的,或者根据通常在创建有序映射时提供的 Comparator 进行排序。对有序映射的 collection 视图(由 entrySet、keySet 和 values 方法返回)进行迭代时,此顺序就会反映出来。要采用此排序方式,还需要提供一些其他操作(此接口是 SortedSet 的对应映射)。

插入有序映射的所有键都必须实现 Comparable 接口(或者被指定的比较器接受)。

AbstractMap  抽象类

public abstract class AbstractMap<K,V>extends Objectimplements Map<K,V>

此类提供 Map 接口的骨干实现,以最大限度地减少实现此接口所需的工作。

Map  接口

public interface Map<K,V>

几个笔试题:

1、Collection 和 Collections的区别

 Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
 Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

2、 List, Set, Map是否继承自Collection接口。

看上图,当然继承自Collection

3、 ArrayList和Vector的区别。

Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的

当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半


4 、HashMap和Hashtable的区别。

 Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现

 Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的

只有HashMap可以让你将空值作为一个表的条目的key或value 

posted on 2013-07-31 17:33  Joyen.fu  阅读(622)  评论(0编辑  收藏  举报