Java程式設計基礎17——集合(List集合)

扎瓦發表於2019-01-19

1_(去除ArrayList中重複字串元素方式)*

  • A:案例演示

    • 需求:ArrayList去除集合中字串的重複值(字串的內容相同)
    • 思路:建立新集合方式
import java.util.ArrayList;
import java.util.Iterator;
public class ArrayList_1_demo {
    /* 建立新集合將重複元素去掉
    * 1.明確返回值型別,返回ArrayList
    * 2.明確引數列表ArrayList
    * */
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("a");
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("c");
        list.add("b");
        
        ArrayList newList = getSingle(list);
        System.out.println(newList);
    }
    
    public static ArrayList getSingle(ArrayList list) {
        ArrayList newList = new ArrayList();            //1.建立新集合
        Iterator it = list.iterator();                //2.根據傳入的集合(老集合)獲取迭代器
        
        while(it.hasNext()) {                //3.遍歷老集合
            Object obj = it.next();            //4.臨時記錄每一個元素
            if(!newList.contains(obj)) {    //5.如果新集合中不包含老集合中的元素
                newList.add(obj);            //6.將新元素新增到新集合中
            }
        }
        return newList;                        //7.將新集合返回
    }
}

2_(去除ArrayList中重複自定義物件元素)*

  • A:案例演示

    • 需求:ArrayList去除集合中自定義物件元素的重複值(物件的成員變數值相同)
  • B:注意事項

    • 重寫equals()方法的

      • contains方法判斷是否包含,底層依賴的是equals方法
      • remove方法判斷是否刪除,底層依賴的是equals方法
import java.util.ArrayList;
import java.util.Iterator;
import net.allidea.bean.Person;
@SuppressWarnings({ "rawtypes", "unchecked" })
public class ArrayList_2_demo {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();            //建立集合物件
        list.add(new Person("張三",23));
        list.add(new Person("李四",24));
        list.add(new Person("張三",23));
        list.add(new Person("張三",23));
        list.add(new Person("王五",23));
        list.add(new Person("李四",24));
        
//        ArrayList newList = getSingle(list);            //呼叫方法去除重複
//        System.out.println(newList);
        list.remove(new Person("張三",23));
        System.out.println(list);
    }
    public static ArrayList getSingle(ArrayList list) {
        ArrayList newList = new ArrayList();            //1.建立新集合
        Iterator it = list.iterator();                //2.根據傳入的集合(老集合)獲取迭代器
        
        while(it.hasNext()) {                //3.遍歷老集合
            Object obj = it.next();            //4.臨時記錄每一個元素
            if(!newList.contains(obj)) {    //5.如果新集合中不包含老集合中的元素
                newList.add(obj);            //6.將新元素新增到新集合中
            }
        }
        return newList;                        //7.將新集合返回
    }
}
    @Override//重寫equals方法
    public boolean equals(Object obj) {
        Person p = (Person)obj;
        return this.name.equals(p.name) && this.age == p.age;
    }

3_(LinkedList的特有功能)*

  • A:LinkedList類概述
  • B:LinkedList類特有功能

    • public void addFirst(E e)及addLast(E e)
    • public E getFirst()及getLast()
    • public E removeFirst()及public E removeLast()
    • public E get(int index);
import java.util.LinkedList;
public class ArrayList_3_LinkedList {
    public static void main(String[] args) {
        LinkedList list = new LinkedList();
        list.addFirst("a");
        list.addFirst("b");
        list.addFirst("c");
        list.addFirst("d");//在頭部新增
        list.addLast("e");//在尾部新增
        
//        System.out.println(list.getFirst());//列印頭部元素
//        System.out.println(list.getLast());//列印尾部元素
//        System.out.println(list.removeFirst());//刪除頭
//        System.out.println(list.removeLast());//刪除尾
        System.out.println(list.get(1));
        System.out.println(list);
    }
}

4_(棧和佇列資料結構)*

    • 先進後出 (裝子彈原理)
  • 佇列

    • 先進先出(水龍頭原理)

5_用LinkedList模擬棧資料結構的集合並測試*

  • A:案例演示

    • 需求:請用LinkedList模擬棧資料結構的集合,並測試
    • 建立一個類將Linked中的方法封裝
import java.util.LinkedList;
import java.util.Stack;

public class ArrayList_4_LinkedList {
    public static void main(String[] args) {
//        demo1();
        stack s = new stack();            //進棧
        s.in("a");
        s.in("b");
        s.in("c");
        s.in("d");
        
        while(!s.isEmpty()) {            //是否為空
            System.out.println(s.out());//彈棧
        }
    }

