java容器类
1.概述
Java容器类的JDK提供的保存对象的类。其隐藏了具体的实现(数组、链表),包含常用的数据结构:集合、队列、栈、映射
Java容器主要包括3部分:Collection集合(List、Set)、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays、Collections)
2.框架
说明:左图为简化图,右图为完整图(未包括Queue的实现)
主要有两个不同概念:
1).Collection接口,一个独立元素的序列,它包含一些基本的操作和属性。分为List、Set。
List是一个依照插入顺序的集合,每个元素都有它的索引(第一个元素索引值为0)。List实现类主要有:ArrayList、LinkedList、Stack、Vector。
Set是一个不能有重复元素的集合(部分实现类可以有一个null对象)。Set实现类主要有:HashSet、TreeSet、LinkedHashSet。其中HashSet底层依赖于HashMap实现的,TreeSet底层依赖于SortedMap实现的。
2). Map映射接口,即key-vallue键值对。
Map是一个key-value键值对映射接口。其中key不能有重复元素(部分实现类可以有一个null对象)。Map实现类主要有:HashMap、TreeMap、LinkHashMap、HashTable等。
3).Iterator接口,即迭代器。是遍历集合的工具。
4).Arrays与Collections是操作数组、集合的工具类。其有许多已经实现的方法来更好的操作数组、集合。
3.详解
Collection接口
1).定义
public interface Collection<E> extends Iterable<E>
2).Collection的部分常用API
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接口
1).定义
public interface List<E> extends Collection<E>
List可以将元素维护在特定的序列中,没有元素都要索引,并且允许有重复元素。
2)List的常用API
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类型的父类。
// 相比Collection新增的API
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指定索引的元素,返回该元素。
3)实现List接口的类
ArrayList(线程不同步)
public class ArrayList<E> extends AbstractList implements List<E>, RandomAcess, Cloneable, Serializable
ArrayList是用数组实现的一种线性表,在随机访问方面优秀,是我们最常用的集合。
LinkedList(线程不同步)
pulbic class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serialzable
LinkedList是用双向链表实现的,插入、删除方面优秀。
Vector(线程安全)
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAcess, Cloneable, Serializable
和ArrayList基本是一样的,但Vector是线程安全。
Stack(线程安全)
public class Stack<E> extends Vector<E>
基于Vector实现的栈(后进先出)。
其中ArrayList、LinkedList可以通过Collections.synchronizedList()方法转换成线程安全。
例如:List arrayList = Collections.synchronizedList(new ArrayList())
Set接口
1).定义
public interface Set<E> extends Collection<E>
Set是一个继承于Collection的接口,Set是一种不包括重复元素的Collection。它维持它自己的内部排序,所以随机访问没有任何意义,一些Set允许有一个null对象。
2).Set的API与Collection完全一样。
3).实现Set接口的类
HashSet(线程不同步)
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, Serializable
HashSet堪称查询速度最快的集合,因为其内部依赖于HashMap。集合元素不能重复,可以有一个null对象。它内部元素的顺序是由哈希码来决定的,所以它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。
注:其存放元素时通过equals()
、hashCode()
方法比较是否重复,所以我们需要重写该对象的equals()
、hashCode()
方法。
TreeSet(线程不同步)
pulbic class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializeble
TreeSet内部依赖于TreeMap,内部是红黑树实现的,总是生成有序的Set。集合元素不能重复,不可以有null对象。TreeSet是有序的,所以存放的对象必须实现Comparable<E>
接口,或者构造方法传入比较器(实现Comparator<E>
接口的类)。
注:其存放元素时通过compareTo()
方法或者compare()
方法进行比较是否重复以及大小。
LinkHashSet(线程不同步)
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, Serializable
LinkHashSet内部依赖于LinkedHashMap,保证元素的插入顺序。集合元素不能重复,可以有一个null对象。
注:其存放元素通过equals()
、hashCode()
方法比较是否重复,所以我们需要重写该对象的equals
、hashCode()
方法。
Map接口
1).定义
public interface Map<K,V>
Map是key-value键值对,提供了key到value的映射。Map中key不能有相同元素,value可以有相同元素。部分Map实现类中key可以有一个null对象。
2).Map的常用API
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映射的数量
3).实现Map接口的相关类
HashMap(线程不同步)
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
HashMap内部以哈希、数组、链表实现。它是为快速查询而设计的,无序。其key不能重复但可以有一个null对象。
注:其key不能有相同元素是通过equals()
、hashCode()
方法进行比较的,所以我们需要重写key对象的equals()
、hashCode()
方法。
HashTable(线程同步)
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
HashTable继承Dicionary类,实现了Map接口。HashTable性能不及HashMap,但其是线程安全的。该类用的较少。其key与value都不能为null对象。
TreeMap
public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable
TreeMap内部红黑树实现的有序散列表。其key不能重复而且不能有null对象。TreeMap是有序的,所以存放的对象必须实现Comparable<E>
接口,或者构造方法传入比较器(实现Comparator<E>
接口的类)。
注:其存放元素时通过compareTo()
方法或者compare()
方法进行比较是否重复以及大小。
LinkedHashMap
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
LinkedHashMap继承自HashMap并且实现了Map接口。其key不能重复但可以有一个null对象。它能够保证元素的插入顺序。
注:其key不能有相同元素是通过equals()
、hashCode()
方法进行比较的,所以我们需要重写key对象的equals()
、hashCode()
方法。
WeakHashMap
没有用过,不太清楚。
Iterator接口
1).定义
public interface Iterator<E>
Iterator是集合的迭代器接口。集合可以通过Iterator进行遍历
注:Iterator遍历Collection时,是fail-fast机制的。即,当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。
2).Iterator的常用API
abstract boolean hasNext()
abstract E next()
abstract void remove()
6.references
http://alexyyek.github.io/2015/04/06/Collection/
http://blog.csdn.net/tsyj810883979/article/details/6897043