1. 程式人生 > >列表、集合與陣列之間的轉化

列表、集合與陣列之間的轉化

陣列和ListSet都可以存放多個元素,陣列的特點是長度固定,訪問速度非常快,元素型別單一;List的特點是長度可以動態增加,能夠維護元素的次序,存入的所有元素都當做Object,允許元素重複;Set的特點是長度可以動態增加,能夠保證元素不重複,存入的所有元素都當做Object。本節例項介紹SetList和陣列之間如何轉換,將SetList物件中的元素轉換為陣列,將陣列轉換為SetList物件,轉換過程中元素保持不變。

關鍵技術剖析:

實現ListSet和陣列之間轉換的關鍵技術點如下:

² List轉換成陣列可以使用ListtoArray方法,返回一個Object陣列。

² Set

轉換成陣列可以使用SettoArray方法,返回一個Object陣列。

² 如果ListSet中元素的型別都為A,那麼可以使用帶引數的toArray方法,得到型別為A的陣列,具體語句是“(A[]set.toArray(new A[0])”。

² 陣列轉換成List可以使用ArraysasList靜態方法,得到一個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();

// 直接使用ArraysasList方法

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 listSet中元素型別單一時,可以使用帶引數的toArray方法,引數為目標陣列物件,如果目標陣列長度小於ListSet的元素個數時,在轉化時自動把目標陣列長度調整到L,如果目標陣列長度大於L,轉化時將ListSet的元素放到目標陣列的前L個位置。轉化後需要進行強制型別轉換,才能得到目標陣列。array1 = (String[]) set.toArray(new String[0]); array2 = (String[]) set.toArray(new String[set.size()]);

2 陣列轉化為ListSet時需要藉助ArraysasList方法,它將陣列轉化成一個List,可以用這個List構造SetSet set = new HashSet(Arrays.asList(array));