什么是迭代器Iterator
Iterator是java中的⼀个接⼝, Iterator 主要用于迭代访问(即遍历) Collection 中的元素,因此 Iterator 对象也被称为迭代器。当容器实现了Iterator接⼝后,可以通过调⽤Iterator()⽅法获取⼀个 Iterator对象
为啥是调⽤容器⾥⾯的Iterator⽅法呢?
因为容器的实现有多种,不同的容器遍历规则不⼀样,⽐如
ArrayList/linkedList/HashSet/TreeSet等,所以设计了Iterator接⼝,让容器本身去实现这个接⼝,实现⾥⾯的⽅法,从⽽让开发⼈员不⽤关系容器的遍历机制,直接使⽤对应的⽅法即可
三个核⼼⽅法
1.boolean hashNext()
⽤于判断iterator内是否有下个元素,如果有则返回true,``没有则false
2.Obejct next() 第一次调用Iterator的next()方法时,它返回序列的第一个元素。
返回iterator的下⼀个元素,同时指针也会向后移动1位
3.void remove()
删除指针的上⼀个元素(容易出问题,删除元素不建议使⽤容器⾃⼰的⽅法)
Listlist = new ArrayList<>(); list.add("jack"); list.add("tom"); list.add("lucy"); //获取迭代器 Iterator iterator = list.iterator(); //遍历+移除 while(iterator.hasNext()){ if (iterator.next().equals("jack")){ iterator.remove(); } } System.out.println(list);
//Set遍历
while(iterator.hasNext()){
System.out.println(iterator.next());
}
`public static void testSet(){
Set set = new HashSet<>();
set.add("jack");
set.add("tom");
set.add("marry");
set.add("tony");
set.add("jack");
Iterator iterator = set.iterator();
while (iterator.hasNext()){
String str = iterator.next();
System.out.println(str);
}
}
//遍历map容器有两种方法(思路变成Set集合)
//1.获得节点的Set集合, Entry是map中的一个节点
Set > entrySet = map.entrySet();
Iterator> iterator=entrySet.iterator();
while(iterator.hasNext()){
Map.Entry entry = iterator.next();
System.out.println("key: "+entry.getKey()+" value: "+entry.getValue());
//不能用这种写法,这样调用了两次next,指针会移动两次
// System.out.println("key:"+iterator.next().getKey()+",value: "+iterator.next().getValue());
}
//2.把key变成Set集合
Set keySet = map.keySet();
Iterator iterator = keySet.iterator();
while(iterator.hasNext()){
Integer key=iterator.next();
System.out.println("key: "+key+",value: "+map.get(key));
}
注意事项:
1.只有当next执⾏完后,才能调⽤remove函数
2.如要删除第⼀个元素,不能直接调⽤ remove(),要先next()下,否则调⽤remove⽅法是会抛出异常的
3.迭代器遍历元素时不能通过Collection接⼝中的remove⽅法删除元素,只能⽤Iterator的remove⽅法删除元素; **原因 某个线程在 Collection 上进⾏迭代时,不允许另⼀个线程修改该Collection**
4.**迭代出的对象是引⽤的拷⻉,如果修改迭代中的元素,那么就是修改容器对象的本身**
5.和for循环对⽐
1.for循环适合顺序访问,或者通过下标进⾏访问的
2.迭代器适合链式结构
3.最终看使⽤场景,性能会有轻微差别,但是可以忽略



