详解 Java Collection

Collection 是Java数据结构接口最重要的接口之一。我们常用的数据结构 List, Set 和 Queue 都是继承自这个接口的。以下内容均参考 openjdk11 的源码

1 Collection 接口的关系图.

image.png
Collection继承自顶级接口 Iterable。 其下主要有三员大将 Set List 和 Queue.

2 接口详解

2.1 Iterable

实现Iterable接口的类,其对象就可以作为 for-each 循环的作用目标。
首先我们随便写一个类, 使用这个类实现 Iterable 接口

import java.util.Iterator; public class Person implements Iterable<Object> { private String name; private String address; private Integer age; public Person(String name, String address, Integer age) { this.name = name; this.address = address; this.age = age; } @Override public Iterator<Object> iterator() { return new Iterator<Object>() { private int index = 0; @Override public boolean hasNext() { return index < 3; } @Override public Object next() { Object obj = null; if (index == 0) obj = name; if (index == 1) obj = address; if (index == 2) obj = age; index ++; return obj; } }; }

然后把这个类作为for-each循环的作用对象

Person person = new Person("小明", "中国台湾", 25); for (Object object: person) { System.out.println(object); } // 以上代码跟直接调用 Iterable 接口的默认方法 forEach(Consumer<Object>)效果是一样的 // Consumer 是函数式接口 有空细说, 只有accept()一个抽象方法 person.forEach(System.out::println);

输出
image.png
你甚至可以对Iterable做毫无意义的实现,修改iterator()方法, 再运行上面的代码就会打印1-100了

@Override public Iterator<Object> iterator() { return new Iterator<Object>() { private int index = 0; @Override public boolean hasNext() { return index < 100; } @Override public Object next() { Object obj = index; index ++; return obj; } }; }

2.2 Collection

  • int size() 返回容器内包含的元素总数,若总数比Integer.MAX_VALUE最大值还大,则返回 Integer.MAX_VALUE
  • boolean isEmpty() 容器内没有元素,返回true,否则返回false
  • boolean contains(Object o) 容器中包含该元素返回true, 否则返回false
  • Object[] toArray() 返回一个包含容器中所有元素的数组,元素的数组应该与迭代器有相同的顺序,并且应该返回一个安全的数组,即不能有相同的引用(因为一旦用了引用,修改数组元素相当于修改容器内的元素)
  • T[] toArray(T[] a) 返回一个包含容器中所有元素的数组,必须是安全的。当输入的数组长度大于容器的size时,使用null填充,当输入的数组小于容器size时,重新构建一个长度为size的数组。
  • boolean add(E e) 向容器中添加一个元素,添加成功则返回true,否则返回false
  • boolean remove(Object o) 移除元素 o, 移除成功返回ture,否则返回false
  • boolean addAll(Collection< ? extends E> c) 将容器c中的所有元素添加到容器中,如果 容器因此发生改变,返回true
  • removeAll(Collection<?> c) 移除容器中所有包含在容器c中元素,如果容器因此发生改变,返回true
  • retainAll(Collection<?> c) 只保留容器c中存在的元素,相当于并集
  • void clear() 移除容器内所有元素

2.3 List

2.3.1 List的特征

  • 有序
  • 可重复
  • 可按位置索引
  • 可在指定位置插入新元素

2.3.2 List的接口

继承自Collection的接口就不说了

  • boolean addAll(int index, Collection<? extends E> c) 将容器c中的所有元素从指定位置插入,位于index及其后面的元素通通后移
  • void sort(Comparator<? super E> c) 对容器内的元素进行排序
  • E get(int index) 返回指定位置的元素
  • E set(int index, E element) 将指定位置的元素替换并返回该元素
  • void add(int index, E element) 在指定位置插入元素,并将原来的元素及其后面的兄弟全部后移
  • E remove(int index) 移除并返回指定位置的元素,将后面的元素前移
  • int indexOf(Object o) 返回匹配o的第一个元素的位置,如果没有匹配的元素,返回 -1
  • int lastIndexOf(Object o) 返回匹配o的最后一个元素的位置,如果没有匹配的元素,返回 -1
  • List subList(int fromIndex, int toIndex) 返回List的一个子集

2.4 Set

  • 无序
  • 不可重复
  • 最多只能有一个null值
  • 不可按位置索引
  • 没有新增的接口,全部继承自 Collection

2.5 Queue

Queue 被定义为一组待处理的元素, 并且定义了元素被处理的优先级。
常见的规则:

  • FIFO 先进先出
  • LILO 后进先出

接口

boolean offer(E e) 添加一个元素
E remove() 移除并返回head元素, 如果queue为空,抛出 NoSuchElementException 异常
E poll() 移除并返回head元素, 如果queue为空,返回null
E element() 返回head元素但不移除,如果queue为空,抛出 NoSuchElementException 异常
E peek() 返回head元素但不移除,如果queue为空,返回null

3 总结

  • 由于Collection继承自Iterable,所有继承自Collection的接口都可以使用for-each循环
  • List 有序可重复, Set无序去重
  • Queue持有访问顺序规则
阅读(52)
评论(0)
updated@2020-10-23
评论区
目录