Java解释器Iterator的全面解析转载

原创
小哥 3年前 (2022-10-27) 阅读数 44 #大杂烩

为了便于处理集合中的元素,Java一个对象出现在,该对象提供了一些专门用于处理集合中元素的方法。.例如,删除和获取集合中的元素。.该对象称为迭代器。(Iterator).

对 Collection 迭代的类,称为迭代器。或者面向对象的思想,专业的对象做专业的事情,迭代器是专门取出集合元素的对象。但是,该对象是特殊的,不能直接创建(new),则该对象以内部类的形式存在于每个集合类中。

如何获得迭代器?Collection该接口定义了获取集合类迭代器(iterator()),所以所有Collection系统集合可以拥有自己的迭代器。

1.Iterable

这正是因为每个容器都有移除元素的功能。这些函数定义是相同的,只是具体的实现方式不同(因为每个容器的数据结构不同),所以提取了公共的检索函数,从而出现了。Iterator界面。每个容器在内部实现接口。也就是说,封装了删除方法的详细信息。

Jdk1.5稍后添加的新接口, Collection的父接口. 实现了Iterable这门课是迭代的。.和支持增强for循环该接口只有一个方法,即获取迭代器的方法。iterator()您可以获得每个容器自己的迭代器。Iterator。(Collection集合容器需要获取迭代器(Iterator)于是在5.0之后,提取将获得容器迭代器。iterator()将方法放入Iterable接口中。Collection接口过程Iterable,所以Collection除了重写每个子类集合(因为数据结构不同)之外,系统有办法获得自己的迭代器

2.Iterator

iterator() 返回集合的迭代器对象。。

此类主要用于遍历集合对象,它描述了遍历集合的常见方法。

1:java.lang. Itreable

---| Itreable      接口 实现此接口可以使用for循环

---| Collection 描述所有集合通用的接口

---| List接口     可以有一组重复的元素

---| Set接口     不可以有一组重复的元素

public interface Iterable

Itreable   该接口只有一个用于返回集合迭代器对象的方法。

Iterator iterator() 返回集合的迭代器对象。

Iterator接口定义方法

Itreator    该接口是定义通用迭代方法的迭代器接口类的集合。
1:boolean hasNext()
确定集合中是否有元素,如果有可以迭代的元素则返回。true。
2: E next()
返回迭代的下一个元素,注意: 如果没有下一个元素,则调用
next元素将引发NoSuchElementException
3: void remove()
从迭代器指向的集合中删除迭代器返回的最后一个元素(可选操作)
作)。
思考:为什么next该方法的返回类型为Object的呢?

为了接收任何类型的对象,然后回来的时候,我不知道它是什么类型,它是被定义的object

3.迭代程序的遍历

第一种方式:while循环

public static void main(String[] args) {
ArrayList list = new ArrayList();
// 增加:add() 将指定的对象存储在容器中。
list.add("计算机网络");
list.add("现代操作系统");
list.add("java编程思想");
list.add("java核心技术");
list.add("java语言编程");
System.out.println(list);
Iterator it = list.iterator();
while (it.hasNext()) {
String next = (String) it.next();
System.out.println(next);
}
}
第二条路:for循环
public class Demo2 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
// 增加:add() 将指定的对象存储在容器中。
list.add("计算机网络");
list.add("现代操作系统");
list.add("java编程思想");
list.add("java核心技术");
list.add("java语言编程");
System.out.println(list);

for (Iterator it = list.iterator(); it.hasNext();) {
//迭代器的next方法返回值类型为Object,因此请记住类型转换。
String next = (String) it.next();
System.out.println(next);
}
}
}
当你需要取出所有元素时,你可以通过循环,java 建议使用for 循环因为内存是可以优化的。

第三种方法:使用迭代器清空集合。
public class Demo1 {
public static void main(String[] args) {
Collection coll = new ArrayList();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
System.out.println(coll);
Iterator it = coll.iterator();
while (it.hasNext()) {
it.next();
it.remove();
}
System.out.println(coll);
}
}

需要注意的细节如下:
细节一:

如果迭代器的指针已经指向集合的末尾,则如果再次调用。next()会返回NoSuchElementException异常

public class Demo2 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
// 增加:add() 将指定的对象存储在容器中。
list.add("计算机网络");
list.add("现代操作系统");
list.add("java编程思想");
list.add("java核心技术");
list.add("java语言编程");
System.out.println(list);

Iterator it = list.iterator();
while (it.hasNext()) {
String next = (String) it.next();
System.out.println(next);
}
// 指向迭代器的指针已经指向集合的末尾。
// String next = (String) it.next();
// java.util.NoSuchElementException
}
}
细节二:

如果调用remove没有之前的呼叫next是非法的,并将抛出IllegalStateException

public class Demo2 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
// 增加:add() 将指定的对象存储在容器中。
list.add("计算机网络");
list.add("现代操作系统");
list.add("java编程思想");
list.add("java核心技术");
list.add("java语言编程");
System.out.println(list);

