Java面向對象——API(4)----集合框架1:Collection常用方法、泛型、迭代器、遍歷

1、定義

在Java語言中,Java語言的設計者對常用的數據結構和算法做了一些規(guī)范(接口)和實現(具體實現接口的類)。所有抽象出來的數據結構和操作(算法)統(tǒng)稱為Java集合框架(JavaCollectionFramework)。

Java程序員在具體應用時,不必考慮數據結構和算法實現細節(jié),只需要用這些類創(chuàng)建出來一些對象,然后直接應用就可以了,這樣就大大提高了編程效率

2、集合框架包含內容

所有集合類都位于java.util包下。Java的集合類主要由兩個接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,這兩個接口又包含了一些子接口或實現類。

3、Collection接口常用方法(多態(tài)使用)

高度抽象出來的集合,它包含了集合的基本操作和屬性。包含了List和Set兩大接口分支。

  • 注意:Map不是Collection的子接口。

  • add():向集合中添加一個元素,成功添加則返回true

  • size():返回當前集合的元素個數

  • isEmpty():判斷當前集合是否為空集,當且僅當size()為=時返回true

  • clear():清空集合

    import java.util.ArrayList;
    import java.util.Collection;
    
    public class CollectionDemo {
        public static void main(String[] args) {
            Collection c = new ArrayList();
            c.add("one"); //給集合添加元素
            c.add("two");
            c.add("three");
            c.add("four");
            c.add("five");
            System.out.println(c); //Collection中重寫了Object的toString()方法
    
            int size = c.size(); //獲取集合的元素個數
            System.out.println("size:"+size); //5
    
            boolean isEmpty = c.isEmpty(); //判斷集合是否為空集(size為0表示為空集)
            System.out.println("是否為空集:"+isEmpty); //false
    
            c.clear(); //清空集合
            System.out.println("集合已清空");
            System.out.println(c); //[]
            System.out.println("size:"+c.size()); //0
            System.out.println("是否為空集:"+c.isEmpty()); //true
        }
    }
    
  • contains():判斷集合是否包含給定元素

  • remove():從集合中刪除給定元素,成功刪除則返回true

    import java.util.ArrayList;
    import java.util.Collection;
    
    public class CollectionDemo {
        public static void main(String[] args) {
            Collection c = new ArrayList();
            c.add(new Point(1,2));
            c.add(new Point(3,4));
            c.add(new Point(5,6));
            c.add(new Point(7,8));
            c.add(new Point(9,0));
            c.add(new Point(1,2));
            /*
              集合重寫了Object的toString()方法,格式如下:
               [元素1.toString(), 元素2.toString(), 元素3.toString(), ...]
             */
            System.out.println(c);
    
            Point p = new Point(1,2);
            /*
              boolean contains(Object o)
              判斷當前集合是否包含給定元素,判斷依據是給定元素是否與集合元素存在equals比較為true的情況
             */
            boolean contains = c.contains(p);
            System.out.println("是否包含:"+contains); //true
    
            /*
              boolean remove(Object o)
              從集合中刪除與給定元素equals比較為true的元素,若存在重復元素則只刪除一次
             */
            c.remove(p);
            System.out.println(c);
        }
    }
    
    import java.util.Objects;
    /**
     * 點
     */
    public class Point {
        private int x;
        private int y;
        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    
        @Override
        public String toString() {
            return "(" + x + "," + y + ")";
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Point point = (Point) o;
            return x == point.x && y == point.y;
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(x, y);
        }
    
        public int getX() {
            return x;
        }
        public void setX(int x) {
            this.x = x;
        }
        public int getY() {
            return y;
        }
        public void setY(int y) {
            this.y = y;
        }
    }
    
    
    import java.util.ArrayList;
    import java.util.Collection;
    /**
     * 集合是存放的是元素的引用
     */
    public class CollectionDemo3 {
        public static void main(String[] args) {
            Collection c = new ArrayList();
            Point p = new Point(1,2);
            c.add(p); //將p添加到集合c中
            System.out.println("p:"+p); //(1,2)
            System.out.println("c:"+c); //[(1,2)]
    
            p.setX(100);
            System.out.println("p:"+p); //(100,2)
            System.out.println("c:"+c); //[(100,2)]
        }
    }
    
  • addAll():將參數組給定集合中的元素添加到當前集合中,添加后當前集合發(fā)生改變則返回true

  • containsAll():判斷當前集合中是否包含參數集合中的所有元素

  • retainAll():取交集

  • removeAll():刪交集

    import java.util.ArrayList;
    import java.util.Collection;
    
    /**
     * 集合間操作的演示
     */
    public class CollectionDemo2 {
        public static void main(String[] args) {
            Collection c1 = new ArrayList();
            c1.add("java");
            c1.add("c++");
            c1.add(".net");
            System.out.println("c1: "+c1); //c1: [java, c++, .net]
    
            Collection c2 = new ArrayList();
            c2.add("android");
            c2.add("ios");
            c2.add("java");
            System.out.println("c2: "+c2); //c2: [android, ios, java]
    
            /**
             * boolean addAll(Collection c)
             * 將參數給定的集合中的所有元素添加到當前集合中
             * 添加后當前集合發(fā)生改變則返回true
             */
            c1.addAll(c2); //將c2添加到c1中
            System.out.println("c1: "+c1); //c1: [java, c++, .net, android, ios, java]
            System.out.println("c2: "+c2); //c2: [android, ios, java]
    
            Collection c3 = new ArrayList();
            c3.add("c++");
            c3.add("android");
            c3.add("php");
            System.out.println("c3: "+c3); //c3: [c++, android, php]
            /**
             * boolean containsAll(Collection c)
             * 判斷當前集合中是否包含參數集合中的所有元素
             */
            boolean contains = c1.containsAll(c3); //判斷c1中是否包含c3
            System.out.println("包含所有: "+contains);
    
            //取交集,c1中僅保留c1與c3的共有元素,c3不變
            //c1.retainAll(c3);
            //System.out.println("c1: "+c1); //c1: [c++, android]
            //System.out.println("c3: "+c3); //c3: [c++, android, php]
    
            //刪交集,將c1中與c3共有的元素刪除,c3不變
            c1.removeAll(c3);
            System.out.println("c1: "+c1); //c1: [java, .net, ios, java]
            System.out.println("c3: "+c3); //c3: [c++, android, php]
        }
    }
    

