java-Iterator(迭代器)遍历集合

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

/**
 * 集合框架:Iterator
 *Iterator(迭代器)用于遍历集合元素,获取迭代器可以使用Collection定义的方法:-Iterator iterator()
 *迭代器Iterator是一个接口,集合在重写Collection的iterator()方法时利用内部类提供了迭代器的实现
 *Iterator提供了统一的遍历集合元素的方式,其提供了用于遍历集合的方法(一般结合while()使用):
 *boolean hasNext():判断集合是否还有元素可以遍历
 *E next():返回迭代的下一个元素
 *Object next():返回迭代器刚越过的元素的引用,返回值是Object,需要强制转换成自己需要的类型
 * void remove():删除迭代器刚越过的元素
 * 
 * Iterator有一个很大的优点,就是我们不必知道集合的内部结果,集合的内部结构、状态由Iterator来维持,
 * 通过统一的方法hasNext()、next()来判断、获取下一个元素,
 */
public class IteratorDemo {
    public static void main(String[] args) {
        Collection c=new ArrayList();
        c.add("大哥");
        c.add("二哥");
        c.add("三哥");
        Iterator ite=c.iterator();
        while(ite.hasNext()) {
            Object obj=ite.next();
            System.out.println(obj);
        }
        System.out.println(c);
        /**
         * remove方法
         * 在使用迭代器遍历集合时,不能通过集合的remove方法删除集合元素,否则会抛出并发更改异常
         * 我们可以通过迭代器自身提供的remove()方法来删除通过next()迭代出的元素
         * 迭代器的删除方法是在原集合中删除元素
         * 这里需要注意:在调用remove方法前必须通过迭代器的next()方法迭代过元素
         * 那么删除的就是这个元素。并且不能再次调用remove方法,除非再次调用next()后方可再次调用
         */

        Iterator ite2=c.iterator();//必须写
        while(ite2.hasNext()) {
            Object obj=ite2.next();
            if("三哥".equals(obj)) {
                ite2.remove();
            }
            System.out.println(obj);
        }
        System.out.println(c);
        /**
         * 增强型for循环
         * 只作用于遍历集合或数组
         * 语法:
         * for(元素类型 e:集合或数组) {
         *  循环体
         * }
         * 新循环并非新的语法,而是在编译过程中,编译器会将新循环转换为迭代器模式,所以新循环本质是迭代器
         * 
         */
        for(Object obj:c) {
            System.out.println(obj);
        }
        /**
         * 泛型
         * 泛型本质是参数化类型
         * <String>泛型<约束类型>
         * <String>约束了c1集合中只能存储String类型的数据,否则编译出错
         */
        Collection<String> c1=new ArrayList<String>();
        c1.add("a");
//      c1.add(5);//编译错误
        /**
         * List接口是Collection的子接口,用于定义线性表数据结构。
         * 可以将List理解为存放对象的数组,只不过其元素个数可以动态的增加或减少
         * List是有序可重复的
         * 
         * List接口的两个常见实现类为ArrayList和LinkedList,分别用动态数组和链表的方式实现了List接口
         * 
         * 可以认为ArrayList和LinkedList的方法在逻辑上完全一样,
         * 只是在性能上有一定的差别,ArrayList更适合于随机访问
         * 而LinkedList更适合于插入和删除。
         * 
         * E get(int index)获取集合中指定下标对应的元素,下标从0开始
         * E set(int index,E elment)将给定的元素存入给定位置,并将原位置的元素返回
         */
        List<String> list=new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("a");
        String str=list.get(0);
        String str1=list.set(1, "PP");
        System.out.println(str+"------"+str1);
        System.out.println(list);
        /**
         * 遍历:尽量使用Iterator\foreach
         * ArrayList也可以利用get方法遍历
         */
        for(int i=0;i<list.size();i++) {
            String val=list.get(i);
            System.out.println(val);
        }
        /**
         * void add(int index,E element):将给定的元素插入到指定位置,原位置及后续元素顺序向后移动
         * E remove(int index):删除给定位置上的元素,将元素返回
         */
        list.add(0, "K");//插入
        System.out.println(list);
        System.out.println(list.remove(0));//删除
        /**
         * List的subList方法用于获取子List
         * subList获取的List与原List占有相同的存储空间,对子List的操作会影响原List
         * List<E> subList(int fromIndex,int toIndex)
         * fromIndex和toIndex是截取子List的首尾下标(前包括,后不包括)
         */
        List<Integer> list1=new ArrayList<Integer>();
        for(int i=0;i<10;i++) {
            list1.add(i);
        }
        System.out.println(list1);
        List<Integer> subList=list1.subList(0, 4);//获取子列表
        System.out.println(subList);
        subList.remove(0);//子List和原List占有相同空间
        System.out.println(subList);
        System.out.println(list1);
        /**
         * List转换为数组
         * List的toArray方法用于将集合转换为数组,但实际上该方法是在Collection中定义的,所以所有的集合都具备这个功能
         * 其有两个方法:
         * Object[] toArray()
         * <T>T[] toArray(T[] a):比较常用的,传入一个指定类型的数组,该数组的元素类型应与集合的元素类型一致。返回值则是转换后的数组,该数组会保存集合中所有的元素
         * 
         */
        Collection<String> list2=new ArrayList<String>();
        list2.add("kk");
        list2.add("gg");
        list2.add("jj");
        list2.add("jj");
        list2.add("yy");
        String[] str2=new String[7];
        //将数组str2的每个元素填充(fill)为A
        Arrays.fill(str2,"A");
        //toString将数组中全部元素连接为字符串
        System.out.println(Arrays.toString(str2));//[A, A, A, A, A, A, A]
        //调用toArray复制集合到数组,如果str2的长度等于或小于原集合元素数量,则返回新数组的引用
        String[] out=list2.toArray(str2);
        System.out.println(Arrays.toString(out));//[kk, gg, jj, jj, yy, null, A]

        /**
         * Arrays类中提供了一个静态方法asList,使用该方法我们可以将一个数组转换为对应的List集合
         * 
         */
        String[] arr={"tom","row","apple"};
        List<String> list3=Arrays.asList(arr);
        System.out.println(list3);
        arr[0]="haohao";//修改数组内容,影响List
        System.out.println(list3);
        list3.set(0, "sanxing");//修改List,影响数组
        System.out.println(Arrays.toString(arr));
//      list3.add(0, "haha");//集合长度不能修改


    }
}
发布了155 篇原创文章 · 获赞 37 · 访问量 19万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章