Collection,泛型,Map
1.Collection集合
集合和陣列的區別?
- 陣列的長度是固定的, 集合的長度是可變的
- 陣列中儲存的資料都是同一型別的資料。集合儲存的是物件,而且物件的型別可以不一致
集合框架
單列集合
java.util.Collection
Collection:單列集合的跟介面,用於儲存一系列的規則的元素
兩個子介面:
- java.util.List: List中元素是有序,元素可重複
- 實現類:java.util.ArrayList, java.util.LinkedList
- Java.util.Set: Set中元素無序,不重複
- 實現類:java.util.HashSet, java.util.TreeSet
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()
:把集合的元素儲存到陣列中import java.util.ArrayList; import java.util.Colleaction; public class Demo{ public static void main(String[] args){ // 建立集合物件,使用多型 Collection<String> coll new ArrayList<String>(); //使用方法 // 新增 coll.add("楊冪").add("劉亦菲").add("唐嫣").add("胡珺"); System.out.println(coll); // 判斷是否在集合中 System.out.println("判斷胡珺是否在集合中"+coll.contains("胡珺")); // 判斷集合是否為空 System.out.println(coll.isEmpty()); // 集合中有多少個元素 System.out.println(coll.sixe()); // 刪除指定的元素 coll.remove("胡珺"); // 集合儲存到陣列中 Object[] object = coll.toArray(); //遍歷陣列 for(int i=0;i<object.length;i++){ System.out.println(i); } // 清空集合 coll.clean(); } }
2.Iterator迭代器
迭代
- 在集合中獲取元素之前進行判斷集合中有沒有元素,如果有取出來,繼續進行判斷,繼續取出來,知道集合元素全部取出
Iterator的常用方法
public E next()
:返回迭代的下一個元素public boolean hasNext()
:如果有元素可以迭代,則返回True
public class Demo{
public static void main(String[] args){
//使用多肽建立集合
Collection<String> coll = new ArrayList<String>();
// 新增元素
coll.add("楊冪").add("胡珺").add("程銳");
//使用迭代器進行遍歷
Iterator<String> it = coll.iterator();
// 泛型值得是: 迭代出來的資料型別
while(it.hasNext()){//判斷是否有迭代元素
String s = it.next(); //獲取迭代的元素
System.out.println(s);
}
}
}
增強for
格式:
for(元素的資料型別 變數:Collection集合或者陣列){
//操作程式碼
}
它用於變數Collection和陣列, 不要在遍歷的時候對集合元素進行曾刪操作
public class Demo{
public static void main(String[] args){
int[] arr = {1,2,3,4,5};
for(int i:arr){
System.out.println(i);
}
}
}
public class Demo{
public static void main(String[] args){
Collection<String> coll = new ArrayList<String>();
coll.add("112");
coll.add("113");
coll.add("114");
for(String s:coll){
System.out.println(s);
}
}
}
只針對Collection和陣列, 用於遍歷
3.泛型
在從集合中存取資料,資料將被提升為Object型別,當我們取出一個的物件,進行操作,這個時候需要型別轉換
泛型:可以再類或者是方法中預支的使用未知的資料型別
一般在建立物件是,當沒有指定型別的時候,預設是Object型別
泛型好處
- 將執行售後的ClassCastException,轉移到了編譯時期變成編譯失敗
- 避免了型別強轉的麻煩
public class Demo{
public static void main(String[] args){
collection<String> coll = new ArrayList<String>();
coll.add("abd");
coll.add("aaa");
//coll.add(5); 當集合明確型別後, 存放型別不一致就會編譯錯誤
// 集合已經明確的具體存放的元素型別,那麼在使用迭代器的時候,迭代器也同樣知道具體遍歷元素型別
Iterator<String> it = coll.iterator();
while(it.hasNext()){
//當使用Iterator控制的元素型別之後,就不要強轉了,獲取的元素就是String型別
String str = it.next();
System.out.println(str);
}
}
}
泛型是資料泛型的一部分,我們將類名和泛型合併起來一起看做資料型別
泛型的定義與使用
我們在集合中通常使用到了泛型
泛型,用來靈活的將資料型別應用到不同的類,方法,介面當中。將資料型別作為引數進行傳遞
定義和使用含有泛型的類
定義格式:
修飾符 class 類名<代表泛型的變數>{}
demo
ArrayList集合;
public class ArrayList<E>{
public boolean add(E e){}
public E get(int index){}
....
}
使用泛型:即什麼時候確定泛型
在建立物件的時候使用泛型
例如:ArrayList
此時就可以理解變數E的值就是String型別,那麼理解為
public class ArrayList<String>{
public boolean add(String e){}
public String get(int index){}
}
再例如,ArrayList
此時理解為E的值就是Integer
public class ArrayList<Integer>{
public boolean add(Integer e){}
public Integer get(int index){}
}
demo
public class MyGenericClass<MVP>{
//沒有MVP型別,在這裡帶變得是一種未知型別, 傳遞什麼型別就是什麼型別
private MVP mvp;
public void setMVP(MVP mvp){
this.mvp = mvp;
}
public MVP getMVP(){
return mvp;
}
}
使用
public class GenericClassDemo{
public static main(String[] args){
// 建立一個泛型為Integer的類
MyGenericClass<Integer> myNum = new MyGenericClass<Integer>();
myNum.setMVP(124);
Integer mvpNum = myNum.getMVP();
System.out.println(mvpNum);
//建立一個泛型為String的類
MyGenericClass<String> myStr = new MyGenericClass<String>();
myNum.setMVP("哈哈");
String mvpStr = myStr.getMVP();
System.out.println(mvpStr);
}
}
含有泛型的方法
定義格式:
修飾符 <代表泛型的變數> 返回值型別 方法名(引數){}
例如
public class MyGenericMethod{
public <MVP> void show(MVP mvp){
System.out.println(mvp.getClass());
}
public <MVP> MVP show2(MVP mvp){
return mvp;
}
}
使用格式: 呼叫方法時,確定泛型的型別
public class GenericMethodDemo{
public static void main(String[] args){
//建立物件
MyGenericMethod mm = new MyGenericMethod();
//演示看方法提示
mm.show("aaa");
mm.show(12);
}
}
含有泛型的介面
定義格式:
修飾符 Interface介面名 <代表泛型的變數>{}
例如
public interface MyGenericInterFace<E>{
public abstract void add(E e);
public abstract E getE();
}
使用格式:
1.定義類是確定泛型的型別
例如
public class MyImpl implements MyGenericInterFace<String>{
@Override
public void add(String e){
//...
}
@Override
public void getE(){
return null;
}
}
//此時泛型E的值就是String型別
2.始終不確定泛型的型別,直接建立物件時,確定泛型的型別
例如
public class MyImpl<E> implements MyGenericInterFace<E>{
@Override
public void add(E e){
//...
}
@Override
public void getE(){
return null;
}
}
確定泛型:
public class GenericInterFace{
public static void main(String[] args){
MyImpl<String> my = new MyImpl<String>();
my.add("aaa");
}
}
泛型萬用字元
當我們使用泛型或者是介面的時候,傳遞的資料中,泛型型別不確定,可以通過萬用字元<?>表示,但是一旦使用泛型的萬用字元之後,只能使用Object類中的共性方法,集合中元素自身的方法無法使用。
萬用字元的基本使用
泛型的萬用字元:不知道使用什麼型別來接收的時候,此時可以使用??表示未知萬用字元
此時只接受資料,不能再集合中儲存資料
例子:
public class Demo{
public static void main(String[] args){
Collection<Integer> list1 = new ArrayList<Integer>();
getElement(list1);
Collection<String> list2 = new ArrayList<String>();
getElement(list2);
}
public static void getElement(Collection<?> coll){
// ? 代表可以接受任意型別
}
}
泛型不存在繼承關係,Collection