1。一个BUG导致一个迭代器由于公司代码中包含业务逻辑,为了方便大家理解,我写了一个精简代码。这段代码遍历列表List中的元素,去除满足一定规则的元素(比如不能被3整除的数字)。一开始,这段代码是用for循环执行的。运行后会发现,有些元素明明不是3的倍数,但在链表中依然存在。//准备数据LinkedListlist1=newLinkedList();LinkedListlist2=newLinkedList();for(inti=0;i<30;i++){list1.add(i);list2.add(i);}//for方法移除System.out.println("ForRemove");for(inti=0;iiter=list2.iterator();while(iter.hasNext()){整数num=iter.next();如果(num%3!=0){iter.remove();}}for(Integernum:list2)System.out.print(num+"");System.out.println();结果如下:IteratorRemove0369121518212427可以看出这次程序可以正常运行,不会遗漏remove()操作后的一些元素。这个例子给了我们两个启示:元素列表可以在for循环中访问,但最好不要移除元素列表;如果要在遍历过程中去除不合适的元素,最好使用迭代器;2.迭代器介绍迭代器是java定义的接口,在java.util.Iterator包下。该接口有四个方法,方便实现该接口的集合类进行访问操作。publicinterfaceIterator{Enext();booleanhasNextO;voidremove0;defaultvoidforEachRemaining(Consumeraction);}很多集合中已经有了访问方法,比如get(),为什么还需要迭代器Iterator这样的接口存在吗?这是因为,在LinkedList集合中,迭代器的访问效率要高于get方法。测试代码如下:publicstaticvoidForMethod(Listlist){longstart=System.currentTimeMillis();for(inti=0;ilist){longstart=System.currentTimeMillis();迭代器<整数>iter=list.iterator();while(iter.hasNext()){整数num=iter.next();}longt=System.currentTimeMillis()-开始;System.out.println("IteratorMethod"+t+"ms");}这里会生成一个大小为100000的链表,对两个method进行测试,测试代码如下:LinkedListlist=new链表<整数>();对于(整数我=0;i<100000;i++){list.add(i);}ForMethod(列表);迭代器方法(列表);运行程序的结果发现两者差距很大,几乎是比的千倍ForMethod:4327msIteratorMethod5ms这是因为链表中的get方法每次都从头开始查找,直到第i-找到第一个元素。Iterator方法在学习数据结构时更像是遍历链表。也就是说,对于一个大小为n的链表,get方法的时间复杂度是n(n+1)/2,迭代器的时间复杂度是n。随着链表大小的增加,访问效率差距呈线性增加。感谢您能够耐心阅读本文。希望对大家有所帮助。如果喜欢,请双击屏幕!喷鑫!