    private static void demo1() {
        LinkedList list = new LinkedList();
        list.addLast("a");
        list.addLast("b");
        list.addLast("c");
        list.addLast("d");
        
/*        System.out.println(list.removeLast());
        System.out.println(list.removeLast());
        System.out.println(list.removeLast());
        System.out.println(list.removeLast());*/
        
        while (!list.isEmpty()) {        
            System.out.println(list.removeLast());
        }
    }
}
import java.util.LinkedList;
public class stack {
    private LinkedList list = new LinkedList();
    
    //模擬進棧方法
    public void in(Object obj) {
        list.addLast(obj);
    }
    
    //模擬出棧方法
    public Object out() {
        return list.removeLast();
    }
    
    //模擬棧結構是否為空
    public boolean isEmpty() {
        return list.isEmpty();
    }
}

6_泛型概述和基本使用*

  • A:泛型概述
  • B:泛型好處

    • 提高安全性(將執行期的錯誤轉換到編譯期)
    • 省去強轉的麻煩
  • C:泛型基本使用

    • <>中放的必須是引用資料型別
  • D:泛型使用注意事項

    • 前後的泛型必須一致,或者後面的泛型可以省略不寫(1.7的新特性菱形泛型)
import java.util.ArrayList;
import java.util.Iterator;
import net.allidea.bean.Person;
public class Generic_1_demo {    
    public static void main(String[] args) {
//        demo1();
//        int[] arr = new byte[5];                                //陣列要保證前後的資料型別一致
//        ArrayList<Object> list = new ArrayList<Person>();         //集合泛型也要保證前後的資料型別一致
//        ArrayList<Object> list = new ArrayList<>();                //1.7版本新特性,菱形泛型
        ArrayList<Object> list = new ArrayList<>();                //泛型不定義Object,沒有意義
        list.add("aaa");
        list.add(true);
        list.add(new Person("張三",23));
    }

    private static void demo1() {
        ArrayList<Person> list = new ArrayList<Person>();
//        list.add(100);
//        list.add(true);
        list.add(new Person("張三",23));
        list.add(new Person("李四",24));
        
        Iterator<Person> it = list.iterator();
        while(it.hasNext()) {
//            System.out.println(it.next());
            //next()方法只能呼叫一次,如果呼叫多次會將指標向後移動多次
//            System.out.println(it.next().getName() + "..." + it.next().getAge());
            Person p = it.next();        //向下轉型
            System.out.println(p.getName() + "..." + p.getAge());
        }
    }
}

7_ArrayList儲存字串和自定義物件並遍歷泛型版*

  • A:案例演示

    • ArrayList儲存字串並遍歷泛型版
