Iterator类
对 collection 进行迭代的迭代器
-
提供的方法:
-
hasNext() 如果仍有元素可以迭代,则返回 true。
-
next() 返回迭代的下一个元素。
-
remove() 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
-
代码示例:
图片.png
特别注意:
- next()方法和remove()方法不能出现在同一个代码块里,不然会使集合变得不确定。
- remove()方法虽然可以直接移除点集合中的元素,但是如果如要用迭代器遍历删除之后的集合元素,必须重新使用.iterator() 再重新获取迭代器实例,不能用删除时的迭代器对象。
- 如果不用迭代器对集合进行循环遍历,是不能直接在循环中对集合进行增删操作的。
Collection类
该类是层次结构中的根接口,继承超级接口Iterable<E>类。此接口不提供任何直接实现,提供具体的子接口实现:如List和Set;

- Collection类提供的方法,这些方法适用于它的所有子类。
- add(E e) 添加一个元素,如果添加失败则返回false;
- addAll(Collection(? extends E) c) 添加一个集合,这里如果被添加的集合中的某些元素已经在要填加的集合里了,则不会重复添加。
- clear() 清除所有元素;
- contains(Object o) 如果此 collection 包含指定的元素,则返回 true。
- containsAll(Collection(? extends E) c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true。
- equals(Object o) 比较此 collection 与指定对象是否相等。
- isEmpty() 判断集合是否为空,是返回true;
- iterator() 返回一个迭代器。
- remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
- removeAll(Collection(? extends E) c) 移除两个集合中都包含的元素。
- retainAll(Collection(? extends E) c) 因保存两个集合都包含的元素。
- size() 返回集合的元素数量。
- toArray() 返回包含此 collection 中所有元素的数组。
List类
-
特点:
-
有序、可重复,可以精准的控制每一个元素的位置。
-
索引的下标是从0开始的
-
特殊的迭代器 ListIterator 允许元素插入和替换,以及双向访问,可以从指定位置获取迭代器。
-
在 iterator、add、remove、equals 和 hashCode 方法的协定上加了一些其他约定,超过了 Collection 接口中指定的约定。
-
提供的方法:
-
add(E e) 在列表的尾部添加一个元素
-
add(int index, E e) 在列表的指定位置添加一个元素
-
addAll(Collection<? extends E> c) 添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序(可选操作)。
-
addAll(int index, Collection<? extends E> c) 将指定 collection 中的所有元素都插入到列表中的指定位置。
-
get(int index) 获得列表指定位置上的元素
-
indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
-
lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
-
listIterator() 返回此列表元素的列表迭代器(按适当顺序)。
-
listIterator(int index) 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。
-
remove(Object o)从此列表中移除第一次出现的指定元素(如果存在)(可选操作)。
-
set(int index, E e) 用指定元素替换列表中指定位置的元素(可选操作)。
-
subList(int fromIndex, int toIndex)返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间数据组成的集合。
以上就是List类添加的或者相比Collection类的方法加了特殊限定的方法,有些和Collection类相同的方法,这里就没有列出来!
ListIterator<E>类
列表迭代器(继承 Iterator类),允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。
- 提供的方法:
- add(E e) 将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有),或者 previous 返回的下一个元素之后(如果有);如果列表没有元素,那么新元素就成为列表中的唯一元素。
- hasNext() 以正向遍历列表时,如果列表迭代器有多个元素,则返回 true。
- hasPrevious()如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。
- nextIndex() 返回对 next 的后续调用所返回元素的索引
- previousIndex() 返回对 previous 的后续调用所返回元素的索引。
- next() 返回列表中的下一个元素。
- previous() 返回列表中的前一个元素。
- remove() 从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。
- set(E e) 用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。
代码效果展示:
-
正向迭代:
图片.png
-
反向迭代:
QQ截图20170427193335.png
特别说明:
- 参照 Iterator类 的特别说明。
- 集合本身没有数据,那么hasNext()返回为false。
- ListIterator 没有当前元素;它的光标位置 始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。长度为 n 的列表的迭代器有 n+1 个可能的指针位置。
- 反向迭代获取迭代器的方式实在指定位置反向获取迭代器,所以获取的迭代器里的元素就是0,1,2,3,4集合中的前一半元素,正向则相反;
- 如果采取指定位置的方式获取迭代器,那么之后就一定要同样采取位置方式获取迭代器,不能再使用.listIterator()的方式获取;
- 如果要进行反向迭代,必须要采用listIterator(int index)的方式获取迭代器,其实这样做是为了将迭代器的下标移到指定位置,因为默认的迭代器的位置是在列表元素的前一个位置“-1”,如果不指定迭代器的下标,那么hasPrevious()返回一定是false,也就无法通过hasPrevious()进行遍历
- 错误写法集:
-
不能再循环next()方法或previous()不能和add()、remove()、set()方法共存。
图片.png
-
不能再循环中一直进行删除操作:
错误写法
错误原因
正确写法:避免在最后一个next 后调用remove()方法
-
不能再循环中一直进行添加操作,不然会造成内存溢出!
错误写法
正确写法
-
在一个迭代器循环里,set()方法、add()方法、remove()方法不能共存。
错误写法
ArrayList<E>
- 特点:
- 底层存储数据采用的是数组的形式,但是数组的大小是可变的,但是变化的细节并没有别指定,可以添加空值。
- 实现了List<E>接口,并且提供了一些可以操控自身存储数据列表的数组的大小的方法。
- 此类实现不是同步的,如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改)可以在创建的时候用Collections.synchronizedList方法将对象“包装起来”。
List list = Collections.synchronizedList(new ArrayList(...));
- 提供的方法:
- 构造方法:
- ArrayList() 构造一个初始化容量为10的空列表
- ArrayList(Collection<? extends E> c) 构造一个包含指定 collection 的元素的列表,
- ArrayList(int initialCapacity) 构造一个具有指定初始容量的空列表。
- 方法摘要:List接口提供的方法同样适,这里就不重复列出
- clone() 返回此 ArrayList 实例的浅表副本。返回类型是Object类型
- ensureCapacity(int minCapacity) 增加列表实例的数量大小。
- removeRange(int fromIndex, int toIndex) 移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。
- trimToSize() 将此 ArrayList 实例的容量调整为列表的当前大小。
LinkedList<E>类
- 特点:
- List接口的链接列表的实现,允许null元素。
- 为列表的结构操作提供了很多的操作方法,方便插入删除操作!
- 此类实现不是同步的,如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改)可以在创建的时候用Collections.synchronizedList方法将对象“包装起来”。
List list = Collections.synchronizedList(new ArrayList(...));
-
方法:
-
构造方法:
-
LinkedList() 构造一个空的列表
-
LinkedList() 构造一个包含指定 collection 中的元素的列表。
-
方法摘要:
-
addFirst(E e) 在列表的头部插入指定元素
-
addLast(E e) 在列表的结尾插入指定的元素
-
clone() 返回此 ArrayList 实例的浅表副本。返回类型是Object类型
-
descendingIterator() 返回以逆向顺序在此双端队列的元素上进行迭代的迭代器。
-
element() 获取但不移除此列表的头(第一个元素)。
-
getFrist() 返回此列表的第一个元素。
-
getLast() 返回此列表的最后一个元素。
-
listIterator() 返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始。
-
offer(E e) 将指定元素添加到此列表的结尾
-
offerFirst(E e) 在此列表的开头插入指定的元素。
-
offerLast(E e) 在此列表末尾插入指定的元素。
-
peek() 获取但不移除此列表的头(第一个元素)。
-
peekFirst() 获取但不移除列表的第一个元素,如果列表为空,则返回null;
-
peekLast() 获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。
-
poll() 获取并移除列表的第一个元素
-
pollFirst() 获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
-
pollLast() 获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。
-
pop()从此列表所表示的堆栈处弹出一个元素。等同于removeFirst(),如果列表为空则抛出异常。
-
push(E e) 将元素推入此列表所表示的堆栈。等同于addFirst(E e)
-
remove() 获取并移除此列表的头(第一个元素)。
-
removeFirst() 移除并返回此列表的第一个元素。
-
removeFirstOccurrence(Object o) 从此列表中移除第一次出现的指定元素(从头部到尾部遍历列表时)。
-
removeLast() 移除并返回此列表的最后一个元素。
-
removeLastOccurrence(Object o) 从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表时)。
-
代码实例:
简单方法
ArrayList和LinkedList的区别:
Type | Get | Iteration |Insert |Remove
----|------|----
ArrayList | 110 | 490 |3790 |8730
LinkedList | 1980 | 220 |110 |110
从上表中可以看到ArrayList善于访问数据,不善于插入和删除,而LinkedList恰恰相反;
网友评论