今天在阿里开发手册中看到;
结果实验结果是: 1,2顺序没有问题,正常执行, 但如果把顺序调换,则提示
原因:
调用list.remove()方法导致modCount和expectedModCount的值不一致。
modCount值是什么: 其list源码里,初始数组长度,
expectedModCount 则是每次修改叠加值, 因为初始化为2,比对下标时获取不一致而抛出的异常;
以上得出:增强for循环的内部也就是调用iteratoer实现的(可以查看编译后的文件),但是增强for循环 ,不能在增强循环里动态的删除集合内容。不能获取下标等
关于性能
这里用100000个数组循环测试
public static void main(String[] args) throws ParseException { ListtempList = new ArrayList (); for (int i = 0; i < 100000; i++) { tempList.add(55); } /** * 普通循環 */ long start = System.currentTimeMillis(); int size = tempList.size(); int c1 = 1; for (int i = 0; i < size; i++) { c1 = tempList.get(i); } System.out.println("for + get(i)方法: " + (System.currentTimeMillis() - start)); /** * 增強循環 */ long start2 = System.currentTimeMillis(); for (int c2 : tempList) { //c1 = c2; } System.out.println("Iterator(foreach)方法:" + (System.currentTimeMillis() - start2)); }
普遍结果:
查询普通循环更快一点 ;
这里是拿ArrayList 做测试,当拿出LinkList时,得出以下结果
查询增强循环更快一点 ;
对于数组的结论:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
对于循环的结论那就不言而喻了, 循环没有好坏,只有适合的循环才是好循环;
关于删除
推荐使用iterator
public static void main(String[] args) throws ParseException { Listlist = new ArrayList (); list.add("a1"); list.add("a2"); list.add("a3"); list.add("a4"); list.add("a5"); Iterator it = list.iterator(); while (it.hasNext()) { String v = it.next(); if ("a2".equals(v)) { it.remove(); } } for (String v : list) { System.out.println(v); } }
运行结果: