所有的集合类都位于java.util包下,java.util.concurrent包下提供一些支持多线程的集合类。
1.Collection和Map的继承体系
1.1 Collection集合体系的继承树(部分)以及部分类的显著特性
1.2 Map集合体系的继承树(部分)以及部分类的显著特性
2. 集合类之间的比较
2.1 Map和Set
(1)Map中放的是key-value对,Set中放的元素是单个对象,但如果把value当成key的附庸:key在哪里,value就在哪里。这样就可以像对待Set一样对待Map。
(2)事实上,Map提供了一个Entry内部类来封装key-value对,而计算Entry存储时只考虑Entry存储的key。
(3)从java源码实现来看,java是先实现Map再通过包装一个所有value都为null的Map就实现了Set集合。
2.2 HashSet和HashMap(依次类推其他对应的Set和Map子类比较)
(1) 对于HashSet及其子类而言,它们采用hash算法来决定集合中元素的存储位置,并通过hash算法来控制集合的大小。对于HashMap、HashTable及其子类而言,它们采用hash算法来决定Map中key的存储,并通过hash算法来增加key集合的大小。
2.3 ArrayList和Vector
(1)ArrayList和Vector类封装了一个动态的允许再分配的Object[]数组。都可使用
void ensureCapacity(int minCapacity)
将ArrayList或Vector集合的Object[]数组长度增加到大于或等于minCapacity值。这可以减少重分配的次数,从而提高性能。使用
void trimToSize()
调整ArrayList或Vector集合的Object[]数组长度为当前元素个数。可减少ArrayList或Vector集合对象占用的存储空间。
(2)ArrayList不是线程安全的,Vector是线程安全的。Vector和Stack都是古老的类,性能差。
2.4 ArrayList、ArrayDeque和LinkedList
(1)ArrayList和ArrayDeque的实现机制基本相似,它们底层都是采用一个动态的、可重分配的Object[]数组来存储集合元素,当集合元素超出了数组容量时,系统会在底层重新分配一个Object[]数组来存储集合元素。
(2)LinkedList比ArrayList功能上相比之下,不仅提供了List功能,还提供了双端队列、栈的功能。
(3)由于数组以一块连续的内存区域来保存所有的数组,所以数组在随机访问时性能最好。而内部以链表为底层实现的集合在执行插入删除操作时有比较好的性能,毕竟底层为数组形式的集合可能需要重新分配内部数组的大小效果较差。
(4)对于底层为数组的ArrayList,Vector或ArrayDeque集合,应该采用访问方法get来遍历集合元素。对于LinkedList集合则应该采用迭代器(Iterator)来遍历集合元素。
2.5 HashMap和Hashtable
(1)Hashtable是线程安全的,HashMap是线程不安全的。Hashtable性能差一些。
(2)Hashtable不允许使用null作为key和value,如果试图把null放进Hashtable则会产生NullPointerException异常;但HashMap可以使用null作为key和value。由于HashMap中的key不能重复,所以HashMap里最多只有一个key-value对的key为null,但可以有无数个key-value对的value为null。
3.集合类的API
各函数的功能请结合集合类的API文档进行功能查阅,在这里做出列举比较。
3.1 Collection和Map的接口函数
Collection | Map |
---|---|
void clear() | void clear() |
boolean add(Object o) | Object put(Object key,Object Value) |
boolean addAll(Collection c) | void putAll(Map m) |
boolean contains(Object o) | boolean containsKey(Object key) |
boolean containsAll(Collection c) | boolean containsValue(Object value) |
boolean isEmpty() | boolean isEmpty() |
boolean remove(Object o) | Object remove(Object Key) |
boolean removeAll(Collection c) | boolean remove(Object Key,Object value) |
boolean retainAll(Collection c) | |
int size() | int size() |
Iterator iterator() | Object get(Object key) |
Object[] toArray() | Set keySet() |
Collection values() | |
Set entrySet() |
Map中包括一个内部类Entry,该类封装了一个key-value对。Entry包含如下方法:
- Object getKey()
- Object getValue()
- Object setValue(V value)设置Entry里包含的value值,并返回新设置的value值。
另外,HashSet和HashMap是Collection和Map接口的实现类。
3.2 TreeSet和TreeMap
TreeSet | TreeMap |
---|---|
Comparator comparator() | Comparator comparator() |
Object first() | Map.Entry firstEntry() |
Object firstKey() | |
Object last() | Map.Entry lastEntry() |
Object lastKey() | |
Object lower(Object e) | Map.Entry higherEntry(Object key) |
Object higherKey(Object key) | |
Object higher(Object e) | Map.Entry lowerEntry(Object key) |
Object lowerKey(Object key) | |
SortedSet subSet(Object fromElement,Object toElement) | NavigableMap subMap(Object fromKey,boolean fromInclusive,Object toKey,boolean toInclusive) |
SortedMap subMap(Object fromKey,Object toKey) | |
SortedSet headSet(Object toElement) | NavigableMap headMap(Object toKey,boolean inclusive) |
SortedMap headMap(Object toKey) | |
SortedSet tailSet(Object fromElement) | NavigableMap tailMap(Object from,boolean inclusive) |
SortedMap tailMap(Object fromKey) |
3.3 List和Deque
List | Deque |
---|---|
void add(int index,Object element) | void addFirst(Object e) |
void addLast(Object e) | |
boolean offerFirst(Object e) | |
boolean offerLast(Object e) | |
boolean addAll(int index,Collection c) | |
Object get(int index) | Object getFirst() |
void getLast(Object e) | |
Object peekFirst(Object e) | |
Object peekLast(Object e) | |
int indexOf(Object o) | |
Object remove(int index) | Object pollFirst() |
Object pollLast() | |
Object removeFirst() | |
boolean removeFirstOccurrence(Object o) | |
Object removeLast() | |
boolean removeLastOccurence(Object o) | |
Object set(int index,Object element) | |
List subList(int fromIndex,int toIndex) | |
void replaceAll(UnaryOperator operator) | |
void sort(Comparator c) | |
Object pop() | |
void push(Object o) | |
Iterator descendingIterator() |
ArrayList和ArrayDeque是这两个接口的实现类。而LinkedList实现了这两个接口的方法。
3.4 Properties
Properties可以把Map对象和属性文件关联起来,从而可以把Map对象中的key-value对写入属性文件中,也可以把属性文件中的“属性名=属性值”加载到Map对象中。由于属性文件中的属性名、属性值只能是字符串类型,因此Properties里的key、value都是字符串类型。该类型提供了如下方法来修改Properties里的key,value值:
- String getProperty(String Key)
- String getProperty(String Key,String
defaultValue)跟前一个方法相似,不过在Properties中不存在指定的key时,则方法指定为默认值。 - Object setProperties(String key,String value) void load(InputStream
inStream)从属文件中加载key-value对,把加载到的key-value对追加到Properties里 - void store(OutputStream out,String
comments)将Properties中的key-value对输出到指定的属性文件中。
4.遍历集合元素
4.1.Iterator遍历
Iterator向Collection集合元素提供同于的编程接口。Iterator必须依附于Collection对象,如有一个Iterator对象则必然有一个与之关联的Collection对象。Iterator提供了如下接口:
- boolean hasNext():如果被迭代的集合元素还没有遍历完则返回true
- Object next():返回集合里的下一个元素
- void remove():删除集合里上一次next()返回的元素
- void forEachRemaining(Consumer action):这是java8为Iterator新增的默认方法,该方法可使用Lambda表达式来遍历。
另外,当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何影响。
当使用Iterator迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只有通过Iterator的remove()方法删除上一次next()方法返回的集合元素才可以;否则将会引发java.util.ConcurrentModificationException异常。