1、泛型
升級三特性:高效、安全、簡化書寫。
泛型是JDK1.5版本以後出現的新特性,用於解決安全問題,是一個安全機制。
泛型好處:第一、將運行時期出現的問題ClassCastException,轉移到了編譯時間期,方便程式員解決問題,讓運行時問題減少,提高安全性。第二、避免強制轉換麻煩。
2、泛型格式
泛型格式:通過<>來定義要操作的引用資料類型。
在使用java提供的對象時,什麼時候用泛型呢?通常在集合架構中很常見,只要看見<>就要定義泛型。其實<>就是用來接收類型的。當使用集合時,將集合中要儲存的資料類型作為參數傳到<>中即可。Object類沒有泛型。
3、泛型類
什麼時候定義泛型類?當類中要操作的引用資料類型不確定的時候,早期定義Object來完成擴充,現在定義泛型來完成擴充。
4、泛型方法
泛型類缺點:泛型方法會隨泛型類!泛型類定義的泛型,在整個類中有效。如果被方法使用,那麼泛型類的對象明確要操作的具體類型後,所有要操作的類型就已經固定了。為了讓不同方法操作不同類型,而且類型還不確定,就可以將泛型定義在方法上。
//泛型類缺點class Demo<T>{ public void show(T t){ System.out.println("show:"+t); } public void print(T t){ System.out.println("print:"+t); }}//泛型方法優點class Demo{ public <T> void show(T t){ System.out.println("show:"+t); } public <Q> void print(Q q){ System.out.println("show:"+q); }}
5、靜態方法泛型
特殊之處:靜態方法不可以訪問類上定義的泛型,如果靜態方法操作的應用資料類型不確定,可以將泛型定義在方法上。
6、泛型介面
泛型介面和泛型類差不多定義,
interface Inter<T>{
void show(T t);
}
7、泛型萬用字元
也可以理解為預留位置:<?>。當類型不確定時,用萬用字元替代具體的類型。
加了泛型就沒具體的類型,要使用泛型就要強轉成用的類型。
8、泛型限定
上限:<? extends E>,E為父類,?為子類。可以使用E 或者 E的子類。
下限:<? super E>,E為子類,?為父類。可以使用E 或者 E的父類。
import java.util.*;class Person{ private String name; Person(String name){ this.name = name; } public String getName(){ return this.name; } public String toString(){ return "person:"+name; }}class Student extends Person{ Student(String name){ super(name); } }class Worker extends Person{ Worker(String name){ super(name); } }/*上限:<? extends E>,E為父類,?為子類。可以使用E 或者 E的子類。下限:<? super E>,E為子類,?為父類。可以使用E 或者 E的父類。*//*class MyComparator implements Comparator<Student>{ public int compare(Student stu1,Student stu2){ return stu1.getName().compareTo(stu2.getName()); } }class MyComparator2 implements Comparator<Worker>{ public int compare(Worker stu1,Worker stu2){ return stu1.getName().compareTo(stu2.getName()); } }*/class MyComparator3 implements Comparator<Person>{ public int compare(Person stu1,Person stu2){ return stu1.getName().compareTo(stu2.getName()); } }public class GenericDemo07{ public static void main(String[] args){ TreeSet<Student> ts = new TreeSet<Student>(new MyComparator3()); ts.add(new Student("abc003---student")); ts.add(new Student("abc004---student")); ts.add(new Student("abc001---student")); ts.add(new Student("abc06---student")); Iterator<Student> it = ts.iterator(); while(it.hasNext()){ System.out.println(it.next().getName()); } TreeSet<Worker> ts2 = new TreeSet<Worker>(new MyComparator3()); ts2.add(new Worker("abc003---***WORKER")); ts2.add(new Worker("abc004---***WORKER")); ts2.add(new Worker("abc001---***WORKER")); ts2.add(new Worker("abc06---***WORKER")); Iterator<Worker> it2 = ts2.iterator(); while(it2.hasNext()){ System.out.println(it2.next().getName()); } }}
9、Map<K,V>集合:該集合儲存索引值對。一對一往裡存,而且要保證鍵的唯一性。
第一、添加
V put(K?key,V?value):put返回原來的值。添加元素,添加相同的鍵,那麼後添加的值會覆蓋原有鍵對應值,且put方法會返回原有的值。
void putAll(Map<? extends K,? extends V>?m)
第二、刪除
void clear()
V remove(Object?key)
第三、判斷
boolean containsKey(Object?key)
boolean containsValue(Object?value)
boolean isEmpty()
第四、擷取
V get(Object?key)
int size()
Collection<V> values()
Set<Map.Entry<K,V>> entrySet()
Set<K> keySet()
10、Map集合層
Map
|---Hashtable:底層是雜湊表資料結構,不可以存入null鍵null值。該集合是同步的。JDK1.0效率低。
|---HashMap:底層是雜湊表資料結構,可以存入null鍵null值。該集合是不同步的。JDK1.2效率高。除了這2點相同外,其餘HashMap和HashMap差不多。
|---TreeMap:底層是二叉樹資料結構。線程不同步。可以用於給Map集合中的鍵進行排序。
Map和Set很像,其實Set底層就是使用了Map集合。
11、map集合的兩種取出方法
第一種、Set<K> keySet:將Map中所有的鍵存入到Set集合中,因為Set集合具備迭代器。所以可以利用迭代方式取出所有的鍵,再根據get方法擷取每一個鍵對應的值。
Map集合的取出原理:將Map集合轉成Set集合,再通過迭代器取出。
第二種、Set<Map.Entry<k,v>> entrySet:將Map集合中的映射關係存入到Set集合中,這個關係的資料類型就是Map.Entry。
import java.util.*;
public class MapDemo02{
public static void main(String[] args){
Map<String,String> map = new HashMap<String,String>();
map.put("02","zhangsan02");
map.put("03","zhangsan03");
map.put("01","zhangsan01");
map.put("04","zhangsan04");
//第一步、先將Map集合中所有的鍵取出,存入到的Set集合,使用的方法是keySet();
Set<String> keySet = map.keySet();
//第二步、有了Set集合,就可以擷取Set集合迭代器;
Iterator<String> it = keySet.iterator();
while(it.hasNext()){
String key = it.next();
//第三步、有了鍵就可以通過Map集合的get方法擷取其對應的值。
String value = map.get(key);
sop("key:"+key+",value:"+value);
}
//第一步、先將Map集合中的映射關係取出,存入到set集合中,使用的方法是entrySet();
//Map.Entry<String,String>是一種資料類型,儲存的是鍵和值得關係;
Set<Map.Entry<String,String>> entrySet = map.entrySet();
//第二步、利用Set迭代器,將Set集合中映射關係取出;
Iterator<Map.Entry<String,String>> it = entrySet.iterator();
//第三步、利用Map.Entry介面自身的方法將鍵和值從映射關係中取出。
while(it.hasNext()){
Map.Entry<String,String> me= it.next();
sop(me.getKey()+":"+me.getValue());
}
}
public static void sop(Object obj){
System.out.println(obj);
}
}
12、Map.Entry<K,V>介面
Entry也是一個介面,他是Map介面中的一個內部介面。
interface Map{
public static interface Entry{
public abstract Object getKey();
public abstract Object getValue();
}
}
class HashMap implements Map{
class MapEntry implements Map.Entry{//內部類
public Object getKey(){…}
public Object getValue(){…}
}
}
13、Map擴充
映射關係可以為:一對多、集合的嵌套。
集合架構圖
向上的實線為集合間的介面;
向上的虛線為集合間的實作類別;