Java 的集合框架大致分为 Collection 和 Map 两种,两者区别:
Collection 是单元素集合;Map 是双元素键值对集合;Collection 中只有 Set 系列要求元素唯一;Map 中要求键唯一,值可以重复;Collection 的数据结构是针对元素的;Map 的数据结构是针对键的。i 标识的是 Collection 派生出的子接口,c 标识是实现类。
Collection 接口是 Set、List 和 Queue 接口的父接口,该接口定义的方法既可以用于操作 Set 集合,也可用于操作 List 和 Queue 集合。
//向集合添加一个元素,成功返回true boolean add(E e); //把集合c的全部元素添加入指定集合,成功返回true boolean addAll(Collection<E> c); //删除集合中指定元素o,当集合中包含一个或多个元素o时,只删除第一个 boolean remove(E o); //从集合中删除集合c里包含的所有元素(相当于调用该集合减集合c) boolean removeAll(Collection<E> c); //集合里是否包含指定元素 boolean contains(E o); //集合里是否包含集合c里的所有元素 boolean containsAll(Collection<E> c); //返回集合里元素的个数 int size(); //清除集合里的所有元素,将集合长度变为0 void clear(); //返回Iterator对象,用于遍历集合中的元素 Iterator<E> iterator(); //从集合中删除集合c里不包含的元素(相当于取该集合和集合c的交集) boolean retainAll(Collection<E> c); //该方法把集合转换成一个数组,所有集合元素变成数组元素,一般不推荐使用这个方法 Object[] toArray(); //该方法把集合转换成一个数组,传入的参数一般为类型为 T 长度为 0 的空数组,推荐使用 //例如:Integer[] newText = c.toArray(new Integer[0]); <T> T[] toArray(T[] a); //该方法是Java 8为Map新增的一个遍历key-value对的方法,使用Lambda表达式 void forEach(BiConsumer action); //Java 8新增,将集合转换为Stream流 void forEach(Consumer<? super T> action)Set 作为 Collection 接口的子接口,可以使用 Collection 接口里的全部方法。
注意:vector 和 Stack 过于古老,性能不佳,不推荐使用。栈操作一般使用 ArrayDeque 来代替。
List 作为 Collection 接口的子接口,可以使用 Collection 接口里的全部方法。另外,由于 List 是有序集合,所以添加了根据索引来插入、替换和删除集合元素的方法。
//将元素 element 添加到 List 集合索引 index 处,原 index 及后续的元素往后移动 void add(int index, E element); //将 Collection 集合中的所有元素插入到 List 集合的 index 处。 boolean addAll(int index, Collection<? extends E> c); //删除并返回 index 索引处的元素 E remove(int index); //返回索引 index 处的元素。 E get(int index); //将位置索引为 index 的元素,替换为 element。 E set(int index, E element); //返回元素 o 在 list 集合中第一次出现的位置索引。 int indexOf(E o); //返回元素 o 在 List 集合中最后一次出现的位置索引。 int lastIndexOf(E o); //返回 List 集合中从索引fromIndex (包含)到索引 toIndex(不包含)之间的所有元素。 List<E> subList(int fromIndex, int toIndex); //Java 8新增根据 operator 指定的计算规则来重新设置 List 集合的所有元素。 void replaceAll(UnaryOperator<E> operator); //Java 8新增根据 Comparator 参数对 List 集合的元素排序。 void sort(Comparator<? super E> c);Queue 作为 Collection 接口的子接口,可以使用 Collection 接口里的全部方法。另外,由于 Queue 是队列集合,所以添加了根据队列特性来插入、替换和删除集合元素的方法。
//将指定元素插入到队列的尾部。 boolean add(E e); //获取队列头部的元素,并删除该元素。 E remove(); //获取队列头部的元素,但是不删除该元素。 E element(); //将指定的元素插入此队列的尾部。当使用容量有限的队列时,此方法通常比add(Object e)有效。 boolean offer(E e); //返回队列头部的元素,并删除该元素。如果队列为空,则返回null。 E poll(); //返回队列头部的元素,但是不删除该元素。如果队列为空,则返回null。 E peek();Deque 是 Queue 接口的子接口,它是一个双端队列,既可以当队列用,也可以当栈用。如果 Deque 当做常规的队列用使用,最左端(如果以数组存储,就是第一个元素)是队头,最右端是队尾;当成常规的栈用,最左端是栈顶,最右端是栈底。Deque 根据双端队列的特性也定义了一些方法:
//将指定元素添加到双端队列的头部。 void addFirst(E e); //将指定元素添加到双端队列的尾部。 void addLast(E e); //将指定元素添加到双端队列的头部。 boolean offerFirst(E e); //将指定元素添加到双端队列的尾部。 boolean offerLast(E e); //获取但不删除双端队列的第一个元素(头)。 E getFirst(); //获取但不删除双端队列的最后一个元素(尾)。 E getLast(); //获取但不删除双端队列的第一个元素;如果双端队列为空,则返回null。 E peekFirst(); //获取但不删除双端队列的最后一个元素;如果双端队列为空,则返回null。 E PeekLast(); //获取并删除双端队列的第一个元素;如果双端队列为空,则返回null。 E pollFirst(); //获取并删除双端队列的最后一个元素;如果双端队列为空,则返回null。 E pollLast(); //获取并删除该双端队列的第一个元素。 E removeFirst(); //获取并删除该双端队列的最后一个元素o。 E removeLast(); //pop出该双端队列所表示的栈的栈顶元素。相当于removeFirst()。 E pop(); //(栈方法) //将一个元素push进该双端队列所表示的栈的栈顶。相当于addFirst()。 void push(E e); //(栈方法): Deque 的方法与 Queue 的方法对比 Queue 的方法Deque 的方法add(e)/offer(e)addLast(e)/offerLast(e)remove()/poll()removeFirst()/pollFirst()element()/peek()getFirst()/peekFirst()Deque 也可以直接使用 offer(e) 和 poll() 方法实现入队和出队,用 peek() 访问队头,
Deque 的方法与 Stack 的方法对比 Stack 的方法Deque 的方法push(e)addFirst(e)/offerFirst(e)pop()removeFirst()/pollFirst()peek()getFirst()/peekFirst()Deque 也可以直接使用 push(e) 和 pop() 方法实现入栈和出栈,用 peek() 访问栈顶。
i 标识的是 map 派生出的子接口,c 标识是实现类。
TreeMap:基于红黑树实现。HashMap:基于哈希表实现。LinkedHashMap:是 HashMap 的子类,在 HashMap 基础上使用双向链表维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。
HashTable:和 HashMap 类似,是线程安全的。
注意:HashTable 是一个古来的遗留类,不应该去使用它。现在可以使用 ConcurrentHashMap 来支持线程安全,并且 ConcurrentHashMap 的效率会更高,因为 ConcurrentHashMap 引入了分段锁。
Map 中包含一个内部类 Map.Entry<K, V>,该类用来封装 key-value 对。Map 接口的 entrySet() 方法返回所有 Map.Entry 所组成的 Set 集合。该类方法如下:
//返回该Entry里包含的key值 K getKey(); //返回该Entry里包含的value值 V getValue(); //设置该Entry里包含的value值,并返回新设置的value值 V setValue(V value);转载于:https://www.cnblogs.com/zongmin/p/11350844.html