黑馬:集合二

來源:互聯網
上載者:User

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擴充
映射關係可以為:一對多、集合的嵌套。

集合架構圖

向上的實線為集合間的介面

向上的虛線為集合間的實作類別

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.