Java的三种遍历方式
1、传统的for循环遍历
遍历者自己在集合外部维护一个计数器,然后依次读取每一个位置的元素,当读取到最后一个元素后,停止。主要就是需要按元素的位置来读取元素。
2、增强型foreach循环遍历
foreach就是增强for循环。
foreach内部也是采用了Iterator的方式实现,只不过java编译器帮我们实现了,也是要继承Iterable接口的
3、Iterator迭代器遍历
但凡实现了collection接口的子类都可以获取迭代器
两个重要的方法:
- iterator.hasNext:进行判断,判断是否还有下一个元素
@Override
public boolean hasNext() {
return index !=elementData.length;
}
- iterator.next::向下移动,同时把指向的元素返回回来
@Override
public E next() {
return (E) elementData[index++];
}
package com.zzx.alg.structs.array;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
public class ArrayList<E> implements Iterable<E>{
/*数组底层逻辑实现*/
private Object[] elementData;
public ArrayList(int capacity){
/*对数组进行初始化操作*/
elementData = new Object[capacity];
}
/*添加一个元素*/
public boolean add(E element){
/*添加元素都是在数组的最后面添加的*/
int size = elementData.length;
//这里需要扩容,每添加一个元素的时候,扩容+1;
int newCapacity = size+1;
elementData = Arrays.copyOf(elementData,newCapacity);
elementData[size] = element;
return true;
}
/*取出指定位置的元素*/
public E get(int index){
return (E) elementData[index];
}
/*获取数组的大小*/
public int size(){
return elementData.length;
}
/*z替换指定位置的元素一个元素,返沪放入之前的元素*/
public E set(int index , E element){
E oldElement = (E) elementData[index];
elementData[index] = element;
return oldElement;
}
public static void main(String[] args) {
ArrayList<String> zzxArrayList = new ArrayList<>(10);
zzxArrayList.set(1,"1");
zzxArrayList.add("111");
zzxArrayList.forEach(s -> {
System.out.println(s);
});
/*Iterator iterator = zzxArrayList.iterator();
while (iterator.hasNext()){
Object obj = iterator.next();
System.out.println("obj:"+obj);
}*/
/*for(String list:zzxArrayList){
System.out.println(list);
}*/
}
@Override
public Iterator<E> iterator() {
return new zzxIterator();
}
class zzxIterator implements Iterator<E>{
int index=0;
@Override
public boolean hasNext() {
return index !=elementData.length;
}
@Override
public E next() {
return (E) elementData[index++];
}
}
}