Iterator
Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 List、Set等框架集合
对框架结合进行迭代的类,称其为迭代器
迭代器是专门取出集合元素的对象,但该对象不能直接创建对象(通过new),该对象是以内部类的形式存在于每个集合类的内部,通过方法进行调用
// Iterator, 通过key获取value,先取出所有key的集合
Set keys = map.keySet();
//获取Iterator对象
Iterator it = keys.iterator();
while (it.hasNext()) {
//取出key
String key = (String) it.next();
//根据key取出对应的值
Student stu = (Student) map.get(key);
System.out.println(key + "\t" + stu.getName());
}
// 同时获取key和value
Iterator iterMap = map.entrySet().iterator();
while (iterMap.hasNext()) {
Map.Entry strMap = (Map.Entry) iterMap.next();
System.out.println("key为:" + strMap.getKey() +
", value为:" + strMap.getValue());
}
For 和 Iterator
for 迭代元素简单,iterator 迭代起来稍微复杂,但删除元素时,Iterator 更有优势
由于迭代器的 remove 操作删除的是最近一次由next操作获取的元素,而不是当前游标所指向的元素,因此 for在迭代时,不能删除元素,而 Iterator 可以
public class TestDelete {
public static void main(String[] args) {
List<String> nameList = new ArrayList<>();
nameList.add("tom");
nameList.add("jerry");
nameList.add("kitty");
nameList.add("kitty");
printList(nameList);
// 删除集合中所有的kitty
remove2(nameList, "kitty");
printList(nameList);
}
public static void printList(List<String> nameList) {
for (String s : nameList) {
System.out.print(s + " ");
}
System.out.println();
}
/**
* 使用迭代器删除
*/
public static void remove1(List<String> nameList, String name) {
// 获取迭代器
Iterator<String> iterator = nameList.iterator();
while (iterator.hasNext()) {
// 遍历集合中的所有元素
String next = iterator.next();
if (name.equals(next)) {
iterator.remove();
}
}
}
/**
* 使用for删除(无法循环遍历)
*/
public static void remove2(List<String> nameList, String name) {
for (int i = 0; i < nameList.size(); i++) {
if (name.equals(nameList.get(i))){
// 删除当前元素后,后面未遍历到的元素的下标会受到影响
// 导致下标混乱
nameList.remove(i);
}
}
}
/**
* 使用for删除-倒序
*/
public static void remove3(List<String> nameList, String name) {
for (int i = nameList.size()-1; i >=0; i--) {
if (name.equals(nameList.get(i))){
// 倒序删除,下标的遍历不会受到影响
nameList.remove(i);
}
}
}
}
运行结果如下:
tom jerry kitty kitty
tom jerry kitty