4、 集合的遍歷

  • Collection接口提供了統(tǒng)一的遍歷集合的方式:迭代器模式。通過iterator()方法可以獲取一個用于遍歷當前集合元素的迭代器(Iterator接口)。

  • java.util.Iterator接口:定義了迭代器遍歷集合的相關操作,不同的集合都實現了用于遍歷自身元素的迭代器實現類,但我們無需記住它們的名字,從多態(tài)的角度把它們看成Iterator即可。

  • 迭代器遍歷遵循的步驟為:問(hasNext())、取(next())、刪(remove()),但刪除并不是必要操作

    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    
    /**
     * 集合的遍歷:迭代器Iterator
     */
    public class IteratorDemo {
        public static void main(String[] args) {
            Collection c = new ArrayList();
            c.add("one");
            c.add("#");
            c.add("two");
            c.add("#");
            c.add("three");
            c.add("#");
            c.add("four");
            c.add("#");
            c.add("five");
            System.out.println(c); //[one, #, tow, #, three, #, four, #, five]
    
            /**
             * 迭代器的常用方法:
             * 1)boolean hasNext()-------問
             *   詢問集合是否還有"下一個"元素可供迭代
             *   注意:迭代器默認開始位置是在集合第1個元素之前
             *       無論調用多少次hasNext()方法,迭代器的位置都不會變
             * 2)Object next()-----------取
             *   迭代器向后移動一個位置來指向集合的下一個元素并將其獲取
             */
            Iterator it = c.iterator(); //獲取集合c的迭代器
            while(it.hasNext()){ //若有下一個元素
                String str = (String)it.next(); //獲取下一個元素
                if("#".equals(str)){ //若str為#號
                    //c.remove(str); //迭代器遍歷過程中不能通過集合方法增刪元素,否則會報異常
                    it.remove(); //刪除next()方法所獲取的元素
                }
                System.out.println(str);
            }
            System.out.println(c); //輸出集合元素
        }
    }
    

5、 增強for循環(huán)/新循環(huán):

  • jdk1.5時推出了一個特性:增強型for循環(huán),也稱為新循環(huán),讓我們使用相同的語法遍歷集合和數組。

  • 語法:

    for(元素類型 變量名 : 集合或數組){
        循環(huán)體
    }
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    
    /**
     * 增強型for循環(huán):新循環(huán)
     */
    public class NewForDemo {
        public static void main(String[] args) {
            String[] array = {"one","two","three","four","five"};
            for(int i=0;i<array.length;i++){
                System.out.println(array[i]);
            }
            //新循環(huán)遍歷數組----會被編譯器改回普通的for循環(huán)
            for(String str : array){
                System.out.println(str);
            }
    
            Collection c = new ArrayList();
            c.add("one");
            c.add("two");
            c.add("three");
            c.add("four");
            c.add("five");
            Iterator it = c.iterator();
            while(it.hasNext()){
                String str = (String)it.next();
                System.out.println(str);
            }
            //新循環(huán)遍歷集合----會被編譯器改回迭代器遍歷
            for(Object obj : c){
                String str = (String)obj;
                System.out.println(str);
            }
        }
    }
    

