定义:Java 作为面向对象语言,对象的操作必比然是重中之重。要操作一个对象容易,如果需要存储多个对象,则需要一个容器,存储多个对象可以使用数组,但是数组的长度是不可变的。所以有了集合的概念。Collection 集合,就是为了方便操作处理对象而诞生的。
本文基于 JDK 1.8 版本
Collection :来源与 Java.util 包,先看看 Collection 的全家福类图
Collection 可以主要分为 set、List 、Queue 三种类型。这里 Map 是不属于 Collection 的,Map 是一个独立的数据结构。但是 Collention 又和 Map 的实现上又户型依赖。先说说 Collection 。
Collection 是一个的接口,是高度抽象出来的集合,包含了集合的基本操作和属性
红色框是Collection的基本方法(removeif 是1.8 出现的方法),蓝色框是 JDK 8后添加的新方法。
一、Collection 基本方法Collection基本方法:
1、添加方法 boolean add(Object obj) : 添加一个对象 boolean addAll(Collection c) : 添加一个集合的对象 2、删除方法 void clear() 移除所有对象 boolean remove(Object) 移除一个对象 boolean removeAll(Collection c) 移除一个集合的对象,只要有一个对象移除了,就返回true 3、判断方法 boolean contains(Object o) 判断集合是否包含该对象 boolean containsAll(Collection c) 判断集合中是否包含指定的集合对象,只有包含所有的对象,才返回 true。 boolean isEmpty() 判断集合是否为空。 4、获取方法 Iterator<E> iterator() 迭代器 5、长度功能 int size() 对象个数 6.交集功能 boolean retainAll(Collection c) 移除此 Collection 中未包含在指定Collection 中的所有对象,简单说就是,集合 1 和集合 2 进行对比,最终结果保存在集合 1 ,返回值表示的是 A是否发生变化。 Java 8 新方法: boolean removeif(Predicate filter) 按照一定规则过滤集合中的对象。Predicate 用于判断对象是否符合某个条件,例: public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("123"); list.add("12"); list.add("1"); list.removeIf(s -> s.equals("123")); list.forEach(s -> System.out.println(s)); } 二、迭代器(Iterator)在说迭代器之前先说说 Collection 继承的 Iterable 这个接口
解释一下这个 Iterable 是啥
如果一个集合对象要表明自己支持迭代,可以使用foreach语句的特权,就必须实现Iterable接口,表明这个集合对象是可迭代的!然而实现Iterable接口,就必需为foreach语句提供一个迭代器来进行 foreach 操作。
也就是 迭代器(Iterator),所以 Iterable 接口要有 Iterator() 这个方法返回一个实现了 Iterator 迭代器接口的对象。
那为什么要用这个接口而不直接实现 Iterator 接口呢?我们带着疑问去看看!
另外提一下 spliterator 方法,返回一个 spliterator 接口。叫做可分割迭代器(splitable iterator),Spliterator就是为了并行遍历元素而设计的一个迭代器,jdk1.8中的集合框架中的数据结构都默认实现了spliterator。这里只做一个简单的介绍。
带着疑问首先来看看 List 接口的 源代码
可以看到 List 接口也有 Iterator 方法,下面我们看看 List 集合的实现类ArrayList
看到这里,可以解释为什么 Collection 不直接实现 Iterator 接口了:
List 集合族 与 Set 集合族 ,都是实现了 Iterable 接口 ,但都不是直接实现 Iterator 接口,为什么要这样做?
因为在 Iterator 接口的核心方法 next()或者 hasNext ()都是依赖于迭代器当前的迭代的位置。
如果 Collection 实现了 Iterator 接口,肯定会导致集合对象中包含当前迭代位置的数据(指针)。
当集合在不同方法间被传递的时候,由于当前迭代的位置是不可以预置。那么 next 方法的结果会变成不可预知。
这样看使用 Iterable 接口就不会有这样问题,每一次调用都是返回一个新的迭代器。迭代器之间是互不干扰的。
看上图 ArrayList 的 Iterator()方法就很直观了。