數組和List、Set都可以存放多個元素,數組的特點是長度固定,訪問速度非常快,元素類型單一;List的特點是長度可以動態增加,能夠維護元素的次序,存入的所有元素都當做Object,允許元素重復;Set的特點是長度可以動態增加,能夠保證元素不重復,存入的所有元素都當做Object。本節實例介紹Set、List和數組之間如何轉換,將Set、List對象中的元素轉換為數組,將數組轉換為Set、List對象,轉換過程中元素保持不變。
關鍵技術剖析:
實現List、Set和數組之間轉換的關鍵技術點如下:
List轉換成數組可以使用List的toArray方法,返回一個Object數組。
Set轉換成數組可以使用Set的toArray方法,返回一個Object數組。
如果List或Set中元素的類型都為A,那么可以使用帶參數的toArray方法,得到類型為A的數組,具體語句是“(A[])set.toArray(new A[0])”。
數組轉換成List可以使用Arrays的asList靜態方法,得到一個List。
數組轉化成Set時,需要先將數組轉化成List再用List構造Set。
import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; public class TestCollectionToArray { public static void main(String[] args) { List list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); // list.add(1);//會產生java.lang.ArrayStoreException異常 // 當list中的數據類型都一致時可以將list轉化為數組 Object[] array = list.toArray(); System.out.println("從list轉換成的對象數組長度為:" + array.length); // 在轉化為其它類型的數組時需要強制類型轉換,並且,要使用帶參數的toArray方法,參數為對象數組, // 將list中的內容放入參數數組中,當參數數組的長度小於list的元素個數時,會自動擴充數組的長度以適應list的長度 String[] array1 = (String[]) list.toArray(new String[0]); System.out.println("從list轉換成的字符串數組長度為:" + array1.length); // 分配一個長度與list的長度相等的字符串數組 String[] array2 = (String[]) list.toArray(new String[list.size()]); System.out.println("從list轉換成的字符串數組長度為:" + array2.length); list.clear(); // 將數組轉換成list for (int i = 0; i < array.length; i++) { list.add(array[i]); } System.out.println("將數組轉換成list的元素個數為:" + list.size()); list.clear(); // 直接使用Arrays的asList方法 list = Arrays.asList(array); System.out.println("將數組轉換成list的元素個數為:" + list.size()); Set set = new HashSet(); set.add("a"); set.add("b"); // 將set轉換為數組 array = set.toArray(); array1 = (String[]) set.toArray(new String[0]); array2 = (String[]) set.toArray(new String[set.size()]); System.out.println("從Set轉換成的對象數組長度為:" + array.length); System.out.println("從Set轉換成的字符串數組長度為:" + array2.length); // 數組轉換成Set // 將數組轉換成List后,再用List構造Set set = new HashSet(Arrays.asList(array)); System.out.println("將數組轉換成Set的元素個數為:" + list.size()); // 將Set清空,然后把數組轉換成的list全部add set.clear(); set.addAll(Arrays.asList(array1)); System.out.println("將數組轉換成Set的元素個數為:" + list.size()); } }
輸出結果為:
從list轉換成的對象數組長度為:4
從list轉換成的字符串數組長度為:4
從list轉換成的字符串數組長度為:4
將數組轉換成list的元素個數為:4
將數組轉換成list的元素個數為:4
從Set轉換成的對象數組長度為:2
從Set轉換成的字符串數組長度為:2
將數組轉換成Set的元素個數為:4
將數組轉換成Set的元素個數為:4
源碼分析:
l . 當list或Set中元素類型單一時,可以使用帶參數的toArray方法,參數為目標數組對象,如果目標數組長度小於List或Set的元素個數時,在轉化時自動把目標數組長度調整到L,如果目標數組長度大於L,轉化時將List或Set的元素放到目標數組的前L個位置。轉化后需要進行強制類型轉換,才能得到目標數組。array1 = (String[]) set.toArray(new String[0]); array2 = (String[]) set.toArray(new String[set.size()]);
2. 數組轉化為List或Set時需要借助Arrays的asList方法,它將數組轉化成一個List,可以用這個List構造Set。Set set = new HashSet(Arrays.asList(array));