import java.util.ArrayList;
import java.util.Iterator;
import net.allidea.bean.Person;
public class Generic_2_demo 
    public static void main(String[] args) {
//        demo1();
        demo2();
    }

    private static void demo2() {
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("張三",23));
        list.add(new Person("李四",24));
        list.add(new Person("王五",25));
        list.add(new Person("趙六",26));
        
        Iterator<Person> it = list.iterator();
        while(it.hasNext()) {
            Person p = it.next();    //將集合中的每一個元素用Person記錄
            System.out.println(p.getName() + "..." + p.getAge());
        }
    }
    
    private static void demo1() {
        ArrayList<String> list = new ArrayList();        //建立集合物件
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        Iterator<String> it = list.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

8_泛型的由來(瞭解)

  • A:案例演示

    • 泛型的由來:通過Object轉型問題引入
    • 早期的Object型別可以接收任意的物件型別,但是在實際的使用中,會有型別轉換的問題。也就存在這隱患,所以Java提供了泛型來解決這個安全問題。
import net.allidea.bean.Animal;        //Animal 繼承 Person及其構造
import net.allidea.bean.Person;        //Person private String name;private int age;
import net.allidea.bean.Tool;        //Tool 自定義類private Object obj;
import net.allidea.bean.Worker;        //Worker 繼承 Person及其構造

public class Generic_3_demo {
    public static void main(String[] args) {
        Tool t = new Tool();        //建立工具類物件
        t.setObj(new Animal("張三",23));

        Worker w = (Worker)t.getObj();        //向下轉型
        System.out.println(w);
    }
}

9_泛型類的概述及使用(瞭解)

  • A:泛型類概述<T>

    • 把泛型定義在類上
  • B:定義格式

    • public class 類名<泛型型別1,…>
  • C:注意事項

    • 泛型型別必須是引用型別
  • D:案例演示

    • 泛型類的使用
import net.allidea.bean.Animal;        //Animal 繼承 Person及其構造
import net.allidea.bean.Person;        //Person private String name;private int age;
import net.allidea.bean.Tool;        //Tool 自定義類private Object obj;
import net.allidea.bean.Worker;        //Worker 繼承 Person及其構造

public class Generic_3_demo {
    public static void main(String[] args) {
        Tool<Animal> t = new Tool<>();        //建立工具類物件
        t.setObj(new Animal("張三",23));

//        Worker w = (Worker)t.getObj();        //報錯
//        System.out.println(w);
    }
}
//Tool檔案
package net.allidea.bean;
public class Tool<Q> {    //E代表元素
    private Q q;

    public Q getObj() {
        return q;
    }

    public void setObj(Q q) {
        this.q = q;
    }
}

10_泛型方法的概述和使用(瞭解)

  • A:泛型方法概述

    • 把泛型定義在方法上
  • B:定義格式

    • public <泛型型別> 返回型別 方法名(泛型型別 變數名)
  • C:案例演示

    • 泛型方法的使用
import net.allidea.bean.Animal;        //Animal 繼承 Person及其構造
import net.allidea.bean.Tool;        //Tool 自定義類private Object obj;

public class Generic_3_demo {
    public static void main(String[] args) {
        Tool<String> t = new Tool<>();
//        t.show("abc");
        t.show(true);            //無型別,自動裝箱
    }
}
package net.allidea.bean;
public class Tool<Q> {    //E代表元素
    private Q q;

    public Q getObj() {
        return q;
    }

    public void setObj(Q q) {
        this.q = q;
    }
    
    public<T> void show(T t) {        //方法泛型需要與類的泛型一致
        System.out.println(t);        //如果不一致,需要在方法上宣告該型別
    }
    
    public static<Q> void print(Q q) {    //靜態方法必須宣告自己的泛型,載入早此Q非彼Q
        System.out.println(q);    
    }
}

11_泛型介面的概述和使用(瞭解)

  • A:泛型介面概述

    • 把泛型定義在介面上
  • B:定義格式

    • public interface 介面名<泛型型別>
  • C:案例演示

    • 泛型介面的使用
package net.allidea.Generic;
public class Generic_4_demo {    
    public static void main(String [] args) {            
    }
}

interface Inter<T> {        //介面泛型
    public void show(T t);        //抽象方法
}

/*class Demo implements Inter<String> {        //第一種方式實現介面泛型,推薦

     @Override
    public void show(String t) {            //重寫抽象方法
        System.out.println(t);
    }
}*/

class Demo<T> implements Inter<T> {        //沒有必要再實現介面的時候,給自己類加泛型

    @Override
    public void show(T t) {
        System.out.println(t);
    }
}

12_(泛型高階之萬用字元)(瞭解)

  • A:泛型萬用字元<?>

    • 任意型別,如果沒有明確,那麼就是Object以及任意的Java類了
  • B:? extends E

    • 向下限定,E及其子類
  • C:? super E

    • 向上限定,E及其父類
import java.util.ArrayList;
import java.util.List;
import net.allidea.bean.Person;
import net.allidea.bean.Animal;

public class Generic_5_demo {
    public static void main(String[] args) {
//        List<?>    list = new ArrayList<Integer>(); //當右邊泛型是不確定時,左邊可以指定為?
        ArrayList<Person> list1 = new ArrayList<>();
        list1.add(new Person("張三",23));
        list1.add(new Person("李四",24));
        list1.add(new Person("王五",25));
        
        ArrayList<Animal> list2 = new ArrayList<>();
        list2.add(new Animal("趙六",26));
        list2.add(new Animal("田七",27));
        
        list1.addAll(list2);    //Animal繼承Person
        System.out.println(list1);    
    }
}

13_增強for的概述和使用*

  • A:增強for概述——簡化陣列和Collection集合的遍歷
  • B:格式:
        for(元素資料型別 變數 : 陣列或者Collection集合) {
            使用變數即可,該變數就是元素
        }
  • C:案例演示——陣列,集合儲存元素用增強for遍歷
  • D:好處——簡化遍歷
import java.util.ArrayList;
public class Foreach_1_demo {
    public static void main(String[] args) {
        int[] arr = {11,22,33,44,55,66};
        for(int i : arr) {
            System.out.println(i);
        }

        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        for (String string : list) {
            System.out.println(string);
        }
    }
}

14_ArrayList儲存字串和自定義物件並遍歷增強for版 *

  • ArrayList儲存字串並遍歷增強for版
  • 增強for迴圈底層依賴的是迭代器(Iterator)
    public static void main(String[] args) {
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("張三",23));
        list.add(new Person("李四",24));
        list.add(new Person("王五",25));
        list.add(new Person("趙六",26));
        list.add(new Person("田七",27));
        
        for (Person person : list) {
            System.out.println(person);
        }
    }

