两万字长文读懂 Java 集合( 二 )


两万字长文读懂 Java 集合

文章插图
翻译成代码,就和一开始的 Iterator 迭代器遍历方式基本相同了 。
 Iterator iter = list.iterator;while (iter.hasNext) {Integer num = iter.next;System.out.println(num);}
还有更深层次的探讨:为什么要设计两个接口 Iterable 和 Iterator,而不是保留其中一个就可以了 。
简单讲解:Iterator 的保留可以让子类去实现自己的迭代器,而 Iterable 接口更加关注于 for-each 的增强语法 。具体可参考:Java 中的 Iterable 与 Iterator 详解
关于 Iterator 和 Iterable 的讲解告一段落,下面来总结一下它们的重点:
  1. Iterator 是提供集合操作内部对象的一个迭代器,它可以遍历、移除对象,且只能够单向移动 。
  2. Iterable 是对 Iterator 的封装,在 JDK 1.8 时,实现了 Iterable 接口的集合可以使用增强 for 循环遍历集合对象,我们通过反编译后发现底层还是使用 Iterator 迭代器进行遍历 。
等等,这一章还没完,还有一个 ListIterator 。它继承 Iterator 接口,在遍历List 集合时可以从任意索引下标开始遍历,而且支持双向遍历 。
ListIterator 存在于 List 集合之中,通过调用方法可以返回起始下标为 index的迭代器:
 List<Integer> list = new ArrayList<>;// 返回下标为0的迭代器ListIterator<Integer> listIter1 = list.listIterator;// 返回下标为5的迭代器ListIterator<Integer> listIter2 = list.listIterator(5);ListIterator 中有几个重要方法,大多数方法与 Iterator 中定义的含义相同,但是比 Iterator 强大的地方是可以在任意一个下标位置返回该迭代器,且可以实现双向遍历 。
public interface ListIterator<E> extends Iterator<E> {booleanhasNext;E next;booleanhasPrevious;E previous;intnextIndex;intpreviousIndex;voidremove;// 替换当前下标的元素,即访问过的最后一个元素voidset(E e);voidadd(E e);}Map 和 Collection 接口
Map 接口和 Collection 接口是集合框架体系的两大门派,Collection 是存储元素本身,而 Map 是存储 <key, value> 键值对,在 Collection 门派下有一小部分弟子去偷师,利用 Map 门派下的弟子来修炼自己 。
是不是听的一头雾水哈哈哈,举个例子你就懂了:HashSet 底层利用了HashMa,TreeSet底层用了TreeMap,LinkedHashSet底层用了LinkedHashMap 。
下面我会详细讲到各个具体集合类哦,所以在这里,我们先从整体上了解这两个门派的特点和区别 。
两万字长文读懂 Java 集合

文章插图
Map 接口定义了存储的数据结构是 < key, value> 形式,根据 key 映射到 value,一个 key 对应一个 value,所以 key 不可重复,而 value 可重复 。
在 Map 接口下会将存储的方式细分为不同的种类:
  • SortedMap 接口:该类映射可以对 <key, value> 按照自己的规则进行排序,具体实现有 TreeMap
  • AbsractMap:它为子类提供好一些通用的 API 实现,所有的具体 Map 如 HashMap 都会继承它
而 Collection 接口提供了所有集合的通用方法(注意这里不包括 Map ):
  • 添加方法:add(E e) / addAll(Collection<? extends E> var1)
  • 删除方法:remove(Object var1) / removeAll(Collection<?> var1)
  • 查找方法:contains(Object var1) / containsAll(Collection<?> var1);
  • 查询集合自身信息:size / isEmpty
  • ···
在 Collection 接口下,同样会将集合细分为不同的种类:
  • Set 接口:一个不允许存储重复元素的无序集合,具体实现有 HashSet / TreeSet···
  • List 接口:一个可存储重复元素的有序集合,具体实现有 ArrayList / LinkedList···
  • Queue 接口:一个可存储重复元素的队列,具体实现有 PriorityQueue / ArrayDeque···

两万字长文读懂 Java 集合

文章插图
Map 集合体系详解
Map 接口是由 <key, value> 组成的集合,由key映射到唯一的 value,所以Map 不能包含重复的 key,每个键至多映射一个值 。下图是整个 Map 集合体系的主要组成部分,我将会按照日常使用频率从高到低一一讲解 。
不得不提的是 Map 的设计理念:定位元素的时间复杂度优化到 O(1) 。
Map 体系下主要分为 AbstractMap 和 SortedMap两类集合 。
AbstractMap 是对 Map 接口的扩展,它定义了普通的 Map 集合具有的通用行为,可以避免子类重复编写大量相同的代码,子类继承 AbstractMap 后可以重写它的方法,实现额外的逻辑,对外提供更多的功能 。


推荐阅读