泛型:主要為了解決程序中裝箱和拆箱的問題:
裝箱: 值類型-->引用類型 Object obj=1;
拆箱: 引用類型--->值類型 int number=(int)obj;
.自定義泛型接口、泛型類和泛型方法
從上面的內容中,大家已經明白了泛型的具體運作過程。也知道了接口、類和方法也都可以使用泛型去定義,以及相應的使用。是的,在具體使用時,可以分為泛型接口、泛型類和泛型方法。
自定義泛型接口、泛型類和泛型方法與上述Java源碼中的List、ArrayList類似。如下,我們看一個最簡單的泛型類和方法定義:
public class GenericTest { public static void main(String[] args) { Box<String> name = new Box<String>("corn"); System.out.println("name:" + name.getData()); } } class Box<T> { private T data; public Box() { } public Box(T data) { this.data = data; } public T getData() { return data; } }
在泛型接口、泛型類和泛型方法的定義過程中,我們常見的如T、E、K、V等形式的參數常用於表示泛型形參,由於接收來自外部使用時候傳入的類型實參。那么對於不同傳入的類型實參,生成的相應對象實例的類型是不是一樣的呢?
public class GenericTest { public static void main(String[] args) { Box<String> name = new Box<String>("corn"); Box<Integer> age = new Box<Integer>(712); System.out.println("name class:" + name.getClass()); // com.qqyumidi.Box
System.out.println("age class:" + age.getClass()); // com.qqyumidi.Box
System.out.println(name.getClass() == age.getClass()); // true
} }
由此,我們發現,在使用泛型類時,雖然傳入了不同的泛型實參,但並沒有真正意義上生成不同的類型,傳入不同泛型實參的泛型類在內存上只有一個,即還是原來的最基本的類型(本實例中為Box),當然,在邏輯上我們可以理解成多個不同的泛型類型。
究其原因,在於Java中的泛型這一概念提出的目的,導致其只是作用於代碼編譯階段,在編譯過程中,對於正確檢驗泛型結果后,會將泛型的相關信息擦出,也就是說,成功編譯過后的class文件中是不包含任何泛型信息的。泛型信息不會進入到運行時階段。
對此總結成一句話:泛型類型在邏輯上看以看成是多個不同的類型,實際上都是相同的基本類型。
如果集合設置為了泛型:只能存儲泛型變量及其子類。
map
Map:key-value 的鍵值對,key 不允許重復,value 可以
1、嚴格來說 Map 並不是一個集合,而是兩個集合之間 的映射關系。
2、這兩個集合沒每一條數據通過映射關系,我們可以看成是一條數據。即 Entry(key,value)。Map 可以看成是由多個 Entry 組成。
3、因為 Map 集合即沒有實現於 Collection 接口,也沒有實現 Iterable 接口,所以不能對 Map 集合進行 for-each 遍歷
最常用的實用類是HashMap
map接口常用方法:
1 public class MapText { 2 public static void main(String[] args) { 3 Map<String,String > map = new HashMap<String ,String>(); 4 map.put("1", "張飛"); 5 map.put("2", "說書人"); 6 map.put("3", "全聚德"); 7 map.put("4","斗魚"); 8 map.put("5", "一醉千里"); 9 System.out.println("key值為:1的用戶"+map.get("1"));//通過key獲取值 10 //通過key刪除鍵值對 11 map.remove("1"); 12 //maps中的鍵值對個數 13 System.out.println(map.size()); 14 System.out.println(map.containsKey("1")); 15 //判斷該Key在集合中是否存在 16 //containsValue:判斷值是否存在 17 18 //1:僅遍歷key 19 Set<String> keySet = map.keySet(); 20 for (String object : keySet) { 21 System.out.println("集合中的key:"+object); 22 } 23 24 //2:僅遍歷value 25 Collection<String> values = map.values(); 26 for(String item:values){ 27 System.out.println("集合中的value:"+item); 28 } 29 30 //3:key和value同時遍歷 Entry: 31 Set<Entry<String,String>> entrySet = map.entrySet(); 32 for (Entry<String,String> entry : entrySet) { 33 System.out.println("key:"+entry.getKey() +",Value:"+entry.getValue()); 34 35 } 36 } 37 }
Map接口
- Map提供了一種映射關系,其中的元素是以鍵值對(key-value)的形式存儲的,能夠實現根據key快速查找value;
- Map中的鍵值對以Entry類型的對象實例形式存在;
- 建(key值)不可重復,value值可以重復,一個value值可以和很多key值形成對應關系,每個建最多只能映射到一個值。
- Map支持泛型,形式如:Map<K,V>
- Map中使用put(K key,V value)方法添加
HashMap類
- HashMap是Map的一個重要實現類,也是最常用的,基於哈希表實現
- HashMap中的Entry對象是無序排列的
- Key值和value值都可以為null,但是一個HashMap只能有一個key值為null的映射(key值不可重復)
Map的遍歷方法
1、迭代器Iteraor
2、增強型for循環
3、通過鍵——值