泛型在類柴底、方法婿脸、接口中的使用
1.泛型在類中的使用
為什么要在類上使用泛型?
(1).為了讓當(dāng)前的Tool1類可以通過給更多類型的對象傳值
(2).不需要再進(jìn)行類型轉(zhuǎn)換柄驻,就可以避免錯誤發(fā)生
//使用泛型前
class Tool{
private Object obj;
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
}
//使用泛型后
/*
E:代表任意一種引用數(shù)據(jù)類型,<>中不一定是E抑钟,可以使用任意字符
相當(dāng)于在給類使用泛型
-
使用:在類上確定的泛型可以直接在內(nèi)部成員上使用
*/
class Tool1<E>{
private E obj;public E getObj() {
return obj;
}public void setObj(E obj) {
this.obj = obj;
}
}
2.泛型在方法中的使用
class Test<E e>{
//1.方法上的泛型與類上的泛型保持一致,一旦類上的泛型確定了在塔,方法上的就確定了
public E show(E e){
return e;
}
//2.方法上使用自己的泛型
注意:泛型在使用之前一定要進(jìn)行聲明
聲明的方法:在方法的最前面使用<泛型類型>
作用:讓方法的內(nèi)部與方法的泛型保持一致
public <F> void play(F f){
ArrayList<F> list = new ArrayList<>();
}
//3.靜態(tài)方法使用泛型
//類上的泛型無法在靜態(tài)方法上使用蛔溃,靜態(tài)方法必須自己定義
public static <W> void song(W w){
}
}
總結(jié):泛型在方法中的使用,只有與類保持一致的類型是贺待,不需要重新聲明,方法中使用自己的泛型以及靜態(tài)方法都需要重新聲明泛型類型
3.泛型在接口中使用
interface Inter<E>{
public void shoe(E e);
}
//相應(yīng)的子類使用泛型的方式
//1.接口有泛型疟位,子類沒有遵守對應(yīng)的泛型
兩種情況:
a.對于重寫的接口方法:泛型的和接口的保持一致喘垂,即方法的泛型也要給一個具體的類型
b.對于自己特有的方法,可以與接口一致正勒,也可以自己定義泛型
class Pig implements Inter<String>{
第一種情況:
public void show(String e){
}
第二種情況:
public <F>void play(F f){
}
}
2.接口有泛型,子類遵守對應(yīng)的泛型
類上的泛型確定了祥绞,接口上的就確定了鸭限,重寫方法上也確定了
class Dog<E> implements Inter<E>{
public void show(E e){
}
}
總結(jié):接口上的泛型,在子類實現(xiàn)的時候败京,如果接口后面接著一個具體的類型(比方說:String),就不需要在類后面聲明了朴皆,如果接口后面是E、F遂铡、W等抽象的類型晶姊,即使類型和接口中的一模一樣,也要聲明,就需要在類后面聲明:<E>超歌、<F>蒂教、<W>
限制上限:<? extends E>:限制的是整個<>可以取的泛型的類型上限是E,<>中可以取的泛型是E類以及E的子類
限制下限:<? super E>:限制的是整個<>可以取的泛型的類型下限是E凝垛,<>中可以取的泛型是E 類及E的父類
collection:直接存儲的元素(值)
Map:本身是一個接口,存儲的是鍵值對炭分,Map中一個元素是一個鍵值對(key:鍵剑肯,value:值),key必須保證唯一让网,value可以相同
分類:HashMap:底層是哈希表,線程不安全的
TreeMap:底層是二叉樹而账,線程不安全的
//創(chuàng)建一個 Map<鍵的類型因篇,值的類型>
Map<String,String> map = new Map<>();
//1.增加: V put(K key, V value) 一次增加一份鍵值對
map.put("01","java");
map.put("02","php");
//因為key是唯一的竞滓,如果給同一個key重復(fù)賦值,后面的值會將前面的覆蓋掉汽烦,并將覆蓋的值返回莉御,如果第一次使用key俗冻,返回null
String value3 = map.put("01","ios");//value是java
//void putAll(map<? extends K,? extends V> map)
Map<String,String> map1=new HashMap>?();
map1.put("03","html");
map1.put("04","python");
map.putAll(map1);
2.刪除
//V remove (Object key) 根據(jù)key刪除元素,并將刪除的元素返回
map.remove("01")//刪除只需要刪除key就可以刪除整個鍵值對
//void clear() 刪除全部迄薄!=null,而是一個空的集合
3.獲取
//V get(Object key) 根據(jù)key獲取一個值
map.get("02")
//int size() 返回鍵值對的個數(shù)
map.size();
//遍歷1:Set<K> KeySet
//遍歷2:Set<map.entry<K,V>> entrySet()
4.一些常用的判斷
//boolean isEmpty() 判斷是否為空
//boolean containsKey(Object key) 判斷是否包含當(dāng)前的Key
//boolean containsValue(Object value) 判斷是否半寒當(dāng)前的value
//遍歷1:Set<key> KeySet()
//原理:得到所有的key存放在set中涣易,利用set的迭代器遍歷得到key
//遍歷2:Set<Map.entry<K,V>> entrySet()
//原理:得到的是每個鍵值對對應(yīng)的映射關(guān)系類型的對那個(實體/entry對象),存在set中新症,利用set的迭代器遍歷得到entry,在利用entry獲取具體的value
public static void main(String[] args){
Map<String,String> map = new Map<>();
map.put("01","java");
map.put("02","php");
map.put("03","html");
map.put("04","python");
map.put("00","ok");
}
//1.使用Set<K> keyset()//這里是Map的引用來調(diào)用keyset
Set<String> set1 = map.keyset();
//獲取迭代器
Iterator<String> iterator = set1.iterator;
while(iterator.hasnext()){
String string = iterator.next();
System.out.println("key:"+String+" value:"+map.get(string));
}
//使用Set<Map.Entry<K,V>> entrySet()//Entry是Map中一個靜態(tài)接口
Set<Map.Entry<String,String>> set2 = map.entrySet();
//獲取迭代器
Iteraror<Map.Entry<String,String>> iterator = set2.iterator();
while(iterator.hasnet()){
Map.Entry<String,String> entry = iterator.next();
System.out.println("key:"+entry.getkey()+" value:"+entry.getvalue());
}
總結(jié):兩種迭代器荚醒,一種是通過將key存到Set中隆嗅,通過keySet方法存入,一個是將鍵值對的映射即Map.Entry存到Set中泡躯,即通過entrySet方法中丽焊,然后通過Set中遍歷進(jìn)行取值