概述
Java容器类的JDK提供的保存对象的类。其隐藏了具体的实现(数组、链表),包含常用的数据结构:集合、队列、栈、映射。
Java容器主要包括3部分:Collection集合(List、Set)、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays、Collections)
架构
下图是Java中容器的架构图(JDK6,未包括Queue的实现),图来自《Think In Java》

Collection
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。在Java中不直接使用Collection,而是使用其子接口List和Set。
- List:List是一个依照插入顺序的集合,每个元素都有它的索引(第一个元素索引值为0)。List实现类主要有:ArrayList、LinkedList、Stack、Vector。
- Set:Set是一个不能有重复元素的集合(部分实现类可以有一个null对象)。Set实现类主要有:HashSet、TreeSet、LinkedHashSet。其中HashSet底层依赖于HashMap实现的,TreeSet底层依赖于SortedMap实现的。
Map
Map是一个key-value键值对映射接口,其中key不能有重复元素(部分实现类可以有一个null对象)。Map实现类主要有:HashMap、TreeMap、LinkHashMap、HashTable等。
Iterator等工具类
Iterator是迭代器,是遍历集合的工具,这里是Java中的迭代器设计模式的实现。还有Collections、Arrays等工具类,其提供一些方法以简化容器的使用。
详解
下面是Java容器类的详解,主要讲解常用容器的常见API。
Collection接口
- 接口定义
1
| public interface Collection<E> extends Iterable<E>
|
- 常用API
1 2 3 4 5 6 7 8 9
| boolean add(E e) 向集合添加对象,若其发送改变则返回true。 boolean addAll(Collection<? extends E> c) void clear() boolean contains(Object o) 通过equals()方法判断该集合是否有该元素,若有返回true。 Iterator<E> iterator() 返回Iterator。 boolean remove(Object o) 移除集合中与该对象相等(o.equals(e))的第一个对象,若集合发送改变,返回true。 boolean isEmpty() int size() 返回该集合包含元素的数量。 <T> T toArray(T[] a) 返回包含此集合中所有元素的数组,数组元素必须是T类型或者T类型的父类。
|
List接口
- 接口定义,List可以将元素维护在特定的序列中,没有元素都要索引,并且允许有重复元素。
1
| public interface List<E> extends Collection<E>
|
- 常用API
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| boolean add(E e) 向集合添加对象,若其发送改变则返回true。 boolean addAll(Collection<? extends E> c) void clear() boolean contains(Object o) 通过equals()方法判断该集合是否有该元素,若有返回true。 Iterator<E> iterator() 返回Iterator。 boolean remove(Object o) 移除集合中与该对象相等(o.equals(e))的第一个对象,若集合发送改变,返回true。 boolean isEmpty() int size() 返回该集合包含元素的数量。 <T> T toArray(T[] a) 返回包含此集合中所有元素的数组,数组元素必须是T类型或者T类型的父类。
E get(int index) 返回List中该索引的元素。 int indexOf(Object o) 返回该元素在List的索引,通过equals()方法比较,若在返回其索引,不在返回-1。 ListIterator listIterator() 返回listIterator。 E remove(int index) 移除List指定索引的元素,返回该元素。 E set(int index,E element) 替换List指定索引的元素,返回该元素。
|
- 实现List接口的常见类
- ArrayList:线程不安全,ArrayList是用数组实现的一种线性表,在随机访问方面优秀,是我们最常用的集合。
1
| public class ArrayList<E> extends AbstractList implements List<E>, RandomAcess, Cloneable, Serializable
|
- LinkedList:线程不安全,LinkedList是用双向链表实现的,插入、删除方面优秀。
1
| pulbic class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serialzable
|
- Vector:线程安全,Vector和ArrayList基本是一样的,但Vector是线程安全,其通过在方法上加上
synchronized关键字进行线程同步的。
1
| public class Vector<E> extends AbstractList<E> implements List<E>, RandomAcess, Cloneable, Serializable
|
Set接口
- 接口定义:Set是一个继承于Collection的接口,Set是一种不包括重复元素的Collection。它维持它自己的内部排序,所以随机访问没有任何意义,一些Set允许有一个null对象。
1
| public interface Set<E> extends Collection<E>
|
- 常用API:其常用API和Collection一样
- 实现Set接口的常见类
- HashSet:线程不安全,HashSet堪称查询速度最快的集合,因为其内部依赖于HashMap。集合元素不能重复,可以有一个null对象。它内部元素的顺序是由哈希码来决定的,所以它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。注:其存放元素时通过
equals()、hashCode()方法比较是否重复,所以我们需要重写该对象的equals()、hashCode()方法。
1
| public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, Serializable
|
- TreeSet:线程不安全,TreeSet内部依赖于TreeMap,内部是红黑树实现的,总是生成有序的Set。集合元素不能重复,不可以有null对象。TreeSet是有序的,所以存放的对象必须实现
Comparable<E>接口,或者构造方法传入比较器(实现Comparator<E>接口的类)。注:其存放元素时通过compareTo()方法或者compare()方法进行比较是否重复以及大小。
1
| pulbic class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializeble
|
- LinkedHashSet:线程不安全,LinkHashSet内部依赖于LinkedHashMap,保证元素的插入顺序。集合元素不能重复,可以有一个null对象。注:其存放元素通过
equals()、hashCode()方法比较是否重复,所以我们需要重写该对象的equals、hashCode()方法。
1
| public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, Serializable
|
Map接口
- 接口定义:Map是key-value键值对,提供了key到value的映射。Map中key不能有相同元素,value可以有相同元素。部分Map实现类中key可以有一个null对象。
1
| public interface Map<K,V>
|
- 常用API
1 2 3 4 5 6 7 8
| boolean containsKey(Object key) 返回该Map是否有该key。 boolean containsValue(Object value) 返回该Map是否有该Value。 Set<Map.Entry<K,V>> entrySet() 返回该Map包含的所有映射关系Map.Entry<K,V>的Set集合。 V get(Object key) 返回该Map中key映射的value对象,如果Map中没有该key对象返回null。 Set<K> keySet() 返回该Map中的所有key的Set集合。 V put(K key,V value) 把key-value映射放入Map中,如果Map中有该key则返回原来key对应的value,否则返回null。 V remove(K key) 如果Map中有该key返回原来key对应的value,否则返回null。 int size() 返回Map中key-value映射的数量
|
- 实现Map接口的常见类
- HashMap:线程不安全,HashMap内部以哈希、数组、链表、红黑树实现。它是为快速查询而设计的,无序,其key不能重复但可以有一个null对象。注:其key不能有相同元素是通过
equals()、hashCode()方法进行比较的,所以我们需要重写key对象的equals()、hashCode()方法。
1
| public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
|
- HashTable:线程安全,HashTable的实现和HashMap一样,只是每个方法通过
synchronized进行修饰以使得线程安全,一般现在不使用,而是直接使用ConcurrentHashMap。
1
| public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
|
- TreeMap:线程不安全,TreeMap内部红黑树实现的有序散列表。其key不能重复而且不能有null对象。TreeMap是有序的,所以存放的对象必须实现
Comparable<E>接口,或者构造方法传入比较器(实现Comparator<E>接口的类)。注:其存放元素时通过compareTo()方法或者compare()方法进行比较是否重复以及大小。
1
| public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable
|
- LinkedHashMap:线程不安全,LinkedHashMap继承自HashMap并且实现了Map接口。其key不能重复但可以有一个null对象。它能够保证元素的插入顺序。注:其key不能有相同元素是通过
equals()、hashCode()方法进行比较的,所以我们需要重写key对象的equals()、hashCode()方法。
1
| public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
|
Iterator接口
接口定义:Iterator是集合的迭代器接口,集合可以通过Iterator进行遍历。注:Iterator遍历Collection时,是fail-fast机制的。即,当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。
常用API
1 2 3
| abstract boolean hasNext() abstract E next() abstract void remove()
|
References
http://alexyyek.github.io/2015/04/06/Collection/
http://blog.csdn.net/tsyj810883979/article/details/6897043