Java集合物件和陣列物件的轉換
在開發中,我們經常需要將集合物件(List,Set)轉換為陣列物件,或者將陣列物件轉換為集合物件。Java提供了相互轉換的工具,但是我們使用的時候需要注意,不能亂用濫用。
1、陣列物件轉換為集合物件
最暴力的方式是new一個集合物件,然後遍歷陣列,依次將陣列中的元素放入到新的集合中,但是這樣做顯然過於麻煩。Java中有一個工具類Arrays類,提供一個方法asList()可以直接將陣列轉換為List集合。但是一定要注意,Arrays.asList(T... a)返回的是一個固定長度的ArrayList,是不能對返回的list進行add或者remove等操作的,因為返回的並不是java.util.ArrayList物件,是java.util.Arrays.ArrayList物件,是Arrays類的內部類。檢視原始碼可以知道如果對該類進行add等操作,是要丟擲異常的。該類的定義是起到一個橋樑作用,如果我們需要對轉換的List集合進行修改操作,我們可以通過List<T> list = new ArrayList<T>(Arrays.asList(array));的方式,這樣產生的list是覺得可以修改的。程式碼實現如下:
String[] arrStr = {"a","b","c"};
List<String> list1 = Arrays.asList(arrStr);
List<String> list2 = new ArrayList<String>(Arrays.asList(arrStr));
結論:如果我們需要將陣列轉換為可修改的集合List就使用List<T> list = new ArrayList<T>(Arrays.asList(array));如果我們對轉換的集合不修改就直接使用List list = Arrays.asList(array);
2、集合物件轉換為陣列物件
這個就簡單了一常用了,直接使用List介面的toArray方法。需要注意的是List有兩個過載的toArray方法,第一個List.toArray()返回Object[],第二個List.toArray(T[] a)返回T[].那到底使用哪個呢,兩種方法有什麼區別呢?第一種返回的是Object[]型別,如果我們想要轉換的陣列的型別不是Object,那就需要向下轉型,但是向下轉型會導致型別不相容,所以會丟擲異常,但是我們可以遍歷Object[]陣列,讓後將陣列中的每一個元素進行型別轉換,這樣就不會型別轉換異常。通常我們使用帶引數的方法,這樣就可以通過泛型,返回特定型別的陣列,就不用再依次轉換了。比如我們將List<String>轉換為String[],我們可以通過下面的程式碼實現:
List<String> listStr = new ArrayList<String>();
listStr.add("one");
listStr.add("two");
String[] arrStr1 = listStr.toArray(new String[] {});
String[] arrStr2 = listStr.toArray(arrStr1);
String[] arrStr3 = (String[]) listStr.toArray();//這樣是不行的。不能直接將Object[]轉換為String[]
結論:將集合轉換為陣列,最好使用toArray(T[] t)方法返回指定型別的陣列。
3、判斷某個元素是否屬於集合或者陣列
對於集合物件,提供了直接使用的方法。可以通過contailns方法判斷。當然也可以自己使用最暴力的方式,遍歷集合中的所有元素。
對於陣列物件,沒有直接使用的方法,我們可以使用最暴力的方式,遍歷陣列,但是顯然這樣做不優雅。所以我們可以藉助上面說的現將陣列物件轉換為集合物件,然後使用集合的contains方法。如果我們只是想判斷特定元素是否存在於陣列物件中,不對原資料進行修改,那麼就可以直接使用Arrays.asList()方法,生成一個固定大小的List,然後直接使用contains方法,具體程式碼如下:
List<String> listStr = new ArrayList<String>();
listStr.add("a");
listStr.add("b");
listStr.add("c");
boolean result1 = listStr.contains("d");//false
String[] arrStr= {"a","b","c"};
boolean result2 = Arrays.asList(arrStr).contains("a");//true