本篇文章主要说明Java中一些常见的集合框架及经常用到的一些方法 , 由于都是一些父类 , 所以没有做太深入的分析说明 , 后面的文章将会分别对List , Set , Map及其常用子类进行深入研究分析
Collection类图
Collection
集合层次结构中的根接口 , 一个集合表示一组对象 , 称其为一组元素 , 一些集合允许元素重复 , 一些集合不允许元素重复 , JDK不提供任何此接口具体的实现 , 而是提供了更多的子接口如Set , List , 希望具有更大的通用性
Collection相关方法
// 向集合添加元素e,若指定集合元素改变了则返回true boolean add(E e); // 把集合C中的元素全部添加到集合中,若指定集合元素改变返回true boolean addAll(Collection<? extends E> c) // 清空所有集合元素 void clear(); // 判断指定集合是否包含对象 boolean contains(Object o); // 判断指定集合是否包含集合c的所有元素 boolean containsAll(Collection<?> c); // 判断指定集合的元素size是否为0 boolean isEmpty(); // 删除集合中的元素对象o,若集合有多个o元素,则只会删除第一个元素 boolean remove(Object o); // 删除指定集合包含集合c的元素 boolean removeAll(Collection<?> c); // 从指定集合中保留包含集合c的元素,其他元素则删除 boolean retainAll(Collection<?> c); // 集合的元素个数 int size(); // 将集合转换为T类型的数组 T[] toArray(T[] a)
List
有序集合 , 这个接口的使用者可以更加精确的控制每个元素在列表中插入的位置 , 并且可以通过整数索引(列表中的位置)访问元素 , 它和Set不同 , 通常允许元素重读并且是有序的
List相关方法
// 向列表的尾部追加指定的元素 boolean add(E o); // 在列表的指定位置插入指定元素 void add(int index,E element); // 将指定collection中的所有元素都插入到列表中 boolean addAll(Collection<? extends E> c); // 将指定collection中的所有元素都插入到列表中的指定位置 boolean addAll(int index,Collection<? extends E> c); // 从列表中移除所有元素 void clear(); // 如果列表包含指定的元素,则返回true boolean contains(Object o); // 如果列表包含指定collection的所有元素,则返回true boolean containsAll(Collection<?> c); // 比较指定的对象与列表是否相等 boolean equals(Object c); // 返回列表中指定位置的元素 E get(int index); // 返回列表的哈希码值 int hashCode(); // 返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回-1 int indexOf(Object o); // 判断集合是否为空 如果为空 则返回true,否则返回false boolean isEmpty(); // 返回以正确顺序在列表的元素上进行迭代的迭代器 Iterator<E> iterator(); // 返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回-1 int lastIndexOf(Object o); // 返回列表中元素的列表迭代器(以正确的顺序) ListIterator<E> listIterator(); // 返回列表中元素的列表迭代器(以正确的顺序),从列表的指定位置开始 ListIterator<E> listIterator(int index); // 移除列表中指定位置的元素 E remove(int index); // 移除列表中出现的首个指定元素 boolean remove(Object o); // 从列表中移除指定collection中包含的所有元素 boolean removeAll(Collection<?> c); // 仅在列表中保留指定collection中所包含的元素 boolean retainAll(Collection<?> c); // 用指定元素替换列表中指定位置的元素 E set(int index,E element); // 返回列表中的元素数。 int size(); // 返回列表中指定的formIndex(包括) 和toIndex(不包括)之间的部分视图 List<E> subList(int forIndex,int toIndex); // 返回以正确顺序包含列表中的所有元素的数组 Object toArray();
Set
不包含重复元素的无序集合 , 并且集合中最多只有一个空元素的集合
Set集合常用方法
// 如果 set 中尚未存在指定的元素,则添加此元素(可选操作)。 boolean add(E e); // 如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中(可选操作)。 boolean addAll(Collection<? extends E> c); // 移除此 set 中的所有元素(可选操作)。 void clear(); // 如果 set 包含指定的元素,则返回 true。 boolean contains(Object o); // 如果此 set 包含指定 collection 的所有元素,则返回 true。 boolean containsAll(Collection<?> c); // 比较指定对象与此 set 的相等性。 boolean equals(Object o); // 返回 set 的哈希码值。 int hashCode(); // 如果 set 不包含元素,则返回 true。 boolean isEmpty(); // 返回在此 set 中的元素上进行迭代的迭代器。 Iterator<E> iterator(); // 如果 set 中存在指定的元素,则将其移除(可选操作)。 boolean remove(Object o); // 移除 set 中那些包含在指定 collection 中的元素(可选操作)。 boolean removeAll(Collection<?> c); // 仅保留 set 中那些包含在指定 collection 中的元素(可选操作)。 boolean retainAll(Collection<?> c); // 返回 set 中的元素数(其容量)。 int size(); // 返回一个包含 set 中所有元素的数组。 Object[] toArray(); // 返回一个包含此 set 中所有元素的数组;返回数组的运行时类型是指定数组的类型。 <T> T[]toArray(T[] a);
Iterator
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
Iterator常用方法
// 如果仍有元素可以迭代则返回true boolean hasNext(); // 返回的迭代的下一个元素 E next(); // 从迭代器指向的collection中移除迭代器返回的最后一个元素 void remove();
demo使用示例
public class IteratorDemo { public static void main(String[] args) { List<Object> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { list.add(i); } Iterator<Object> iterator = list.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); iterator.remove(); } System.out.println(list); } }
Map
Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象。其中,键对象不允许重复,而值对象可以重复,并且值对象还可以是 Map 类型的,就像数组中的元素还可以是数组一样。
Map常用方法
// 向集合中添加元素。 V put(K key, V value); // 通过指定key获取value。 V get(Object key); // 获取集合中元素的个数。 int size(); // 清空集合,元素个数变为0。 void clear(); // 判断集合元素个数是否为0。 boolean isEmpty(); // 判断集合中是否包含指定key。 boolean containsKey(Object key); // 判断集合中是否包含指定value。 boolean containsValue(Object value); // 获取集合中所有的key,返回一个包含所有key元素的Set集合。 Set<泛型> keySet(); // 获取集合中所有的value,返回一个包含所有value元素的Collection集合。 Collection values(); // 删除指定key的键值对。 V remove(Object key); // 修改键值对<key, oldValue>的value为newValue。 default boolean replace(K key, V oldValue, V newValue); // 将Map集合转换成Set集合。 Set<Map.Entry<K,V>> entrySet();
分别辩解
Collection:Collection是一个父接口,List和Set是继承自他的子接口,Collection是最基本的集合接口,Java SDK中不提供直接继承,自Collection的类,而是提供继承自他子接口的类,如List和Set。所用的Collection类都支持一个Iterator()方法来遍历。
List:List接口是有序的,会精确的将元素插入到指定的位置,和下面的Set接口不同,List接口允许有相同元素
ArrayList:实现可变大小的数组,允许所有的元素,不是同步的,也就是没有同步方法
LinkList:允许null元素,通常在首部或者尾部操作,所以常被使用作堆栈(stack)、队列(queue)和双向队列(deque)
Vector:类似于ArrayList,但Vector是同步的,Stack继承自Vector
Set:是一种不包含重复元素的Collection接口
HashSet:不能有重复元素,底层是使用HashMap来实现的
Map:此接口实现了Key到Value的映射,一个Map中不能包含相同的Key,每个Key只能映射一个Value
HashTable:实现了一个Key-Value的哈希表,每一个非null元素都可作为Key或者Value,同时HashTable也是线程安全的
HashMap:和HashTable的不同之处是,不是线程安全的,且允许null元素的存在