Iterator类
对 collection 进行迭代的迭代器
提供的方法:
hasNext() 如果仍有元素可以迭代,则返回 true。
next() 返回迭代的下一个元素。
remove() 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
-
代码示例:
特别注意:
- 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 返回的最后一个元素(可选操作)。
代码效果展示:
-
正向迭代:
-
反向迭代:
特别说明:
- 参照 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()方法共存。
-
不能再循环中一直进行删除操作:
-
不能再循环中一直进行添加操作,不然会造成内存溢出!
-
在一个迭代器循环里,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恰恰相反;