15_三種迭代的能否刪除*

  • 普通for迴圈,可以刪除,但是索引要–
  • 迭代器,可以刪除,但是必須使用迭代器自身的remove方法,否則會出現併發修改異常
  • 增強for迴圈不能刪除
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("b");
        
        //普通for迴圈刪除,索引要--
        /*for (int i = 0; i < list.size(); i++) {
            if("b".equals(list.get(i))) {
                list.remove(i--);                    //通過索引刪除元素
            }
        }*/
        //迭代器刪除
        /*Iterator<String> it = list.iterator();
        while(it.hasNext()) {
            if("b".equals(it.next())) {
//                list.remove("b");        //不能用集合的刪除方法,會報併發修改異常
                it.remove();
            }
        }*/
        
        /*for(Iterator<String> it2 = list.iterator(); it2.hasNext();) {
            if("b".equals(it2.next())) {
                it2.remove();
            }
        }*/
        
        //增強for迴圈,不能刪除,只能遍歷
        for (String String : list) {
            if("b".equals(String)) {
                list.remove("b");
            }
        }
        System.out.println(list); 
    }

16_靜態匯入的概述和使用(瞭解)

  • A:靜態匯入概述

    • 靜態匯入時匯入類中的靜態方法;
  • B:格式:

    • import static 包名….類名.方法名;
    • 可以直接匯入到方法的級別
  • C:注意事項

    • 方法必須是靜態的,如果有多個同名的靜態方法,容易不知道使用誰?
這個時候要使用,必須加字首。由此可見,意義不大,所以一般不用,但是要能看懂。
import static java.util.Arrays.sort;
import static java.util.Arrays.*;
public class StaticImport_2_demo {        
    public static void main(String[] args) {
        int[] arr = {11,33,55,66,99,44};
        sort(arr);            //排序
        System.out.println(Arrays.toString(arr));
    }
}

17_可變引數的概述和使用*

  • A:可變引數概述

    • 定義方法的時候不知道該定義多少個引數
  • B:格式

    • 修飾符 返回值型別 方法名(資料型別… 變數名){}
  • C:注意事項:

    • 這裡的變數其實是一個陣列
    • 如果一個方法有可變引數,並且有多個引數,那麼,可變引數肯定是最後一個
public class ChangeableArgs_3_demo {
    public static void main(String[] args) {
        int[] arr = {11,22,33,44,55};
//        print(arr);
        print(11,22,33,44,55);
        System.out.println("------------");
        print(0, arr);
    }
    
    /*public static void print(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }*/
    
    public static void print(int x,int ... arr) {            //可變引數是一個陣列
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

18_Arrays工具類的asList()方法的使用*

  • A:案例演示

    • Arrays工具類的asList()方法的使用
    • Collection中toArray(T[] a)泛型版的集合轉陣列
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Demo4_Aslist {
    public static void main(String[] args) {
//        demo1();
//        demo2();
        //集合轉陣列,加泛型的
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        String[] arr = list.toArray(new String[10]);//當集合轉換陣列時,陣列長度<=集合的size時,轉換後的陣列等於集合的size
        for (String string : arr) {            //如果陣列的長度大於了size,分配的陣列長度就和你指定的長度一樣
            System.out.println(string);
        }    
    }

    private static void demo2() {
        /*int[] arr = {11,22,33,44,55,66};            //將整個陣列當做一個引用型別
        List<int[]> list = Arrays.asList(arr);        //基本資料型別的陣列轉換成集合,會將整個陣列當作一個集合
        System.out.println(list);*/
        
        Integer[] arr = {11,22,33,44,55};
        List<Integer> list = Arrays.asList(arr);    //將陣列轉換成集合,陣列必須是引用資料型別
        System.out.println(list);
    }

    private static void demo1() {
        String[] arr = {"a","b","c","d","e","f","g"};
        List<String> list = Arrays.asList(arr);            //將陣列轉換成集合
        list.add("h");                                //不能新增
        System.out.println(list);
    }
}

19_集合巢狀之ArrayList巢狀ArrayList*

  • A:案例演示

    • 集合巢狀之ArrayList巢狀ArrayList
    • 案例

      • 學科——分若干個班級
      • 學科是一個大集合
      • 若干個班級分為每一個小集合
import java.util.ArrayList;
import net.allidea.bean.Person;
public class List_6_ArrayList {
    public static void main(String[] args) {
        ArrayList<ArrayList<Person>> list = new ArrayList<>(); 
        ArrayList<Person> first = new ArrayList<>();            //建立第一個班級
        first.add(new Person("楊冪",30));
        first.add(new Person("胡歌",36));
        first.add(new Person("郭富城",50));
        first.add(new Person("周杰倫",38));
        
        ArrayList<Person> second = new ArrayList<>();
        second.add(new Person("黃曉明",31));
        second.add(new Person("趙薇",31));
        second.add(new Person("陳坤",31));
        
        //將班級新增到學科集合中
        list.add(first);
        list.add(second);
        
        //遍歷學科集合
        for(ArrayList<Person> a : list) {
            for(Person p : a) {
                System.out.println(p);
            }
        }    
    }
}

相關文章