最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出。初学者对于本篇博客只建议作为参考,欢迎留言共同学习。
之前有介绍集合框架的体系概念(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的集合,用上方四种方法遍历输出并记录他们所消耗的时间,比较输出的效率。
1 public static void main(String[] args) { 2 list(); 3 } 4 5 public static void list() { 6 List<String> list = new ArrayList<String>(); 7 //定义一个集合的长度 8 int num = 20000000; 9 long timeStart,timeEnd; 10 for (int i = 0; i < num; i++) { 11 list.add("abd"+i); 12 } 13 14 //测试foreach循环所用的时间 15 timeStart = System.currentTimeMillis(); 16 for(String s : list) { 17 18 } 19 timeEnd = System.currentTimeMillis(); 20 System.out.println("foreach循环时间为:" + (timeEnd-timeStart) + "ms"); 21 22 //测试Iterator循环所用的时间 23 timeStart = System.currentTimeMillis(); 24 Iterator<String> it = list.iterator(); 25 while(it.hasNext()) { 26 it.next(); 27 } 28 timeEnd = System.currentTimeMillis(); 29 System.out.println("Iterator循环时间为:" + (timeEnd-timeStart) + "ms"); 30 31 //测试Iterator循环所用的时间 32 timeStart = System.currentTimeMillis(); 33 ListIterator<String> lit = list.listIterator(); 34 while(lit.hasNext()) { 35 lit.next(); 36 } 37 timeEnd = System.currentTimeMillis(); 38 System.out.println("ListIterator循环时间为:" + (timeEnd-timeStart) + "ms"); 39 40 //测试for循环所用的时间 41 timeStart = System.currentTimeMillis(); 42 for(int i = 0; i<list.size(); i++) { 43 list.get(i); 44 } 45 timeEnd = System.currentTimeMillis(); 46 System.out.println(" for循环时间为:" + (timeEnd-timeStart) + "ms"); 47 }
输出结果为:
foreach循环时间为:143ms
Iterator循环时间为:12ms
ListIterator循环时间为:13ms
for循环时间为:18ms
然后将四种循环方式单独输出,输出结果为:
foreach循环时间为:103ms
Iterator循环时间为:9ms
ListIterator循环时间为:10ms
for循环时间为:17ms
可以看出Iterator和ListIterator相差不多,for循环又稍慢,foreach最慢。(如测试代码有不严谨之处,还请指出,共同学习。其他朋友测试可将集合长度调低测试。)