背景:

不同的集合实现迭代器的方式是不相同的;常见的集合的迭代器有:1.列表的迭代器使用;2数组的迭代器的使用;3.hashset的迭代器的使用。4.hashMap迭代器的使用(重点,易错)

1.1数组的迭代器的使用

package com.ydlclass.collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class ArrayListTest {
    public static void del(){

    }
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("a");
        arrayList.add("b");

        //ArrayList<String> arrayList1 = new ArrayList<>();
        //arrayList1.add("1");
        //arrayList1.add("2");
        //arrayList.addAll(1,arrayList1);
        Iterator<String> iterator = arrayList.iterator();
        while (iterator.hasNext()){
            String next = iterator.next();
            System.out.println(next);
        }

        //常见的遍历操作
        //for (int i = 0; i < arrayList.size(); i++) {
        //    System.out.print(arrayList.get(i) + " ");
        //}
        //List<String> list = new LinkedList<>();
        /**
         * 父类引用指向子类对象,存在静态类型和动态类型的区别;
         * 静态分派和动态分派的过程,成为了多态,多态的好处是能够解耦合
         * 多态的好处就是比如在编写一个函数的时候,传入的参数我们使用接口的方式传入;虽然接口不能直接调用方法
         * 但是编写的时候依旧调用了原因在于,是根据传入的参数类型确定调用什么方法的
         */

        //list的相关操作
        /**
         * list.remove();
         * list.removeAll();
         * list.removeif();
         * 列表常见的增,删,改,查;
         */



    }
}


1.2hashSet迭代器的使用;

package com.ydlclass.collection;

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Set;

public class SetTest {
    public static void main(String[] args) {
        HashSet<String> hashSet = new HashSet<>();

        hashSet.add("a");
        hashSet.add("b");
        hashSet.add("c");
        hashSet.add("d");
        hashSet.add("e");
        hashSet.add("e");
        hashSet.add("1");
        hashSet.add("2");
        hashSet.add("3");
        Iterator<String> iterator = hashSet.iterator();

        //第一步先判断有误下一个

        while (iterator.hasNext()){
            String next = iterator.next();//拿到下一个元素;由于不同的集合类有不同的实现方式;
            System.out.println(next);
        }



    }
}

1.3hashMap迭代器的使用(两种方式使用其迭代器,其中第二种的迭代器的使用需要注意避免错误使用)


import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashMapTest {
    public static void main(String[] args) {
        HashMap<String,Integer> hashMap = new HashMap<>(16);
        hashMap.put("a",1);
        hashMap.put("b",2);
        //HashMap中迭代器的几种使用方法:
        //1.通过先获取hashMapkeySet()方法的到键的集合;
        Set<String> keySet = hashMap.keySet();
        Iterator<String> iterator1 = keySet.iterator();//keySet集合先获得迭代器;
        while (iterator1.hasNext()){
            String key = iterator1.next();
            System.out.println("key = " + key);
            System.out.println("value= " + hashMap.get(key));//使用get方法并且使用了key的获取对应的值;
        }
        //2.方式二:
        Set<Map.Entry<String, Integer>> entries = hashMap.entrySet();//键值对集合,entry其实类似于node节点,他是一个接口;此处是一个函数,这个函数的主要工作是:把每一对key—value
        //打包成一个实例对象entry集合;这个集合中每个对象是一个entry对象,每个对象封装了key-value;
        Iterator<Map.Entry<String, Integer>> iterator2 = entries.iterator();
        //错误的做法
        //while(iterator2.hasNext()){
        //    System.out.println("iterator2.next().getKey() = " + iterator2.next().getKey());
        //    System.out.println("iterator2.next().getValue() = " + iterator2.next().getValue());
        //}
        //上面的方式产生问题的原因在于:两句话中分别调用了next方法,导致了不是同一个对象;
        //正确的方法:
        while (iterator2.hasNext()){
            Map.Entry<String, Integer> next = iterator2.next();
            System.out.println("next.getKey() = " + next.getKey());
            System.out.println("next.getValue() = " + next.getValue());
        }

    }
}

前面的两次方法中第二种方法的效率比较高;前者主要是先遍历hashMap得到一个keyset,然后在通过key遍历hashMap找到对应的val;(keyset->key实例->hashMap使用key实例获取val) 后者是先遍历一次hashMap得到一个键值对的entryset然后直接从entry对象中取值val即可;(entrySet->entry实例对象->entry对象调用特定的方法获取key或者val)