1 普通数组遍历
普通数组遍历就是普通的for循环遍历
如下:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>() ;
list.add(1) ;list.add(2) ;list.add(3) ;list.add(4) ;list.add(5) ;list.add(6) ;
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i)) ;
}
2、迭代器遍历
2.1 增强for循环
如下:
for (Integer i : list) {
System.out.println(i);
}
增强for循环是jdk1.5之后出来的一个高级的for循环,主要针对数组和集合的遍历。
增强for循环的顶层原理就是迭代器,我们查看Collection的源码,会发现他继承了:Iterable接口,任何继承了Iterable接口的都可以使用增强for循环来遍历集合元素。
我们可以测试一下:
手动实现一个list集合,
class MyList<E> implements Iterable<E> {
private Object[] array = new Object[100] ;
private int size = 0 ; // 表示数组的元素个数
private int index = 0 ; // 表示遍历的数组下标
public void add(E e) {
array[size++] = e ;
}
@Override
public Iterator<E> iterator() {
return new Iterator<E>() {
@Override
public boolean hasNext() {
try{
return index < size ? true : false;
} finally {
if (index >= size) {
index = 0 ;
}
}
}
@Override
public E next() {
return (E)array[index++];
}
};
}
}
测试:
MyList<Integer> myList = new MyList<>() ;
myList.add(1);myList.add(2);myList.add(3);myList.add(4);myList.add(5);
for (Integer integer : myList) {
System.out.println(integer);
}
经测试证明打印myList的集合元素正确无误。
2.2 forEach循环
forEach循环的顶层原理也是迭代器,我们可以查看一下他的源码:
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
Iterator var2 = this.iterator();
while(var2.hasNext()) {
T t = var2.next();
action.accept(t);
}
}
我们可以发现,他的原理实际上也是调用了Iterator的Next(),来获取集合中的元素。
用法:
list.forEach(t -> {
System.out.println(t);
});
参数是一个函数式接口,需要给一个参数,参数表示集合中的某个元素element。
2.3 迭代器循环
直接获取list集合的iterator(), 根据hasNext() 判断是否有元素,根据next() 获取元素
上代码:
Iterator<Integer> iterator = list.iterator() ;
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
这四种方式,普通for循环的效率和性能是比较高的,因为如果使用迭代器,那么删除元素就只能采取iterator.remove() ,他在迭代过程中会进行数据锁定,效率稍低。普通for循环的操作较灵活。