定義:在Java中,集合是一種能夠存儲多個數據的容器。java
代碼:數組
1 ArrayList<String> list = new ArrayList<>(); 2 list.add("張三"); 3 list.add("王五"); 4 list.add("趙六"); 5 System.out.println(list); // [張三, 王五, 趙六]
區別:數組的長度是固定的,集合的長度是可變的。框架
代碼:ide
1 String[]strs = new String[2]; 2 strs[0] = "張三"; 3 strs[1] = "李四"; 4 // strs[2] = "趙六"; // 運行時報錯java.lang.ArrayIndexOutOfBoundsException 5 6 ArrayList<String> list = new ArrayList<>(); 7 System.out.println(list.size()); // 0 8 list.add("張三"); 9 list.add("王五"); 10 list.add("趙六"); 11 System.out.println(list.size()); // 3
集合按照其存儲結構能夠分爲兩大類,本篇先學習Collection學習
Collection集合介紹spa
單列集合類的根接口code
有兩個子接口對象
java.util.List;特色是:內容可重複,有序blog
java.util.Set; 特色是:內容不可重複,無序繼承
定義了單例集合最共性的方法。
圖解Collection框架結構
Collection中通用方法
方法:
public boolean add(E e)
: 把給定的對象添加到當前集合中 。
public void clear()
:清空集合中全部的元素。
public boolean remove(E e)
: 把給定的對象在當前集合中刪除。
public boolean contains(E e)
: 判斷當前集合中是否包含給定的對象。
public boolean isEmpty()
: 判斷當前集合是否爲空。
public int size()
: 返回集合中元素的個數。
public Object[] toArray()
: 把集合中的元素,存儲到數組中。
代碼:
List<String> list = new ArrayList<>(); // 添加元素 list.add("張三"); list.add("李四"); System.out.println(list); // 移除元素 list.remove("張三"); System.out.println(list); // 判斷集合中是否包含某個元素 boolean isHas = list.contains("張三"); System.out.println(isHas); // false // 判斷當前集合是否爲空 boolean isEmpty = list.isEmpty(); System.out.println(isEmpty); // 清空元素 list.clear(); System.out.println(list); // 集合的長度 System.out.println(list.size()); // 集合中的元素存儲到一個數組中 Object[]s = list.toArray();
Iterator方式
介紹
Iterator,是一個迭代器接口。Collection中的成員方法iterator()被調用後,會返回一個Iterator對象。利用這個對象能夠實現遍歷集合。
如何遍歷呢?在取元素以前先要判斷集合中有沒有元素,若是有,就把這個元素取出來,繼續在判斷,若是還有就再取出出來。一直把集合中的全部元素所有取出。這種取出方式專業術語稱爲迭代。
Iterator對象的成員方法:
hasNext(); 檢測集合中是否存在下一個元素
next(); 找到並獲取下一個元素
迭代器的原理
在調用Iterator的next方法以前,迭代器的索引位於第一個元素以前,不指向任何元素,當第一次調用迭代器的next方法後,迭代器的索引會向後移動一位,指向第一個元素並將該元素返回,當再次調用next方法時,迭代器的索引會指向第二個元素並將該元素返回,依此類推,直到hasNext方法返回false,表示到達了集合的末尾,終止對元素的遍歷。
代碼:
1 List<String> list = new ArrayList<>(); 2 list.add("張三"); 3 list.add("李四"); 4 list.add("王五"); 5 // 獲得一個迭代器對象 6 Iterator<String> it = list.iterator(); 7 while (it.hasNext()) { 8 String str = it.next(); 9 System.out.println(str); 10 }
加強for
介紹
加強for循環(也稱for each循環)是JDK1.5之後出來的一個高級for循環,專門用來遍歷數組和集合的。它的內部原理實際上是個Iterator迭代器,因此在遍歷的過程當中,不能對集合中的元素進行增刪操做。
使用格式
for(元素的數據類型 變量 : Collection集合or數組){
//寫操做代碼
}
代碼:
for (String name:list) {
System.out.println(name);
}
泛型,未知的類型,能夠在類或方法中預支地使用未知的類型。
能夠避免類型轉換的麻煩。
格式:修飾符 class 類名<表明泛型的變量> { }
使用泛型:在建立對象的使用。也就是在建立對象時肯定泛型的類型。
代碼:
1 2 public class ArrayList<E> { 3 public boolean add(E e){ } 4 ... 5 } 6 7 public class MainDemo{ 8 public static void main(String[] args) { 9 ArrayList<String> list = new ArrayList<>(); 10 list.add("張三"); 11 } 12 }
格式:修飾符 <表明泛型的變量> 返回值類型 方法名(參數){ }
代碼:
1 2 public static void main(String[] args) { 3 methon1("張三"); 4 } 5 public static <M> void methon1(M m){ 6 System.out.println(m); 7 }
格式:修飾符 interface接口名<表明泛型的變量>
代碼:
1 2 public interface TestInterface<T> { 3 public abstract void show(T t); 4 } 5 6 public class<T> TestImpl implements TestInterface<T> { 7 @Override 8 public T void show(T o) { 9 System.out.println(o); 10 } 11 } 12 13 public class Main01 { 14 public static void main(String[] args) { 15 TestImpl<String> t = new TestImpl<>(); 16 t.show("個人信息"); 17 18 } 19 20 }
介紹
不知道使用什麼類型來接收的時候,此時可使用?,?表示未知通配符。
此時只能接受數據,不能往該集合中存儲數據。
代碼:
1 public static void main(String[] args) { 2 ArrayList<String> list1 = new ArrayList<>(); 3 list1.add("張三"); 4 list1.add("李四"); 5 ArrayList<Integer> list2 = new ArrayList<>(); 6 list2.add(1); 7 list2.add(2); 8 print(list1); 9 print(list2); 10 } 11 // 定義一個方法打印集合,不肯定將來集合中的元素類型,<>中不能寫入Object中,由於泛型中不存在繼承關係。 12 public static void print(ArrayList<?> list){ 13 System.out.println(list); 14 }
受限1:類型名稱 <? extends 類 > 對象名稱
只能接收該類型或該類型的子類
受限2: 類型名稱 <? super 類 > 對象名稱
只能接收該類型或該類型的父類
代碼:
1 public static void main(String[] args) { 2 Collection<Integer> list1 = new ArrayList<Integer>(); 3 Collection<String> list2 = new ArrayList<String>(); 4 Collection<Number> list3 = new ArrayList<Number>(); 5 Collection<Object> list4 = new ArrayList<Object>(); 6 7 getElement(list1); 8 getElement(list2);//報錯 9 getElement(list3); 10 getElement(list4);//報錯 11 12 getElement2(list1);//報錯 13 getElement2(list2);//報錯 14 getElement2(list3); 15 getElement2(list4); 16 17 } 18 // 泛型的上限:此時的泛型?,必須是Number類型或者Number類型的子類 19 public static void getElement1(Collection<? extends Number> coll){} 20 // 泛型的下限:此時的泛型?,必須是Number類型或者Number類型的父類 21 public static void getElement2(Collection<? super Number> coll){}
需求:
實現發牌功能,而且展現底牌。
代碼:
1 package it.leilei.cn.demo05; 2 3 import java.util.ArrayList; 4 import java.util.Collection; 5 import java.util.Collections; 6 7 public class Main01 { 8 public static void main(String[] args) { 9 // 1. 準備牌 10 // 牌的花色 11 String[]colors = {"♥","♠","♣","♦"}; 12 // 牌的數字 13 String[]nums = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"}; 14 // 2. 組裝裝牌 15 ArrayList<String> poker = new ArrayList<>(); 16 for (String num:nums) { 17 for (String color:colors) { 18 poker.add(num + color); 19 } 20 } 21 poker.add("大王"); 22 poker.add("小王"); 23 24 // 3. 發牌 25 ArrayList<String> list1 = new ArrayList<>(); 26 ArrayList<String> list2 = new ArrayList<>(); 27 ArrayList<String> list3 = new ArrayList<>(); 28 ArrayList<String> diPai = new ArrayList<>(); 29 30 // 打亂牌 31 Collections.shuffle(poker); 32 33 for (int i = 0,len = poker.size(); i < len;i++) { 34 if(i>=51) { 35 diPai.add(poker.get(i)); 36 }else if(i%3==0) { 37 list1.add(poker.get(i)); 38 }else if(i%3==1) { 39 list2.add(poker.get(i)); 40 }else if(i%3==2) { 41 list3.add(poker.get(i)); 42 } 43 } 44 45 System.out.println("周星馳:" + list1); 46 System.out.println("劉德華:" + list2); 47 System.out.println("周潤發:" + list3); 48 System.out.println("底牌:" + diPai); 49 50 } 51 }