黑马程序员技术交流社区
标题:
迭代器与获取遍历问题
[打印本页]
作者:
\(^o^)/
时间:
2014-4-23 13:23
标题:
迭代器与获取遍历问题
本帖最后由 \(^o^)/ 于 2014-4-24 00:26 编辑
for(int x=0;x<a.size();x++)
{
sop(a.get(x));
}
for(Iterator it=a.iterator();it.hasNext();)
{
sop(it.next());
}
复制代码
以上两种方法都可以输出元素,请问下迭代器和获取这两种方法的区别在哪里,一般用那种比较好。
作者:
kuroro自走核炮
时间:
2014-4-23 13:36
for(int x=0;x<a.size();x++)
{
sop(a.get(x));
}
这种方法只适合于list集合的。因为list集合中元素都有索引(就像数组的角标。)每一个元素都有唯一的一个索引数值与其对应,所以可以使用这种方法进行遍历。
但是对于set型和map型集合这种方法就无法使用了。因为这两型集合底层数据结构和list不同,其中不存在索引。
为了对所有集合都能进行方便的取出内部元素的操作,所以设立了一个通用规则:迭代器
作者:
idream
时间:
2014-4-23 14:27
区别:迭代是collection集合所有集合都有的获取元素的方法,而用get方法回去元素的方法只有List集合有,因为List 集合是有序的
总结:List集合的四种迭代方式(及不同点):
package cn.itheima.demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/*
* List集合的四种迭代:见demo1(),demo2(),demo3(),demo4()
* foreach和Iterator的区别:见demo5(),demo6()
*
* 第一种和第四种都是List集合特有的
* 第二种和第三种都是collection集合都有的
*
*
* foreach和Iterator的区别
* foreach代码简单,底层是Iterator实现的,foreach中不可以删除集合中的元素,因为foreach没有remove的方法
* 用Iterator中有remove,所以可以删除元素
*
* 当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常
* 解析:由于foreach没有remove的方法,所以在使用list的remove的方法是时,就会检测到并发异常,foreach在迭代元素,
* 突然list集合自己删了一个元素,这是就会发生并发修改
*
* ListIterator是Iterator的子接口,它不光可以删除元素,还可以添加元素 -->详情见demo4方法
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public class Demo {
public static void main(String[] args) {
}
//第一种迭代:List集合特有的
public static void demo1() {
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
for (int x = 0; x < list.size(); x++) {
System.out.println(list.get(x));
}
}
//第二种迭代:List集合用迭代器来获取元素
public static void demo2() {
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
Iterator it = list.iterator();
while(it.hasNext()) {
String str = (String)it.next();
System.out.println(str);
}
}
//第三种迭代:List集合用foreach来获取元素
public static void demo3() {
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
for (Iterator it = list.iterator() ; it.hasNext() ;) {
String str = (String)it.next();
System.out.println(str);
}
}
//第四种迭代:List集合用迭代器来获取元素
public static void demo4() {
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ddd");
ListIterator li = list.listIterator();
while(li.hasNext()) {
String str = (String)li.next();
if(str.equals("bbb")) {
li.add("ccc"); //listIterator可以添加元素
}
}
System.out.println(list);
}
public static void demo5() {
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
Iterator it = list.iterator();
while(it.hasNext()) {
String str = (String)it.next();
if(str.equals("ccc")) {
it.remove();
}
System.out.println(str);
}
System.out.println(list);
}
public static void demo6() {
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
Iterator it = list.iterator();
for(Object o: list ) {
String str = (String)it.next();
if(str.equals("aaa")) {
list.remove("aaa"); //会抛出并发修改
}
System.out.println(str);
}
System.out.println(list);
}
}
复制代码
作者:
倪大大
时间:
2014-4-23 17:31
你get方法只是LIST中得特有方法 list集合有角标所以才能根据角标来获取元素,而其他set map集合是没有角标的,只能用特有方法 迭代来获取元素,所以迭代才是集合的标准获取元素方法
作者:
四川男人
时间:
2014-4-24 00:22
迭代器有一个方法remove(),如果在for循环中使用,改变了循环条件,要报错,
另外。for通常用于遍历数组,
iterator用于迭代集合,hasnext能够有效的判断是否存在下一个元素
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2