Java集合類總結 (五)

集合框架php

爲了不進行沒必要要的隨機訪問操做,Java引入了一種標籤接口RandomAccess, 這個接口沒有任何方法,只是一個標籤,用來標記一個集合是否應該進行隨機訪問操做:css

if (c instanceof RandomAccess)
{
    use random access algorithm
}
else
{
    use sequential access algorithm
}

Collection接口提供了不少基礎的方法方便使用,並且框架中也提供了不少抽象類實現Collection接口中的這些基礎方法:html

AbstractCollection
AbstractList
AbstractSequentialList
AbstractSet
AbstractQueue
AbstractMap

假如你要本身實現一個新的集合類,那麼直接擴展這些抽象類會更方便一些,由於你不用從新實現一些基礎的共通的方法了。
下面時集合框架提供的具體類:java

LinkedList
ArrayList
ArrayDeque
HashSet
TreeSet
PriorityQueue
HashMap
TreeMap

它們的繼承關係以下圖:
node

 

集合類的視圖與包裝類

Map集合有一個keyset方法,它就是一個返回視圖對象的方法,這個視圖對象實現了set接口,你經過其返回的視圖對象所作的全部操做都會反應到原來的Map對象上。nginx

Arrays類的asList方法將返回一個List接口的包裝類,asList方法傳入一個數組,返回一個實現了List接口的view對象。注意,返回的不是ArrayList對象,只是一個有get和set方法的view對象,用來訪問視圖後的數組。全部使用這個view對象改變數組的操做都會拋出UnsupportedOperationException異常。git

List<String> names = Arrays.asList("Amy", "Bob", "Carl");

 

集合的子集合

能夠使用subList方法去獲取一個list的子集合,以下,返回的也是一個view對象:github

List group2 = staff.subList(10, 20);

在view對象上進行的全部操做都會做用在原來的list上:web

List<String> testList = new ArrayList<String>();
testList.add("a");
testList.add("b");
testList.add("c");
testList.add("d");
testList.add("e");
testList.add("f");

System.out.println("Original list: \n" + testList);
System.out.println("Sublist: \n" + testList.subList(2, 4));
testList.subList(2, 4).clear();
System.out.println("Original list after clear :\n" + testList);
輸出:
Original list: 
[a, b, c, d, e, f]
Sublist: 
[c, d]
Original list after clear :
[a, b, e, f]

 

同步視圖

多線程操做須要使用同步視圖將非線程安全的集合對象包裝成爲線程安全的集合:ajax

Map<String, Employee> map = Collections.synchronizedMap(new HashMap<String, Employee>());

上面的代碼,使用Collections。synchronizedMap方法,將一個HashMap包裝爲線程安全的map對象,使用這個對象進行get與put都是線程安全的。

 

集合類與數組之間的轉換

數組轉爲集合類,直接使用Arrays.asList便可:

String[] values = . . .;
HashSet<String> staff = new HashSet<>(Arrays.asList(values));

集合類轉爲數組,使用toArray,傳入包含0個元素的數組類型,

String[] values = staff.toArray(new String[0]);
相關文章
相關標籤/搜索