复制代码
1
21、在JDK5之前对于数组或者list的遍历需要根据长度,以及下标进行遍历于是就有了其遍历方式
复制代码
1
2
3
4
5List<String> list = new ArrayList<String>(); for (int index = 0; index < list.size(); index++ ) { String str = list.get(index); System.out.println("str: " + str); }
复制代码
1
22、在JDK5之后引入了:增强特性使list的遍历,进行改变
复制代码
1
2
3
4List<String> list = new ArrayList<String>(); for (String str : list){ System.out.println("str:" + str); }
复制代码
1
23、反编译class文件可以看到增强for循环会被编译器自动处理如下代码:
复制代码
1
2
3
4
5
6
7List<String> list = new ArrayList<String>(); Iterator var4 = list.iterator(); while(var4.hasNext()) { str = (String)var4.next(); System.out.println("str:" + str); }
复制代码
1
2即JDK在编译java文件的时候会将:符号以JDK的特性进行转换成list的迭代器,接着通过获取迭代器的下一元素处理数据
在ArrayList类的里面存着一个内部类Itr 实现了Iterator的接口
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43public Iterator<E> iterator() { return new Itr(); } /** * An optimized version of AbstractList.Itr */ private class Itr implements Iterator<E> { int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount = modCount; public boolean hasNext() { return cursor != size; } @SuppressWarnings("unchecked") public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } public void remove() { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { ArrayList.this.remove(lastRet); cursor = lastRet; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } }
迭代器的原理是通过记录上一次读取数据的下标,以及下一次要下标,从而通过cursor和lastRet直接对集合的元素进行访问
最后
以上就是留胡子寒风最近收集整理的关于for(:)增强,Iterator迭代器的全部内容,更多相关for(内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复