1. 程式人生 > >16.01_集合框架(去除ArrayList中重複字串元素方式)

16.01_集合框架(去除ArrayList中重複字串元素方式)

###16.01_集合框架(去除ArrayList中重複字串元素方式)

  • A:案例演示
    • 需求:ArrayList去除集合中字串的重複值(字串的內容相同)

    • 思路:建立新集合方式

        /**
         *  A:案例演示
         * 需求:ArrayList去除集合中字串的重複值(字串的內容相同)
         * 思路:建立新集合方式
         */
        public static void main(String[] args) {
        	ArrayList list = new ArrayList();
        	list.add("a");
        	list.add("a");
        	list.add("b");
        	list.add("b");
        	list.add("b");
        	list.add("c");
        	list.add("c");
        	list.add("c");
        	list.add("c");
        	
        	System.out.println(list);
        	ArrayList newList = getSingle(list);
        	System.out.println(newList);
        }
      
        /*
         * 去除重複
         * 1,返回ArrayList
         * 2,引數列表ArrayList
         */
        public static ArrayList getSingle(ArrayList list) {
        	ArrayList newList = new ArrayList();			//建立一個新集合
        	Iterator it = list.iterator();					//獲取迭代器
        	while(it.hasNext()) {					//判斷老集合中是否有元素
        		String temp = (String)it.next();		//將每一個元素臨時記錄住
        		if(!newList.contains(temp)) {			//如果新集合中不包含該元素
        			newList.add(temp);				//將該元素新增到新集合中
        		}
        	}
        	return newList;							 //將新集合返回
        }
      

###16.02_集合框架(去除ArrayList中重複自定義物件元素)(掌握)

  • A:案例演示
    • 需求:ArrayList去除集合中自定義物件元素的重複值(物件的成員變數值相同)
  • B:注意事項
    • 重寫equals()方法的

list中的contains方法和remove方法依賴於Equal()方法,所有如果是自定義物件的呼叫,必須重寫equal()方法

###16.03_集合框架(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);

###16.04_集合框架(棧和佇列資料結構)(掌握)

    • 先進後出
  • 佇列
    • 先進先出

###16.05_集合框架(用LinkedList模擬棧資料結構的集合並測試)(掌握)

  • A:案例演示
    • 需求:請用LinkedList模擬棧資料結構的集合,並測試
    • 建立一個類將Linked中的方法封裝
    •   public class Stack {
        	private LinkedList list = new LinkedList();		//建立LinkedList物件
        	
        	public void in(Object obj) {
        		list.addLast(obj);							//封裝addLast()方法
        	}
        	
        	public Object out() {
        		return list.removeLast();					//封裝removeLast()方法
        	}
        	
        	public boolean isEmpty() {
        		return list.isEmpty();						//封裝isEmpty()方法
        	}
        }
      

###16.06_集合框架(泛型概述和基本使用)(掌握)

  • A:泛型概述
  • B:泛型好處
    • 提高安全性(將執行期的錯誤轉換到編譯期)
    • 省去強轉的麻煩
  • C:泛型基本使用
    • <>中放的必須是引用資料型別
  • D:泛型使用注意事項
    • 前後的泛型必須一致,或者後面的泛型可以省略不寫(1.7的新特性菱形泛型)

可以插入泛型設定的資料型別的子類

###16.07_集合框架(ArrayList儲存字串和自定義物件並遍歷泛型版)(掌握)

  • A:案例演示
    • ArrayList儲存字串並遍歷泛型版

###16.08_集合框架(泛型的由來)(瞭解)

  • A:案例演示
    • 泛型的由來:通過Object轉型問題引入
    • 早期的Object型別可以接收任意的物件型別,但是在實際的使用中,會有型別轉換的問題。也就存在這隱患,所以Java提供了泛型來解決這個安全問題。

###16.09_集合框架(泛型類的概述及使用)(瞭解)

  • A:泛型類概述
    • 把泛型定義在類上
  • B:定義格式
    • public class 類名<泛型型別1,…>
  • C:注意事項
    • 泛型型別必須是引用型別
  • D:案例演示
    • 泛型類的使用

Eg:
如果用object物件引用陣列存取了Worker,就將Wokrer向下轉成了Object,然後又提取Object這個引用物件,把他向上轉成Student並且賦值給了一共Student的物件,最後呼叫這個物件或者方法就會出錯! 用了泛型後就會使這個陣列物件引用只能指向本型別或者子型別。(不是陣列,即使是類物件但是返回和引數是基本型別也是一樣的意思)

###16.10_集合框架(泛型方法的概述和使用)(瞭解)

  • A:泛型方法概述
    • 把泛型定義在方法上
  • B:定義格式
    • public <泛型型別> 返回型別 方法名(泛型型別 變數名)
  • C:案例演示
    • 泛型方法的使用

###16.11_集合框架(泛型介面的概述和使用)(瞭解)

  • A:泛型介面概述
    • 把泛型定義在介面上
  • B:定義格式
    • public interface 介面名<泛型型別>
  • C:案例演示
    • 泛型介面的使用
      Interface inter
      {

}

//推薦
Class Demo implements inter<String 或則其他引用資料型別>
{

}

//不推薦,沒有必要在實現介面的時候給自己類加泛型
Class Demo implements inter
{

}

靜態方法必須用泛型方法定義,因為靜態方法隨著類的載入而載入,不能在建立物件時給泛型賦值

###16.12_集合框架(泛型高階之萬用字元)(瞭解)

  • A:泛型萬用字元<?>
    • 任意型別,如果沒有明確,那麼就是Object以及任意的Java類了
  • B:? extends E
    • 向下限定,E及其子類
  • C:? super E
    • 向上限定,E及其父類

