Iterator
- Iterator专门为遍历集合而生,集合没有提供专门遍历的方法。
- Iterator实际上是迭代器设计模式的实现。
- Iterator的常用方法:
1.boolean hasNext():判断是否存在另一个可访问的元素。
2.Object next():返回要访问的下一个元素。
3.void remove():删除上次访问返回的对象。 - 哪些集合可以使用Iterator遍历:
1.层次1:Collection、List、Set可以,Map不可以。
2.层次2:提供iterator()方法的就可以将元素交给Iterator。
3.层次3:实现Iterator接口的集合类都可以使用迭代器遍历。 - for-each循环和Iterator的联系:
1.for-each循环遍历集合时,底层使用的是Iterator。
2.凡是可以使用for-each循环遍历的,也可以使用Iterator遍历。 - for-each循环和Iterator的区别:
1.for-each还能遍历数组,Iterator只能遍历集合。
2.使用for-each循环遍历集合元素时,不能删除元素,会抛出异常ConcurrentModificationException;使用Iterator遍历集合时能删除元素。 - Iterator是一个接口,它的实现类在哪里?
在相应的集合实现类中,比如ArrayList中存在一个内部Itr implemens Iterator - 为什么Iterator不设计成一个类,而是一个接口?
不同的集合类,底层接口不同,迭代的方式不同,所以提供一个接口,让相应的实现类来实现。
package com.bjsxt.iterator;
import java.util.ArrayList;
import java.util.Iterator;
public class TestIterator {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("JavaSE");
list.add("JavaEE");
list.add("MySQL");
System.out.println(list);
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String elem= it.next();
if ("JavaSE".equals(elem)) {
it.remove();
}
}
System.out.println(list);
}
}
- Iterator到底是怎么工作的?
不同集合的遍历有Iterator的不同的实现类完成,以Iterator遍历ArrayList为例进行说明:
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor;
int lastRet = -1;
public boolean hasNext() {
return cursor != size;
}
public E next() {
int i = cursor;
Object[] elementData = ArrayList.this.elementData;
cursor = i + 1;
return (E) elementData[lastRet = i];
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ae24e1948ec569a61d209c53a3ee9662.png)
ListIterator
- ListIterator和Iterator的关系:
1.public interface ListIterator<> extends Iterator<>
2.都可以遍历List - ListIterator和Iterator的区别:
1.使用范围不同:
(1)Iterator可以应用更多集合,Set、List和这些集合的子类型。
(2)ListIterator只能用于List及其子类型。
2.遍历顺序不同:
(1)Iterator只能从前往后遍历,而ListIterator还可以逆序向前遍历。
(2)Iterator可以在遍历的过程中remove();ListIterator可以在遍历的过程中remove()、add()、set()。
3.ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
package com.bjsxt.iterator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
public class TestListIterator {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("JavaSE");
list.add("JavaEE");
list.add("MySQL");
ListIterator<String> it = list.listIterator();
while (it.hasNext()) {
String elem = it.next();
System.out.println(elem+" "+it.nextIndex()+" "+it.previousIndex());
}
System.out.println("===========================================");
while (it.hasPrevious()) {
String elem=it.previous();
System.out.println(elem+" "+it.nextIndex()+" "+it.previousIndex());
}
}
}
Collections工具类
- 关于集合操作的工具类,好比Arrays,Math。
- 唯一的构造方法private,不允许在类的外部创建对象。
- 提供了大量的static方法,可以通过类名直接调用。
示例:使用Collections简化集合操作
package com.bjsxt.collections;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestCollections {
public static void main(String[] args) {
List<Integer> list = new ArrayList();
List<Integer> list1 = new ArrayList();
System.out.println(list);
Collections.addAll(list, 32, 22, 55, 66);
System.out.println(list);
Collections.sort(list);
System.out.println(list);
int index = Collections.binarySearch(list, 32);
System.out.println(index);
int max = Collections.max(list);
int min = Collections.min(list);
System.out.println(max+" "+min);
System.out.println(list);
Collections.addAll(list1, 2, 3, 4, 5,6,7,8);
System.out.println(list1);
Collections.copy(list1,list);
System.out.println(list1);
}
}