Java中的集合框架-Collections和Arrays
上一篇《Java中的集合框架-Map》把集合框架中的鍵值對容器Map中常用的知識記錄了一下,本節記錄一下集合框架的兩個工具類Collections和Arrays
一,Collections
Collections類中的方法全部都是靜態的,它可以對Collection和Map進行一些操作,並返回這些介面的物件或操作結果。
1,Collections的欄位
Collections有三個靜態欄位:EMPTY_LIST,EMPTY_MAP,EMPTY_SET;這三個欄位分別返回一個空的List,Map和Set並且是不可修改的,當我們試圖修改這三個返回的集合容器時,會丟擲java.lang.UnsupportedOperationException異常;只所以不能修改這三個返回的集合容器,原因是被返回的這三個容器都是final所修飾的。
2,Collections的方法
1 private static void fun_demo1() {
2 ArrayList list = new ArrayList();
3 Collections.addAll(list, "a", "b", "c");// addAll方法,將三個元素新增到list集合中
4 int result = Collections.binarySearch(list, "b");// 使用二分查詢法查詢一個元素在容器中的位置,若沒有該元素則返回-1
5 System.out.println("二分查詢元素位置:" + result);
6 // 返回一個型別安全的容器,相當於Collection<String> al=new ArrayList<String>();
7 Collection al = Collections.checkedCollection(new ArrayList(), String.class);
8 // checkedList,checkedSet,checkedMap與上面相同,不再操作
9 ArrayList list2 = new ArrayList();
10 Collections.addAll(list2, "d", "e", "f");
11 Collections.copy(list, list2);// 將一個List2中的內容複製到List中此時list中元素的長度應當大於等於list2的長度
12 System.out.println(list);
13 System.out.println(Collections.disjoint(list, list2));// 若兩個容器沒有相同的元素則返回true
14 Collections.emptyList();
15 Collections.emptySet();
16 Collections.emptyMap();// 這三個方法返回三個空的,不可新增元素的容器物件
17 Enumeration enumeration = Collections.enumeration(list);// 返回collection上的列舉器物件
18 Collections.fill(list, "555");// 使用“555”把list中的所有元素都替換掉
19 System.out.println(Collections.frequency(list2, "d"));// 返回list2中等於“d”的元素數量
20 System.out.println(Collections.indexOfSubList(list, list2));// 返回list中第一次出現list2的位置
21 System.out.println(Collections.lastIndexOfSubList(list, list2));// 返回list中最後一次出現list2的位置
22 ArrayList aList = Collections.list(enumeration);// 返回一個ArrayList,接收一個列舉器物件
23 System.out.println(Collections.max(list));// 返回集合中的最大元素,此方法有一個過載的版本可以接收一個自定義比較器自行指定比較的方式
24 System.out.println(Collections.min(list));// 返回集合中的最小元素,此方法也有一個過載可接收一個比較器
25 System.out.println(Collections.nCopies(3, "777"));// 返回一個由三個“777”組成的不可修改的List
26 System.out.println(Collections.newSetFromMap(new HashMap()));// 從Map轉為Set
27 Collections.replaceAll(list2, "d", "33333");// 使用“33333”替換容器中的“d”
28 Collections.reverse(list2);// 反轉容器中的元素
29 Collections.reverseOrder();// 返回一個比較器物件,它還可以接收一個比較器引數
30 Collections.rotate(list2, 1);// 根據指定距離輪換容器中的元素
31 System.out.println(list2);
32 Collections.shuffle(list2);// 使用預設隨機對指定列表進行轉換,此方法還可以接收一個Random隨機種子
33 System.out.println(list2);
34 Collections.sort(list);// 排序,可再接收一個引數比較器物件,指定排序方式
35 Collections.swap(list2, 1, 2);// 交換兩個指定位置的元素
36 System.out.println(list2);
37 Collections.synchronizedCollection(list);//返回一個執行緒安全的Collection物件
38 Collections.synchronizedList(list);//返回一個執行緒安全的List,還有synchronizedSet以及synchronizedMap
39 Collections.unmodifiableCollection(list);//返回一個不可修改的Collection
40 Collections.unmodifiableList(list);//返回一個不可修改的List,還有unmodifiableSet和unmodifiableMap
41 }
二,Arrays
此類包含了用來運算元組的靜態方法,通過此類還可以將陣列轉為List來檢視。若此陣列為null則在呼叫此方法後會丟擲空指標異常。具體演示如下:
1,asList(T... e)方法,將陣列或陣列元素轉為一個不可修改的List檢視
1 private static void fun_demo2() {
2 int[] arry = { 1, 2, 3, 4, 5, 6 };//
3 List list1 = Arrays.asList(arry);// 將陣列轉為List,此時List中只包含了一個元素即arry的引用,並且此List不可修改
4 System.out.println(list1.size());// 此時size為1
5 List list = Arrays.asList(1, 2, 3, 4, 5, 6);// 將陣列元素轉為List
6 System.out.println(list.size());// 此時size為6
7 Object[] obj = list.toArray();// 可以用Collection的toArray方法用於List和陣列的互轉
8 }
2,binarySearch方法
此方法有很多個過載的版本,可以對各種基本資料型別的陣列以二分查詢法查詢指定值在陣列中的位置,若沒有該值,則返回一個負值,所返回的負值加1便是該值若存在時應該在的位置。
當此方法處理泛型時,可指定一個比較器用於對泛型元素進行比較。
1 public class MyComparator implements Comparator<String> {
2
3 @Override
4 public int compare(String o1, String o2) {
5
6 return o1.toString().compareTo(o2.toString());
7 }
8
9 }
1 private static void fun_demo3() {
2 int[] arry = { 1, 2, 10, 4, 23, 9 };//
3 int result = Arrays.binarySearch(arry, 0, arry.length, 8);// 使用二分查詢法查詢元素的位置,返回-3,此返回值+1便是應該在陣列中的位置
4 System.out.println(result);
5 String[] str = { "abc", "adei", "zkdie", "nmkiek" };
6 System.out.println(Arrays.binarySearch(str, "zkdie", new MyComparator()));//使用泛型可指定一個比較器
7 }
3,copyof方法
此方法也有多個過載的版本,可以對各種基本資料型別的陣列進行擷取或擴充套件,當此方法的第二個引數大於原陣列的長度時,它便擴充套件;當小於原陣列的長度時它便擷取。
此方法擷取或擴充套件後返回一個原陣列的副本,若是擷取則從第一個元素開始;若是擴充套件則是在擴充套件位置填充該陣列型別的預設值。操作如下:
1 private static void fun_demo4() {
2 int[] arry = { 1, 2, 10, 4, 23, 9 };//
3 arry = Arrays.copyOf(arry, 10);// 對陣列進行擴充套件,擴充套件位置填充0
4 System.out.println(arry.length);
5 for (int i = 0; i < arry.length; i++) {
6 System.out.print(arry[i]);
7 System.out.print(" ");
8 }
9 arry = Arrays.copyOf(arry, 3);// 擷取陣列
10 System.out.println(arry.length);
11 for (int i = 0; i < arry.length; i++) {
12 System.out.print(arry[i]);
13 System.out.print(" ");
14 }
15 }
4,copyOfRange方法
此方法將指定陣列的指定位置複製到一個新陣列中,也有多個過載的版本,可處理各種基本型別的陣列,操作如下:
1 private static void fun_demo5() {
2 int[] arry = { 1, 2, 10, 4, 23, 9 };//
3 arry = Arrays.copyOfRange(arry, 2, 5);//指定擷取位置的複製,位置包括頭不包括尾
4 for (int i = 0; i < arry.length; i++) {
5 System.out.print(arry[i]);
6 System.out.print(" ");
7 }
8 }
5,deepEquqls,deepHashCode和deepToString方法
這三個方法中第一個方法接收兩個引數分別為兩個Object型別的陣列,是深度比較兩個Object型別的陣列是否相同,它比較的時候若此Object陣列是個二維陣列則會進一步比較二維陣列中的內容,即深度比較。
第二個方法接收一個Object型別的陣列,若此Object型別的陣列是個二維陣列,則對其中的元素進行相關計算後返回一個hashcode碼
第三個方法也接收一個Object型別的組,返回此陣列的直接字串形式而不是一個hashCode碼加上一個“[”。演示如下:
1 private static void fun_demo6() {
2 Object[] arry = { 1, 2, 10, 4, 23, 9 };//
3 System.out.println(arry.toString());
4 System.out.println(Arrays.deepToString(arry));
5 Object[] arry1 = { 1, 2, 10, 4, 23, 9 };//
6 System.out.println(Arrays.deepEquals(arry, arry1));
7 }
6,equals方法
此方法有多個過載的版本,也處理各種基本的陣列。接收兩個基本型別陣列引數,如果兩個引數陣列相等,則返回true。
7,fill方法
此方法有多個過載的版本,能處理各種基本型別的陣列。接收兩個引數,第一個為需要處理的陣列,第二個為替換的值。此方法的功能就是拿第二個引數把陣列中的所有元素都替換掉,演示如下:
1 private static void fun_demo7() {
2 Object[] arry = { 1, 2, 10, 4, 23, 9 };//
3 Arrays.fill(arry, 0, 3, 0);//指定替換的位置
4 System.out.println(Arrays.deepToString(arry));
5 Arrays.fill(arry, 0);//全部替換
6 System.out.println(Arrays.deepToString(arry));
7 }
8,hashcode與toString方法
這兩個方法第一個返回陣列的hash值,第二個返回陣列的字串表示形式;
它與deepHashCode和deepToString方法的不同之處在於當是一維陣列時hashcode與deepHashCode方法返回結果相同,二維陣列返回值則不同;
deepToString方法返回陣列內容的字串表示形式,而toString方法則返回"["+陣列型別的簡稱+陣列的hashCode
1 private static void fun_demo8() {
2 Object[][] arry = new Object[5][5];
3 arry[0][0] = 1;
4 arry[0][1] = 2;
5 arry[0][3] = 3;
6 arry[1][0] = 1;
7 arry[1][1] = 2;
8 arry[1][3] = 3;
9 arry[2][0] = 1;
10 arry[2][1] = 2;
11 arry[2][3] = 3;
12 arry[3][0] = 1;
13 arry[3][1] = 2;
14 arry[3][3] = 3;
15 System.out.println(Arrays.deepHashCode(arry));
16 System.out.println(Arrays.hashCode(arry));
17 System.out.println(Arrays.deepToString(arry));
18 System.out.println(Arrays.toString(arry));
19 }
9,sort方法
此方法用在開發中比較多,對陣列內容的排序操作,此方法沒有返回值,排序後影響原來陣列中的內容;預設按照升序排序,操作如下:
1 private static void fun_demo9() {
2 Object[] array = { 89, 9, 34, 2, 0, 1, -2 };
3 Arrays.sort(array);
4 System.out.println(Arrays.deepToString(array));
5 }
也可指定對陣列中的部分元素進行排序,操作如下:
1 private static void fun_demo9() {
2 Object[] array = { 89, 9, 34, 2, 0, 1, -2 };
3 Arrays.sort(array, 3, 6);//指定從哪個索引開始排序到哪個索引結束排序,包括開始不包括結束
4 System.out.println(Arrays.deepToString(array));
5 }
也可以指定一個比較器物件,指定排序的方式,示例如下:
1 public class MyComparator implements Comparator<String> {
2
3 @Override
4 public int compare(String o1, String o2) {
5
6 return o2.toString().compareTo(o1.toString());
7 }
8
9 }
按照降序對字串進行排序
1 private static void fun_demo10() {
2 String[] str = { "abkcie", "kdiek", "iweeoie9", "7382akbik", "kdoiw", "null" };
3 Arrays.sort(str, new MyComparator());
4 System.out.println(Arrays.deepToString(str));
5 }