「java迭代器可以修改吗」迭代器修改元素
今天给各位分享java迭代器可以修改吗的知识,其中也会对迭代器修改元素进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、java中iterator的Next()遍历完之后怎么回到起点
- 2、java中什么叫迭代,什么叫迭代器
- 3、java 中集合已经有增删改查了为什么还要迭代器?
- 4、为什么java中迭代过程中不能添加或修改元素
- 5、java.Iterator迭代器,谁给我发一份教程
- 6、Java中如果集合迭代器已经迭代完了,如果还想迭代,只能在调用一遍iterator返回一个新的吗?
java中iterator的Next()遍历完之后怎么回到起点
重新得到一个新的 Iterator 对象(还是调用 coll.iterator())。所谓遍历嘛,你已经“遍”过,下次再“遍”当然要重新开始了。
如果你的集合中都没东西,你当然就没有“遍”的必要,当然是我们往集合中添加了东西我们才要遍历一下看一下其中的东西嘛。不过有一点,在迭代的过程中不能直接修改集合。比如:
for(Iterator iter = list.iterator(); iter.hasNext(); ) {
list.add("afewfe"); // 这个操作是非法的,它导致 iter 内缓存的位置索引失效,结果不可预料。
}
Java 中的迭代器是指你想对集合中的每一个元素做个操作,这个时候就不能再在不通知迭代器的情况下直接改这个集合了,通常我们为了确保迭代器在迭代过程中的位置索引是有一致的,我们支持的修改操作很有限,比如:
for(Iterator iter = list.iterator(); iter.hasNext(); ) {
Object current = iter.next();
// 如果是我们想找的,删除它。
if ( current == aaa) {
iter.remove(); // 删除当前的。这个时候迭代器知道我们修改了集合,而且我们只能删除当前位置的东西,这个迭代器内部的位置索引就没有问题,如果我们删除任意位置的元素,那么迭代器当前保持的位置索引就没有意义,因此不能直接 add 或 remove 任意位置,只能通过迭代器来删除当前位置的。
}
}
for(ListIterator iter = list.listIterator(); iter.hasNext(); ) {
// 这个 ListIterator 比 Iterator 多些方法可用,因为 List 与其它集合相对它是有序的。
}
java中什么叫迭代,什么叫迭代器
迭代:
是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。此过程的每一次结果,都是由对前一次所得结果施行相同的运算步骤得到的。例如利用迭代法*求某一数学问题的解。
对计算机特定程序中需要反复执行的子程序*(一组指令),进行一次重复,即重复执行程序中的循环,直到满足某条件为止,亦称为迭代。
迭代器(Iterator)模式:
又叫做游标模式,它的含义是,提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。
注意:Java的集合框架的集合类,有的时候也称为容器。
从定义上看,迭代器是为容器而生,它本质上就是一种遍历的算法。因为容器的实现千差万别,很多时候不可能知道如何去遍历一个集合对象的元素。Java为我们提供了使用迭代的接口,Java的所有集合类丢失进行迭代的。
简单的说,迭代器就是一个接口Iterator,实现了该接口的类就叫做可迭代类,这些类多数时候指的就是java.util包下的集合类。
总结:
迭代器,提供一种访问一个集合对象各个元素的途径,同时又不需要暴露该对象的内部细节。java通过提供Iterator和Iterable俩个接口来实现集合类的可迭代性,迭代器主要的用法是:首先用hasNext()作为循环条件,再用next()方法得到每一个元素,最后在进行相关的操作。
扩展资料
首先,创建了一个List的集合对象,并放入了俩个字符串对象,然后通过iterator()方法得到迭代器。iterator()方法是由Iterable接口规定的,ArrayList对该方法提供了具体的实现,在迭代器Iteartor接口中,有以下3个方法:
1、hasNext() 该方法英语判断集合对象是否还有下一个元素,如果已经是最后一个元素则返回false
2、next() 把迭代器的指向移到下一个位置,同时,该方法返回下一个元素的引用
3、remove() 从迭代器指向的Collection中移除迭代器返回的最后一个元素,该操作使用的比较少。
注意:从Java5.0开始,迭代器可以被foreach循环所替代,但是foreach循环的本质也是使用Iterator进行遍历的。
参考资料:百度百科——迭代器
参考资料:百度百科——迭代
java 中集合已经有增删改查了为什么还要迭代器?
您好,提问者:
迭代器的神奇之处在于:可以迭代很多,比如Set、List接口下的类。
虽然List有.get方法,但是远远不能满足需求,对于面向抽象来讲,这些集合框架的类既然都可以存储,那么肯定都可以迭代,所以抽取出来Iterator。
另外List迭代过程中有增删修改的话可以使用ListIterator接口,也是Iterator接口的子接口。。。。
为什么java中迭代过程中不能添加或修改元素
逻辑上讲,迭代时可以添加元素,但是一旦开放这个功能,很有可能造成很多意想不到的情况。
比如你在迭代一个ArrayList,迭代器的工作方式是依次返回给你第0个元素,第1个元素,等等,假设当你迭代到第5个元素的时候,你突然在ArrayList的头部插入了一个元素,使得你所有的元素都往后移动,于是你当前访问的第5个元素就会被重复访问。
java认为在迭代过程中,容器应当保持不变。因此,java容器中通常保留了一个域称为modCount,每次你对容器修改,这个值就会加1。当你调用iterator方法时,返回的迭代器会记住当前的modCount,随后迭代过程中会检查这个值,一旦发现这个值发生变化,就说明你对容器做了修改,就会抛异常。
java.Iterator迭代器,谁给我发一份教程
到csdn找到的教程,写的很详细:
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
迭代器应用:
list l = new ArrayList();
l.add("aa");
l.add("bb");
l.add("cc");
for (Iterator iter = l.iterator(); iter.hasNext();) {
String str = (String)iter.next();
System.out.println(str);
}
/*迭代器用于while循环
Iterator iter = l.iterator();
while(iter.hasNext()){
String str = (String) iter.next();
System.out.println(str);
}
*/
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
/**
* IteratorTest
* @author SageZk
*/
public class IteratorTest {
public static long testForloops(ListString list) {
long start = 0L, end = 0L;
@SuppressWarnings("unused")
String le = null;
start = System.nanoTime();
for (int i = list.size() - 1; i = 0; --i) {
le = list.get(i);
}
end = System.nanoTime();
return end - start;
}
public static long testIterator(ListString list) {
long start = 0L, end = 0L;
@SuppressWarnings("unused")
String le = null;
start = System.nanoTime();
IteratorString it = list.iterator();
while (it.hasNext()) {
le = it.next();
}
end = System.nanoTime();
return end - start;
}
public static void main(String[] args) {
//测试列表长度
final int LEN = 10000;
//初始化测试用数据
ListString arraylist = new ArrayListString();
ListString linkedlist = new LinkedListString();
for (int i = 0; i LEN; ++i) {
String s = Integer.toString(i, 2);
arraylist.add(s);
linkedlist.add(s);
}
//打印测试结果
final String FORMAT = "%1$-16s%2$-16s%3$16d\n";
System.out.println("List\t\tType\t\tTime(nanoseconds)");
System.out.println("-------------------------------------------------");
System.out.printf(FORMAT, "ArrayList", "for", testForloops(arraylist));
System.out.printf(FORMAT, "ArrayList", "Iterator", testIterator(arraylist));
System.out.printf(FORMAT, "LinkedList", "for", testForloops(linkedlist));
System.out.printf(FORMAT, "LinkedList", "Iterator", testIterator(linkedlist));
}
}
以下是 3 组测试结果:
[code=BatchFile]List Type Time(nanoseconds)
-------------------------------------------------
ArrayList for 1189258
ArrayList Iterator 2365594
LinkedList for 152396254
LinkedList Iterator 2340801
List Type Time(nanoseconds)
-------------------------------------------------
ArrayList for 1235701
ArrayList Iterator 4249982
LinkedList for 149825606
LinkedList Iterator 2525531
List Type Time(nanoseconds)
-------------------------------------------------
ArrayList for 1198267
ArrayList Iterator 2584617
LinkedList for 150382451
LinkedList Iterator 2347994
[/code]
使用 Iterator 的好处在于可以使用相同方式去遍历集合(List 是有序集合)中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口)。
如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 TreeSet 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整。
Java中如果集合迭代器已经迭代完了,如果还想迭代,只能在调用一遍iterator返回一个新的吗?
答: 是的,需要重新调用.iterator()方法,放回1个新的迭代器.
原因: 1: 因为迭代器使用完了,里面也就没有元素了,
2: 并且java语言没有提供重置的方法.
代码如下
import java.util.ArrayList;
import java.util.Iterator;
public class ListDemo {
public static void main(String[] args) {
ArrayListInteger list = new ArrayListInteger();
list.add(5);
list.add(3);
list.add(2);
IteratorInteger it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
System.out.println(it.hasNext());// false 表示没有元素了
//System.out.println(it.next());//会抛出异常 NoSuchElementException
it = list.iterator(); //从集合里重新获得迭代器
}
}
拓展思考:
对于此类问题,往往是对java类不太熟悉, 可以经常使用java api文档, 查看文档,你会快速了解到某个类的方法有哪些, 继承了哪些接口等情况,
比如Iterator类的方法说明如下
方法摘要
boolean hasNext()
如果仍有元素可以迭代,则返回 true。
E next()
返回迭代的下一个元素。
void remove()
从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
java迭代器可以修改吗的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于迭代器修改元素、java迭代器可以修改吗的信息别忘了在本站进行查找喔。
发布于:2022-12-13,除非注明,否则均为
原创文章,转载请注明出处。