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

来源:互联网 发布:淘宝加密算法 编辑:程序博客网 时间:2024/04/29 18:57
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");//集合长度不能修改    }}