集合框架结构
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,编程人员只需扩展此类,并提供 iterator 和 size 方法的实现。(iterator 方法返回的迭代器必须实现 hasNext 和 next。)
要实现可修改的 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