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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章