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總結
-
- 把今天的知識點總結一遍。