集合:
集合和數組的區別:
- 數組的長度是固定的,而集合的長度是可變的
- 數組中的元素的類型是一致的,而集合中的元素可以不一致
- 數組中可以存儲基本數據類型的數據,而集合只能存儲引用數據類型的數據
集合體系圖:
-
單列集合:
- Collection:定義了所有單列集合共有的方法
- List:存取元素有序,可重複
- ArrayList
- LinkedList
- Vector 過時不用
- Set:存取元素無序,不可重複
- HashSet:
- LinkedHashSet:
- TreeSet:
- List:存取元素有序,可重複
- Collection:定義了所有單列集合共有的方法
-
雙列集合:
- Map:
- HashMap:
- LinkedHashMap:
- TreeMap:
- Map:
Collection集合(接口)
- public boolean add(E e) : 把給定的對象添加到當前集合中 。
// 創建集合對象
// 使用多態形式
Collection<String> coll = new ArrayList<String>();//父接口指向實現類的對象 多態
// 使用方法
// 添加功能 boolean add(String s)
coll.add("小李廣");
coll.add("掃地僧");
coll.add("石破天");
System.out.println(coll);
- public void clear() :清空集合中所有的元素。
// void clear() 清空集合
coll.clear();
System.out.println("集合中內容爲:"+coll)
- public boolean remove(E e) : 把給定的對象在當前集合中刪除。
//boolean remove(E e) 刪除在集合中的o元素
System.out.println("刪除石破天:"+coll.remove("石破天"));
System.out.println("操作之後集合中元素:"+coll);
- public boolean contains(E e) : 判斷當前集合中是否包含給定的對象。
// boolean contains(E e) 判斷o是否在集合中存在
System.out.println("判斷 掃地僧 是否在集合中"+coll.contains("掃地僧"));
- public boolean isEmpty() : 判斷當前集合是否爲空。
// boolean isEmpty() 判斷是否爲空
System.out.println(coll.isEmpty());
- public int size() : 返回集合中元素的個數。
// size() 集合中有幾個元素
System.out.println("集合中有"+coll.size()+"個元素")
- public Object[] toArray() : 把集合中的元素,存儲到數組中
// Object[] toArray()轉換成一個Object數組
Object[] objects = coll.toArray();
// 遍歷數組
for (int i = 0; i < objects.length; i++) {
System.out.println(objects[i]);
}
Collection 集合的遍歷:
所有的Collection集合都有一個迭代器用來遍歷集合中的元素
-
什麼是迭代
在取元素之前先要判斷集合中有沒有元素,如果有,就把這個元素取出來,繼續在判斷,如果還有就再取出來。一直把集合中的所有元素全部取出,這種取出方式專業術語稱爲迭代 -
如何獲取集合的迭代器
Iterator iterator() 返回此集合中的元素的迭代器
// 使用多態方式 創建對象
Collection<String> coll = new ArrayList<String>();
// 添加元素到集合
coll.add("串串星人");
coll.add("吐槽星人");
coll.add("汪星人");
//獲取coll集合的迭代器
Iterator<String> it = coll.iterator();
- 如何使用迭代器遍歷集合中的元素 iterator中的方法:
public E next() :返回迭代的下一個元素。
public boolean hasNext() :如果仍有元素可以迭代,則返回 true
//使用迭代器 遍歷 每個集合對象都有自己的迭代器
Iterator<String> it = coll.iterator();
// 泛型指的是 迭代出 元素的數據類型
while(it.hasNext()){ //判斷是否有迭代元素
String s = it.next();//獲取迭代出的元素
System.out.println(s);
}
增強for循環:
格式:
for(元素的數據類型 變量 : Collection集合or數組){
//寫操作代碼
}
int[] arr = {3,5,6,87};
//使用增強for遍歷數組
for(int a : arr){//a代表數組中的每個元素
System.out.println(a);
}
Collection<String> coll = new ArrayList<String>();
coll.add("小河神");
coll.add("老河神");
coll.add("神婆");
for(String s :coll){
System.out.println(s);
}
泛型:
概述:可以在類或方法中預支地使用未知的類型(就是一個未知的數據類型)
特點:泛型只能是引用數據類型
泛型的好處:
- 將運行時期的ClassCastException,轉移到了編譯時期變成了編譯失敗。
- 避免了類型強轉的麻煩
注意:
- 集合如果沒有指定元素的類型,那麼元素的類型默認是Object類型
自定義泛型和使用泛型:
- 定義泛型類和使用泛型類:
- 定義泛型類的語法格式:
修飾符 class 類名<代表泛型的變量> { }
public class 類名{
}
創建該泛型類對象的時候確定泛型的類型
- 定義泛型類的語法格式:
public class MyGenericClass<MVP> { //沒有MVP類型,在這裏代表 未知的一種數據類型 未來傳遞什麼就是什麼類型
private MVP mvp;
public void setMVP(MVP mvp) {
this.mvp = mvp;
}
public MVP getMVP() {
return mvp;
}
}
定義泛型方法和使用泛型方法
- 定義泛型方法的格式:
修飾符 <代表泛型的變量> 返回值類型 方法名(參數){ }
調用泛型方法的時候確定泛型的類型
public class MyGenericMethod {
public <MVP> void show(MVP mvp) {
System.out.println(mvp.getClass());
}
public <MVP> MVP show2(MVP mvp) {
return mvp;
}
}
定義泛型接口和使用泛型接口
- 定義泛型接口的格式:
修飾符 interface接口名<代表泛型的變量> { }
public interface 接口名{ }
1. 定義實現類的時候確定泛型的類型
2. 始終不確定泛型的類型,直到創建對象時,確定泛型的類型
public interface MyGenericInterface<E>{
public abstract void add(E e);
public abstract E getE();
}
泛型通配符
泛型的通配符:不知道使用什麼類型來接收的時候,此時可以使用?,?來表示未知通配符
此時只能接受數據,不能往該集合中存儲數據
泛型的上限:
格式: 類型名稱 <? extends 類 > 對象名稱
意義: 只能接收該類型及其子類
泛型的下限:
格式: 類型名稱 <? super 類 > 對象名稱
意義: 只能接收該類型及其父類型
// 泛型的上限:此時的泛型?,必須是Number類型或者Number類型的子類
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此時的泛型?,必須是Number類型或者Number類型的父類
public static void getElement2(Collection<? super Number> coll){}
注意:
泛型沒有繼承