/**
 * @author 冀帅
 * @date 2020/8/7-15:31
 */
public class Person {
    private  String name;
    private  int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        if (age != person.age) return false;
        return name != null ? name.equals(person.name) : person.name == null;

    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }
}

import org.junit.Test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * 集合元素的变量操作,使用迭代器Iterator接口
 * 1.内部的方法:hasNext()和next()
 * 2.集合对象每次调用iterator()都会得到一个全新的迭代器对象,
 *   默认游标都在第一个元素之前。
 * 3.内部定义了一个remove()方法,可以在遍历的时候删除集合中的元素
 *    此方法不同于集合直接调用remove()
 * @author 冀帅
 * @date 2020/8/7-17:31
 */
public class ItertorTest {
    @Test
    public void test1(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);
        Iterator iterator = coll.iterator();
//        方式一:
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        //报异常:NoSuchElementException 五个元素 只能next()5次
//        System.out.println(iterator.next());
        //方式二:不推荐
//        for (int i = 0; i < coll.size(); i++) {
//            System.out.println(iterator.next());
//        }
        //方式三:推荐
        while (iterator.hasNext()){
            System.out.println(iterator.next());//next:1.指针下移。2.将下移以后集合位置上的元素返回

        }
    }
    @Test
    public  void  test2(){
        Collection cool = new ArrayList();
        cool.add(123);
        cool.add(456);
        cool.add(new Person("jerry",20));
        cool.add(new String("Tom"));
        cool.add(false);
        //错误方式一:
//        Iterator iterator = cool.iterator();
//        while (iterator.next()!=null){
//            System.out.println(iterator.next());//456 Tom
//
//
//        }
//        //错误方式二:死循环一直输出123(第一个数)集合对象每次调用iterator()都会得到
//           一个全新的迭代器对象,默认游标都在第一个元素之前。
//        while (cool.iterator().hasNext()){
//            System.out.println(cool.iterator().next());
//        }
    }
    //测试Iterator中的remove()
    //如果还未调用next(),或在上一次调用next方法之后已经调用了remove方法,
    //再调用remove()[写两次remove()]就会报IllegalStateException
    @Test
    public  void test3(){
        Collection cool = new ArrayList();
        cool.add(123);
        cool.add(465);
        cool.add(new Person("jerry",22));
        cool.add(new String("Tom"));
        cool.add(false);
        //删除集合中"Tom"的数据
        Iterator iterator = cool.iterator();
        while (iterator.hasNext()){
            Object obj = iterator.next();//调用remove()前必须调用next()方法,得让指针指下来。不然报异常
            if ("Tom".equals(obj)){
                iterator.remove();
            }
        }
        //遍历集合
       iterator = cool.iterator();//上一个迭代器指针已到最后,所以重新创建一个
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}