//一般來講左右泛型要一致,寫的時候前面泛型要寫明,後面可以省略
//但是如果左邊泛型不確定,就可以輸入?
Eg:
List<?> list = new ArrayList();

Arraylist類有一個方法addAll用來新增另一個集合的全部元素,程式設計師想將Array中的所有元素新增到ArrayList中去,然而,反過來就不行了,所有可以用萬用字元型別解決這個問題

###16.13_集合框架(增強for的概述和使用)(掌握)

  • A:增強for概述

    • 簡化陣列和Collection集合的遍歷
  • B:格式:

      for(元素資料型別 變數 : 陣列或者Collection集合) {
      	使用變數即可,該變數就是元素
      }
    
  • C:案例演示

    • 陣列,集合儲存元素用增強for遍歷
  • D:好處

    • 簡化遍歷

Eg:

  • Alt + / 輔助內容寫入
    增強for迴圈底層依賴得是迭代器

###16.14_集合框架(ArrayList儲存字串和自定義物件並遍歷增強for版)(掌握)

  • A:案例演示
    • ArrayList儲存字串並遍歷增強for版
    •   ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        for(String s : list) {
        	System.out.println(s);
        }
      

###16.15_集合框架(三種迭代的能否刪除)(掌握)

  • 普通for迴圈,可以刪除,但是索引要–

  • 迭代器,可以刪除,但是必須使用迭代器自身的remove方法,否則會出現併發修改異常

  • 增強for迴圈不能刪除
    Eg:
    public static void main(String[] args)
    {
    //去除list中有b的元素
    List list = new ArrayList<>();
    list.add(“a”);
    list.add(“b”);
    list.add(“b”);
    list.add(“c”);
    list.add(“d”);
    list.add(“b”);

      //普通迴圈
      for(int i = 0; i < list.size(); i++)
      {
      	if("b".equals(list.get(i)))
      	{
      		/*list.remove(i);   錯誤,因為remove後,後面的元素會前移,所以要將指標退回一個*/
      		list.remove(i);
      		i--;
      	}
      }
    
      //迭代器迴圈
      Iterator i  = list.iterator();
      while(i.hasNext())
      {
      	if(i.next().equals("b"))
      		/*list.remove("b"); 有錯誤,因為迭代器已經對集合進行了迭代,但是未迭代完就改變集合,導致出錯*/
      		i.remove();
      }
      
      //for each
      /*for (String string : list) 
      {
      	if(string.equals("b"))
      		list.remove("b");
      } 不行,因為for each 原理也是迭代器,所以會出現上個會出現的錯誤,其意義是一樣的*/
    

    }

###16.16_集合框架(靜態匯入的概述和使用)(瞭解)

  • A:靜態匯入概述
  • B:格式:
    • import static 包名….類名.方法名;
    • 可以直接匯入到方法的級別
  • C:注意事項
    • 方法必須是靜態的,如果有多個同名的靜態方法,容易不知道使用誰?
      這個時候要使用,必須加字首。由此可見,意義不大,所以一般不用,但是要能看懂。

沒什麼用處,直接匯入類,呼叫類的靜態方法就行了

###16.17_集合框架(可變引數的概述和使用)(掌握)

  • A:可變引數概述
    • 定義方法的時候不知道該定義多少個引數
  • B:格式
    • 修飾符 返回值型別 方法名(資料型別… 變數名){}
  • C:注意事項:
    • 這裡的變數其實是一個數組
    • 如果一個方法有可變引數,並且有多個引數,那麼,可變引數肯定是最後一個
      可變引數其實是一個數組

可變引數要放到最後一個,可以把可變引數看成一個數組

###16.18_集合框架(Arrays工具類的asList()方法的使用)(掌握)

  • A:案例演示
    • Arrays工具類的asList()方法的使用
    • Collection中toArray(T[] a)泛型版的集合轉陣列

Arrays.asList()可以將陣列轉換成list型別,但是隻能是引用型別陣列,基本資料型別不行,如果一定要,那麼先將基本資料型別陣列轉換成對應包裝型別的陣列

Eg:
String[] arr1 = {“a”, “b”, “d”, “e”, “l”};
List list1 = Arrays.asList(arr1);
System.out.println(list1); //[a, b, d, e, l]

	int[] arr = {34, 21, 12, 50, 64, 10};
	Arrays.sort(arr);
	
	//List<int> list = Arrays.asList(arr); //不行
	List<int[]> list = Arrays.asList(arr); 
	
	System.out.println(list); //[[[email protected]] 輸出的是地址值
	//這是因為將int[] arr 的arr看成一個物件,一個數組物件 而不是將陣列每個元素看成一個物件
	
	Integer[] arr2 = {34, 21, 12, 50, 64, 10};
	Arrays.sort(arr2);
	List<Integer> list2 = Arrays.asList(arr2);
	System.out.println(list2); //[10, 12, 21, 34, 50, 64]

集合轉陣列得用法:
List(物件).toArray()
List(物件).toArray()
如果不呼叫有參,給定泛值,那麼會返回Objext型別的陣列

###16.19_集合框架(集合巢狀之ArrayList巢狀ArrayList)(掌握)

  • A:案例演示
    • 集合巢狀之ArrayList巢狀ArrayList
      Eg:
      ArrayList <ArrayList> l = new ArrayList<>();

      ArrayList l1 = new ArrayList<>();
      l1.add(“a1”);
      l1.add(“b1”);
      l1.add(“c1”);

      ArrayList l2 = new ArrayList<>();
      l2.add(“a2”);
      l2.add(“b2”);
      l2.add(“c2”);

      l.add(l1);
      l.add(l2);

      for(ArrayList a : l)
      {
      for(String s : a)
      System.out.println(s);
      System.out.println("-----------");
      }
      ###16.20_day16總結

  • 把今天的知識點總結一遍。