6、泛型:

  • jdk1.5時推出了一個特性:泛型

  • 泛型也稱為參數化類型,允許我們在使用一個類時,傳入某個類型來規(guī)定其內部的屬性、方法參數或返回值類型,使得我們使用的時候更加方便。

    • 泛型在集合中被廣泛使用,用來指定集合中元素的類型

    • 若不指定泛型的具體類型,則默認為Object。

    • 若指定了泛型的具體類型,在獲取泛型的值時,編譯器會補充強轉操作。

      import java.util.ArrayList;
      import java.util.Collection;
      import java.util.Iterator;
      
      /**
       * 泛型的演示
       */
      public class GenericDemo {
          public static void main(String[] args) {
              Collection<Point> c = new ArrayList<>();
              c.add(new Point(1,2));
              c.add(new Point(3,4));
              c.add(new Point(5,6));
              c.add(new Point(7,8));
              Iterator<Point> it = c.iterator();
              while(it.hasNext()){
                  Point p = it.next();
                  System.out.println(p);
              }
              for(Point p : c){
                  System.out.println(p);
              }
      
              /*
              Collection<String> c = new ArrayList<>();
              c.add("one");
              c.add("two");
              c.add("three");
              c.add("four");
              c.add("five");
              //c.add(123); //編譯錯誤,參數類型違背了集合c所指定的泛型的實際類型String
      
              //迭代器所指定的泛型應當與其遍歷的集合的泛型一致
              Iterator<String> it = c.iterator();
              while(it.hasNext()){
                  String str = it.next(); //指定泛型后,獲取元素無需再手動強轉
                  System.out.println(str);
              }
      
              for(String str : c){
                  System.out.println(str);
              }
               */
          }
      }
      

7、 集合與數組的轉換

  • 集合轉為數組:Collection中的方法toArray()

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collection;
    
    /**
     * 集合轉換為數組
     * Collection接口提供了一個方法toArray(),可以將當前集合轉換為一個數組
     */
    public class CollectionToArrayDemo {
        public static void main(String[] args) {
            Collection<String> c = new ArrayList<>();
            c.add("one");
            c.add("two");
            c.add("three");
            c.add("four");
            c.add("five");
            System.out.println(c); //[one, two, three, four, five]
            //若參數數組元素個數==集合元素個數,那就正常轉換
            //若參數數組元素個數<集合元素個數,那就正常轉換(按照集合大小給數組)
            //若參數數組元素個數>集合元素個數,則正常轉換,同時末尾補默認值
            String[] array = c.toArray(new String[0]);
            System.out.println(Arrays.toString(array));
        }
    }
    
  • 數組轉為集合:Arrays類的靜態(tài)方法asList()

    import java.util.Arrays;
    import java.util.List;
    
    /**
     * 數組轉換為集合:
     * 數組的工具類java.util.Arrays提供了一個靜態(tài)方法:asList()
     * 該方法可以將一個數組轉換為一個List集合
     */
    public class ArrayToCollectionDemo {
        public static void main(String[] args) {
            String[] array = {"one","two","three","four","five"};
            System.out.println("array: "+ Arrays.toString(array));
    
            //asList()方法會返回內部的ArrayList
            //該ArrayList內部直接引用給定數組array
            List<String> list = Arrays.asList(array);
            System.out.println("list: "+list);
    
            //對數組操作后,集合也會做相應的改變
            array[1] = "six";
            System.out.println("array: "+Arrays.toString(array));
            System.out.println("list: "+list);
            //對集合操作后,數組也會做相應的改變
            list.set(2,"seven"); //將下標2的元素修改為seven-----明天詳細講
            System.out.println("array: "+Arrays.toString(array));
            System.out.println("list: "+list);
            //添加元素/刪除元素相當于要往數組中加元素/減元素
            //而數組是定長的,不會自動擴容/縮容的,因此會發(fā)生不支持操作的異常
            list.add("!!!!!"); //運行時發(fā)生不支持操作異常
    
        }
    }
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容