浅谈集合框架四——集合扩展:集合循环输出方式及list输出方式的效率对比

最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出。初学者对于本篇博客只建议作为参考,欢迎留言共同学习。

  之前有介绍集合框架的体系概念(http://www.cnblogs.com/yjboke/p/8761195.html),本篇介绍一下集合扩展内容:集合循环输出方式及list输出方式的效率对比


遍历循环输出方式。

  遍历输出方式我这边介绍四种,for循环、迭代器(Iterator)、增强for循环(foreach)和List集合特有的列表迭代器(ListIterator)。

  增强for循环在for循环的基础上简化了代码,普通for循环可以没有遍历的目标,而增强for循环一定要有遍历的目标。在增强for循环中不可以进行增删改等操作,如需增删改等操作请使用普通for循环。

  列表迭代器(ListIterator)是Iterator 的子接口,弥补了其无法新增、修改的缺点。 

  List<String> list = new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4"); //普通for循环输出
for(int i = 0; i<list.size(); i++){
System.out.println(list.get(i));
} //增强for循环输出
for(String s : list){
System.out.println(s);
}
//列表迭代器
ListIterator<String> li = list.listIterator();
while(li.hasNext()){
Object object = li.next();
if (object.equals("abc3")) {
li.add("asd");
}
}
System.out.println(list);
//迭代器输出
for(Iterator<String> it = list.iterator(); it.hasNext();){
System.out.println(it.next());
}

  Map集合没有实现Iterable接口,所以map集合不能直接使用增强for循环,如果需要使用增强for循环需要借助于Set集合的keySet或entrySet集合。

  Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1001, "zhangsan");
map.put(1002, "wangwu");
map.put(1003, "lisi");
map.put(1004, "maliu");
//keySet方法
Set<Integer> keySet = map.keySet();
for(Integer i : keySet){
System.out.println("key:"+i+"; value:"+map.get(i));
}
//entrySet方法
Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
for(Map.Entry<Integer, String> i : entrySet){
System.out.println("key:" + i.getKey() + "----value:"+i.getValue());
}

 ——————————————————————————————————————————————————————————————————————

接下来将上面的代码加一些改动,定义一个长度为20000000的集合,用上方四种方法遍历输出并记录他们所消耗的时间,比较输出的效率。

 public static void main(String[] args) {
list();
} public static void list() {
List<String> list = new ArrayList<String>();
//定义一个集合的长度
int num = 20000000;
long timeStart,timeEnd;
for (int i = 0; i < num; i++) {
list.add("abd"+i);
} //测试foreach循环所用的时间
timeStart = System.currentTimeMillis();
for(String s : list) { }
timeEnd = System.currentTimeMillis();
System.out.println("foreach循环时间为:" + (timeEnd-timeStart) + "ms"); //测试Iterator循环所用的时间
timeStart = System.currentTimeMillis();
Iterator<String> it = list.iterator();
while(it.hasNext()) {
it.next();
}
timeEnd = System.currentTimeMillis();
System.out.println("Iterator循环时间为:" + (timeEnd-timeStart) + "ms"); //测试Iterator循环所用的时间
timeStart = System.currentTimeMillis();
ListIterator<String> lit = list.listIterator();
while(lit.hasNext()) {
lit.next();
}
timeEnd = System.currentTimeMillis();
System.out.println("ListIterator循环时间为:" + (timeEnd-timeStart) + "ms"); //测试for循环所用的时间
timeStart = System.currentTimeMillis();
for(int i = 0; i<list.size(); i++) {
list.get(i);
}
timeEnd = System.currentTimeMillis();
System.out.println(" for循环时间为:" + (timeEnd-timeStart) + "ms");
}

  输出结果为:

foreach循环时间为:143ms

Iterator循环时间为:12ms

ListIterator循环时间为:13ms

for循环时间为:18ms

 然后将四种循环方式单独输出,输出结果为:

foreach循环时间为:103ms
Iterator循环时间为:9ms
ListIterator循环时间为:10ms
for循环时间为:17ms

 可以看出Iterator和ListIterator相差不多,for循环又稍慢,foreach最慢。(如测试代码有不严谨之处,还请指出,共同学习。其他朋友测试可将集合长度调低测试。)

上一篇:排他思想做法


下一篇:List集合去重方式及效率对比