java 集合(arraylist set map)遍历问题
2015-08-27 11:49
253 查看
1.遍历可以用for和iterator,其效率有区别
使用for循环与使用迭代器iterator的对比
效率上的各有有事
采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快
采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快
从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.
而使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样.
增强for循环(foreach)和iterator遍历的效果是一样的,也就说
增强for循环的内部也就是调用iteratoer实现的,但是增强for循环 有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。
不能删除集合的解释:forEach不是关键字,关键字还是for,语句是由iterator实现的,他们最大的不同之处就在于remove()方法上。
一般调用删除和添加方法都是具体集合的方法,例如:
List list = new ArrayList(); list.add(...); list.remove(...);
但是,如果在循环的过程中调用集合的remove()方法,就会导致循环出错,因为循环过程中list.size()的大小变化了,就导致了错误。 所以,如果想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。
forEach就是为了让用iterator循环访问的形式简单,写起来更方便。当然功能不太全,所以但如有删除操作,还是要用它原来的形式
2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。
3.而对于 LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用 增强for循环,也就是iterator。
4.遍历
参考:
1.http://blog.csdn.net/zxq1138634642/article/details/8092327
2.http://yinny.iteye.com/blog/1150491
使用for循环与使用迭代器iterator的对比
效率上的各有有事
采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快
采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快
从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.
而使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样.
增强for循环(foreach)和iterator遍历的效果是一样的,也就说
增强for循环的内部也就是调用iteratoer实现的,但是增强for循环 有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。
不能删除集合的解释:forEach不是关键字,关键字还是for,语句是由iterator实现的,他们最大的不同之处就在于remove()方法上。
一般调用删除和添加方法都是具体集合的方法,例如:
List list = new ArrayList(); list.add(...); list.remove(...);
但是,如果在循环的过程中调用集合的remove()方法,就会导致循环出错,因为循环过程中list.size()的大小变化了,就导致了错误。 所以,如果想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。
forEach就是为了让用iterator循环访问的形式简单,写起来更方便。当然功能不太全,所以但如有删除操作,还是要用它原来的形式
2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。
3.而对于 LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用 增强for循环,也就是iterator。
4.遍历
arraylist // 遍历方式1 ,使用iterator Iterator<String> it = list.iterator(); while (it.hasNext()) { String value = it.next(); System.out.println(value); } // 遍历方法2 , 使用传统for循环进行遍历。 for (int i = 0, size = list.size(); i < size; i++) { String value = list.get(i); System.out.println(value); } // 遍历方法3 , 使用增强for循环进行遍历。 for (String value : list) { System.out.println(value); } //遍历方法4,使用iterator+for。 for (Iterator<String> iter = list.iterator(); iter.hasNext();) { String value = (String) iter.next(); System.out.println(value); } Set //set集合遍历方法1,使用iterator Iterator<String> it = set.iterator(); while (it.hasNext()) { String value = it.next(); System.out.println(value); } //set集合遍历方法2,使用增强for循环。 for(String s: set){ System.out.println(s); } Map //Map集合遍历方法1 利用set的key for循环 Set<String> set = maps.keySet(); for (String s : set) { String key = s; String value = maps.get(s); System.out.println(key + " : " + value); } Iterator<Entry<String, String>> it = sets.iterator(); while (it.hasNext()) { Map.Entry<String, String> entry = (Entry<String, String>) it.next(); String key = entry.getKey(); String value = entry.getValue(); System.out.println(key + " : " + value); }
//Map集合遍历方法2 利用迭代器和keyset 取<span style="font-family: Arial, Helvetica, sans-serif;">得迭代器遍历出对应的值。</span> Set<String> sets = maps.keySet(); Iterator<String> it = sets.iterator(); while (it.hasNext()) { String key = it.next(); String value = maps.get(key); System.out.println(key + " : " + value); }
参考:
1.http://blog.csdn.net/zxq1138634642/article/details/8092327
2.http://yinny.iteye.com/blog/1150491
相关文章推荐
- java-captcha实现验证码(二)
- import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport;这两行报错
- demo2 JAVA变量
- kafka学习(三)--java开发(基于kafka0.8版本)
- Android SDK+Eclipse+ADT+CDT+NDK 开发环境在windows 7下的搭建
- java中四种引用类型
- MyBatis之java.lang.UnsupportedOperationException异常解决方案
- salesforce rest api 登录 | Authenticating to Salesforce using REST, OAuth 2.0 and Java
- JAVA问题总结之16-一维数组案例
- java annotation 例子
- 《Java并发编程的艺术》读书笔记(一)
- Eclipse更改字体大小
- java死锁例子详解
- Java学习笔记----运算符
- JNI数据类型转换
- JSch - Java实现的SFTP(文件上传详解篇)
- Spring io 2015-08-27 10:49:13.774 WARN 1718 --- [nio-8080-exec-1] o.s.web.servlet.PageNotFound
- struts2 package name作用
- Using Custom Java code in ODI
- demo1 JAVA笔记