Iterator it = list.iterator();
while (it.hasNext()) {
// 调用remove没有之前的呼叫next是非法的
// it.remove();
// java.lang.IllegalStateException
String next = (String) it.next();
System.out.println(next);
}

}
}
4.迭代器原理
查看ArrayList源码

private class Itr implements Iterator {

int cursor = 0;

int lastRet = -1;

int expectedModCount = modCount;

public boolean hasNext() {
return cursor != size();
}

public E next() {
checkForComodification();
try {
E next = get(cursor);
lastRet = cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}

public void remove() {
if (lastRet == -1)
throw new IllegalStateException();
checkForComodification();

try {
AbstractList.this.remove(lastRet);
if (lastRet < cursor)
cursor--;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}

}
注意:1.在集合迭代期间,不允许对迭代器以外的元素进行操作,因为这会产生安全风险。java抛出异常并修改该异常(ConcurrentModificationException),普通迭代器只支持迭代过程中的删除操作。

2.ConcurrentModificationException: 当集合在循环中时,它使用引用变量来操作集合,然后使用迭代器来操作集合对象, 抛出异常。

public class Demo1 {
public static void main(String[] args) {
Collection coll = new ArrayList();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
System.out.println(coll);
Iterator it = coll.iterator();
while (it.hasNext()) {
it.next();
it.remove();
coll.add("abc"); // 除了迭代器之外,还有对元素的操作。
}
System.out.println(coll);
}
}
如果是List集合中,您想要操作的元素可以在迭代中使用。List集合的唯一迭代器。ListIterator迭代器支持在迭代期间添加和修改元素。

5.List唯一迭代器ListIterator
public interface ListIterator extends Iterator

ListIterator listIterator()

---| Iterator
hasNext()
next()
remove()
------| ListIterator Iterator子接口 List独占迭代器
add(E e)    将指定的元素插入列表(可选操作)。该元素将直接插入到 next 返回下一个元素的前面(如果有)
void set(E o)   替换为指定的元素 next 或 previous 返回的最后一个元素
hasPrevious()    反向遍历列表,列表迭代器有多个元素,返回。 true。
previous()       返回列表中的上一个元素。
Iterator迭代时,只能获得元素。(next())和删除(remove())的操作。

对于 Iterator 的子接口ListIterator 在迭代list 集合,还可以添加元素。

(add(obj)),修改set(obj)的操作。

public class Demo2 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
// 增加:add() 将指定的对象存储在容器中。
list.add("计算机网络");
list.add("现代操作系统");
list.add("java编程思想");
list.add("java核心技术");
list.add("java语言编程");
System.out.println(list);
// 获取List独占迭代器
ListIterator lit = list.listIterator();

while (lit.hasNext()) {
String next = (String) lit.next();
System.out.println(next);
}

}
}

倒序遍历

public class Demo2 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
// 增加:add() 将指定的对象存储在容器中。
list.add("计算机网络");
list.add("现代操作系统");
list.add("java编程思想");
list.add("java核心技术");
list.add("java语言编程");
System.out.println(list);
// 获取List独占迭代器
ListIterator lit = list.listIterator();
while (lit.hasNext()) {
String next = (String) lit.next();
System.out.println(next);
}
System.out.println("***");
while (lit.hasPrevious()) {
String next = (String) lit.previous();
System.out.println(next);
}

}
}
Set方法:替换为指定的元素 next 或 previous 返回的最后一个元素

public class Demo2 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
// 增加:add() 将指定的对象存储在容器中。
list.add("计算机网络");
list.add("现代操作系统");
list.add("java编程思想");
list.add("java核心技术");
list.add("java语言编程");
System.out.println(list);

ListIterator lit = list.listIterator();
lit.next(); // 计算机网络
lit.next(); // 现代操作系统
System.out.println(lit.next()); // java编程思想
//替换为指定的元素 next 或 previous 返回的最后一个元素
lit.set("平凡的世界");// 将java编程思想被普通世界所取代。
System.out.println(list);

}
}

add方法将指定的元素插入到列表中,该列表直接插入到 next 在返回的元素之后

public class Demo2 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
// 增加:add() 将指定的对象存储在容器中。
list.add("计算机网络");
list.add("现代操作系统");
list.add("java编程思想");
list.add("java核心技术");
list.add("java语言编程");
System.out.println(list);

ListIterator lit = list.listIterator();
lit.next(); // 计算机网络
lit.next(); // 现代操作系统
System.out.println(lit.next()); // java编程思想
// 将指定的元素插入到列表中,该列表直接插入到 next 在返回的元素之后
lit.add("平凡的世界");// 在java在编程思想之后添加一个平凡的世界
System.out.println(list);

}
}
————————————————
版权声明:本文是CSDN博主《漂浮的我》的原创文章如下 CC 4.0 BY-SA 版权协议,转载请附上原始来源链接和本声明。
原始链接:https://blog.csdn.net/qq\_33642117/article/details/52039691

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门