java集合遍歷中的向下轉型、泛型
阿新 • • 發佈:2018-11-12
java中集合儲存字串時,集合的get(i)方法是獲取集合中的第i+1個元素,而這個元素是Object型別,而Object型別沒有length()方法,遍歷的時候如果直接.length()會報錯。如果想使用字串的方法,就必須把元素還原成字元(向下轉型)。
集合的遍歷。其實就是依次獲取集合中的每一個元素。
Object[] toArray():把集合轉成陣列,可以實現集合的遍歷。
/* * 集合的遍歷。其實就是依次獲取集合中的每一個元素。 * * Object[] toArray():把集合轉成陣列,可以實現集合的遍歷 */ public class CollectionDemo3 { public static void main(String[] args) { // 建立集合物件 Collection c = new ArrayList(); // 新增元素 c.add("hello"); // Object obj = "hello"; 向上轉型 c.add("world"); c.add("java"); // 遍歷 // Object[] toArray():把集合轉成陣列,可以實現集合的遍歷 Object[] objs = c.toArray(); for (int x = 0; x < objs.length; x++) { // System.out.println(objs[x]); // 我知道元素是字串,我在獲取到元素的的同時,還想知道元素的長度。 // System.out.println(objs[x] + "---" + objs[x].length()); // 上面的實現不了,原因是Object中沒有length()方法 // 我們要想使用字串的方法,就必須把元素還原成字串 // 向下轉型 String s = (String) objs[x]; System.out.println(s + "---" + s.length()); } } }
引入泛型,能夠避免這一問題。
ArrayList儲存字串並遍歷:
我們按照正常的寫法來寫這個程式, 結果確出錯了。
為什麼呢?
因為我們開始儲存的時候,儲存了String和Integer兩種型別的資料。
而在遍歷的時候,我們把它們都當作String型別處理的,做了轉換,所以就報錯了。
但是呢,它在編譯期間卻沒有告訴我們。
所以,我就覺得這個設計的不好。
回想一下,我們的陣列
String[] strArray = new String[3];
strArray[0] = "hello";
strArray[1] = "world";
strArray[2] = 10;
集合也模仿著陣列的這種做法,在建立物件的時候明確元素的資料型別。這樣就不會在有問題了。
而這種技術被稱為:泛型。
泛型:是一種把型別明確的工作推遲到建立物件或者呼叫方法的時候才去明確的特殊的型別。引數化型別,把型別當作引數一樣的傳遞。
格式:
<資料型別>
此處的資料型別只能是引用型別。
好處:
A:把執行時期的問題提前到了編譯期間
B:避免了強制型別轉換
C:優化了程式設計,解決了黃色警告線
public class GenericDemo { public static void main(String[] args) { // 建立 ArrayList<String> array = new ArrayList<String>(); // 新增元素 array.add("hello"); array.add("world"); array.add("java"); // array.add(new Integer(100)); //array.add(10); // JDK5以後的自動裝箱 // 等價於:array.add(Integer.valueOf(10)); // 遍歷 Iterator<String> it = array.iterator(); while (it.hasNext()) { // ClassCastException // String s = (String) it.next(); String s = it.next(); System.out.println(s); } // 看下面這個程式碼 // String[] strArray = new String[3]; // strArray[0] = "hello"; // strArray[1] = "world"; // strArray[2] = 10; } }