说说集合系列(一):纲领

【引言】作为一个Java程序员,相信即使最初级的同学也听说过集合,集合有Collection和Map的区分,集合中有各种特性:比如是否有序,是否允许为空,是否可重复,等等;既然集合是如此的有趣和多样化,这里就结合源码好好的梳理一把,也将零碎的知识系统化。


开篇两张图

粗粒度结构图

注:根据JDK源码显示,Collection和Map是两个完全独立的接口,下图仅供参考,可以忽略二者之间的Produces虚线;或者也可以理解为从Map是可以生成Collection的(比如Map的keySet方法)。

细粒度结构图

注:感谢Github的zxiaofan同学对集合结构的整理和分享(建议用新标签页打开放大查看)

集合是什么?

  Java集合类存放于 java.util 包中,是一个用来存放对象的容器。

  1. 集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的。
  2. 集合存放的是多个对象的引用,对象本身还是放在堆内存中。
  3. 集合可以存放不同类型,不限数量的数据类型。

关于Collection

  Collection是最基本的集合接口之一,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行;一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。

关于Map

  Map接口储存一组成对的键-值对象,提供key(键)到value(值)的映射,Map中的key不要求有序,不允许重复。value同样不要求有序,但可以重复。最常见的Map实现类是HashMap,他的储存方式是哈希表,优点是查询指定元素效率高。
  Map接口提供了将键映射到集合的对象,一个映射不能包含重复的键.每个键最多只能映射到一个值.Map接口中同样提供了集合的常用方法,如clear()方法,isEmpty()方法,Size()方法等.

关于Iterator

  Iterator,译名一般称作迭代器,它是Java的Collection类集合的顶层接口(Map系列本身是不实现该接口的)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/* ......
* @see Collection
* @see ListIterator
* @see Iterable
* @since 1.2
*/
public interface Iterator<E> {

/**
* 是否还有下一个元素?
*/
boolean hasNext();

/**
* 返回下一个元素
*/
E next();

/**
* 移除迭代器当前对应的元素(不使用迭代器做remove的话,会出现Exception,可能是IllegalStateException、UnsupportedOperationException)
*/
default void remove() {
throw new UnsupportedOperationException("remove");
}

/**
* 类似于list的foreach操作,用于通过迭代器直接遍历元素的
* @since 1.8
*/
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}

Iterator和Iterable

  通过分析Collection的源码定义可以发现,Collection并未实现Iterator接口,而是继承了Iterable这个接口;那这二者有何区别呢?

1
public interface Collection<E> extends Iterable<E> {

  稍微往后看一看,你会发现Iterable的内部实现中,已经封装了 Iterator 的获取方法了;所以只要实现了Iterable接口的类,就可以很轻松的通过obj.iterator();获取到迭代器Iterator了。

1
2
3
4
5
6
7
public interface Iterable<T> {
/**
* Returns an iterator over elements of type {@code T}.
*
* @return an Iterator.
*/
Iterator<T> iterator();

------2019 Lin.C ------