所謂泛型,就是容許在定義類、接口時經過一個標識表示類中某個屬性的類 型或者是某個方法的返回值及參數類型。這個類型參數將在使用時(例如, 繼承或實現這個接口,用這個類型聲明變量、建立對象時)肯定(即傳入實 際的類型參數,也稱爲類型實參)。java
從JDK1.5之後,Java引入了「參數化類型(Parameterized type)」的概念, 容許咱們在建立集合時再指定集合元素的類型,正如:List,這代表 該List只能保存字符串類型的對象。安全
JDK1.5改寫了集合框架中的所有接口和類,爲這些接口、類增長了泛型支持, 從而能夠在聲明集合變量、建立集合對象時傳入類型實參。框架
在集合中使用泛型:code
add(E e)
→實例化之後:add(Integer e)
java.lang.Object類型
。在集合中使用泛型以前的狀況(以ArrayList爲例)對象
public void test() { ArrayList list = new ArrayList(); // 要求:存放數字 list.add(123); list.add(456); list.add(848); list.add(-485); // 問題一:類型不安全 list.add("Tom"); for (Object score : list) { // 問題二:強轉時,可能出現ClassCastException異常 int stuScore = (Integer) score; System.out.println(stuScore); } }
在集合中使用泛型的狀況(以ArrayList爲例)繼承
public void test2() { ArrayList<Integer> list = new ArrayList<Integer>(); // JDK 7新特性:類型推斷 // ArrayList<Integer> list = new ArrayList<>(); list.add(85); list.add(75); list.add(15); list.add(-87); // 編譯時,就會進行檢查,保證數據的安全 //list.add("Tom"); // 方式一 for (Integer score : list) { // 避免了強轉操做 int stuScore = score; System.out.println(stuScore); } // 方式二 Iterator<Integer> iterator = list.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } }
在集合中使用泛型的狀況(以HashMap爲例)接口
public void test3() { HashMap<String, Integer> map = new HashMap<String, Integer>(); // JDK 7新特性:類型推斷 HashMap<String, Integer> map = new HashMap<>(); map.put("Tom",87); map.put("Jerry",65); map.put("Mack",87); // map.put(125,"ABC"); // 泛型的嵌套 Set<Map.Entry<String,Integer>> entry = map.entrySet(); Iterator<Map.Entry<String,Integer>> iterator = entry.iterator(); while (iterator.hasNext()) { Map.Entry<String,Integer> e = iterator.next(); String key = e.getKey(); Integer value = e.getValue(); System.out.println(key + "-----" + value); } }