Java性能优化:遍历
2016-07-06 15:57
357 查看
说说自己踩到的坑
某个项目中遍历一个List集合,该集合比较大,大概有几万条数据,我使用了
for循环遍历:
public void readList(List<String> list) { if (list != null) { for (int i=0; i<list.size(); i++) { // do something... } } }
做测试的时候发现程序执行特别慢,找了好久找到了原因,就是上面的方法中的问题:由于方法参数中给定的
List集合可能是
ArrayList,也可能是
LinkedList。当遍历
LinkedList的时候,如果集合很大,会出现程序执行效率慢的问题。
将上面的方法重构:
public void readList(List<String> list) { if (list != null) { Itarator<String> iter = list.iterator(): while (iter.hasNext()) { // do something... } } }
重构后程序执行确实快了不少,这源于
ArrayList和
LinkedList内部实现的区别,
LinkedList随机读取要比
ArrayList慢,关于
ArrayList和
LinkedList区别不多说了,其他网站有很多异同点的比较。
总结一下
除非遍历的过程中要获取集合中元素的索引使用for循环,否则遍历集合尽量使用
Iterator迭代器。
另外,还可以使用
forEach循环:
public void readList(List<String> list) { if (list != null) { for (String str : list) { // do something... } } }
forEach循环是
Iterator写法的简化版,也不用担心数组越界,它的内部实现也是使用
Iterator迭代器(可以通过反编译后查看)。不过功能上没有
Iterator强大,比如在
forEach调用集合的
remove()方法会导致
java.util.ConcurrentModificationException异常,所以要根据具体操作选取。
相关文章推荐
- 由xml生成对应Java类
- spring mvc框架和蓝信做对接。 总结一下。
- 文章标题
- springmvc sends and receives data by ajax request using json format
- 动态规划求一个数列的最长不下降子序列java版
- java 正则表达式 -Regular Expression
- java.lang.OutOfMemoryError: PermGen space eclipse解决方法
- 获取签名证书的SHA1值说明
- 【spring】BeanPostProcessor使用场景之@Autowired
- Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
- [转]详解Java解析XML的四种方法
- eclipse中的.project 和 .classpath文件的具体作用
- 搭建Eclipse下的Android开发环境
- 在spring中常被忽视的注解 @Primary
- Spring JMS ActiveMQ Topic Example
- 理解Java内部类
- Java抽象工厂模式
- velocity学习笔记-基础
- ZXing官方项目Demo还原 (eclipse 版本)
- java优化高并发、高负载