Java集合类框架
Java集合大致可分为Set、List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合。Java 5之后,增加了Queue体系集合,代表一种队列集合实现。Java集合框架主要由Collection和Map两个根接口及其子接口、实现类组成。下图是Java集合类的框架图。
Collection类概述
通过框架图,我们可以清楚的看到各个集合的层次关系。其中,Collection类是Set, List, Queue类的父接口。基本接口主要包括了:
接口 | 说明 |
---|---|
boolean add(E e) | 添加元素 |
boolean addAll(Collection<? extends E> c) | 添加另一个Collection的所有元素 |
boolean remove(Object o) | 移除元素 |
boolean removeAll(Collection<?> c) | 从列表中移除指定collection中包含的所有元素 |
void clear() | 清除所有元素 |
boolean contains(Object o) | 是否包含指定元素 |
boolean containsAll(Collection<?> c) | 是否包含指定collection中包含的所有元素 |
Object[] toArray() | 将集合转换为数组 |
Iterator<E> iterator() | 返回Iterator对象,用于遍历集合中的元素 |
Collection类继承了Iterable类。因此Collection类都可以通过Iterator接口或者是foreach循环来进行遍历。
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
...
}
Java集合类中迭代器—Iterator用来遍历Collection中的所有元素,其接口定义如下。
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
}
迭代器是一种设计模式,该模式提供一种方法来顺序访问一个集合对象中各个元素, 而又无须暴露该对象的内部表示。迭代器简化了集合类的访问,同时为集合类的遍历提供了统一的接口。Java中的Iterator功能比较简单,并且只能单向移动。
- 使用方法iterator()要求容器返回一个Iterator。
- 使用hasNext()检查序列中是否还有元素。
- 使用next()获得序列中的下一个元素。
- 可以使用remove()删除迭代器返回的元素。
Set接口
Set集合是一种不包括重复元素的Collection,无序,而判断两个对象是否相同则是根据equals方法,Set最多有一个null元素。需要注意的是,虽然Set中元素没有顺序,但是元素在set中的位置是由该元素的HashCode决定的,其具体位置其实是固定的。
List接口
List集合是一个包含了有序元素的Collection,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。所以与Set相比,List集合类增加了与索引位置相关的操作。
接口 | 说明 |
---|---|
void add(int index, E element) | 在指定的index位置添加元素 |
E set(int index, E element) | 设置指定的index位置的元素 |
int indexOf(Object o) | 返回指定元素第一次出现在列表中的索引位置,不存在则返回-1 |
int lastIndexOf(Object o) | 返回指定元素最后一次出现在列表中的索引位置,不存在则返回-1 |
boolean addAll(int index, Collection<? extends E> c) | 在指定的index位置插入制定集合中的多有元素 |
E remove(int index) | 移除指定位置的元素 |
List<E> subList(int fromIndex, int toIndex); | 返回指定索引范围内的子List |
Queue接口
Queue用于模拟队列这种数据结构,实现“FIFO”等数据结构。通常,队列不允许随机访问队列中的元素。
Map类概述
Map类以键值对(key-value)的形式存储元素,键值对是Map类的基本元素,一个映射不能包含重复的键,每个键最多只能映射一个值。Map类提供的基本接口主要有以下这些。
接口 | 说明 |
---|---|
V put(K key, V value) | 添加指定的key-value键值对 |
void putAll(Map<? extends K, ? extends V> m) | 添加指定的Map对象中所有键值对到当前Map |
V get(Object key) | 根据指定的key值获取Value值 |
V replace(K key, V value) | 替换指定key值对应的Vaule值 |
boolean replace(K key, V oldValue, V newValue) | 替换指定key值和value值对应的键值对的Vaule值 |
V remove(Object key) | 移除指定key值的键值对 |
boolean remove(Object key, Object value) | 移除指定key值和value值的键值对 |
void clear() | 清空Map,移除所有包含的价值的 |
boolean containsKey(Object key) | 是否包含指定key值的键值对 |
boolean containsValue(Object value) | 是否包含指定valus值的键值对 |
Set<K> keySet() | 以Set的形式返回所有的key值 |
Collection<V> values() | 以Collection的形式返回所有的value值 |
Set<Map.Entry<K, V>> entrySet() | 以Set的形式返回所有的键值对 |