Collections是集合架構的工具類,裡面的方法都是靜态的
下圖中List存放的是String類型,是以sort是根據元素的自然順序進行排序,即字元串排序,
如果List存放的是自定義類類型,那麼需要自定義比較器,作為sort的參數,才能進行排序。
public static void demo1()
{
List<String> list = new ArrayList<String>();
list.add("ghj");
list.add("abcd");
list.add("cba");
list.add("zzz");
list.add("klg");
System.out.println(list);
//對list集合進行指定順序的排序
Collections.sort(list);
System.out.println(list);
}
二分查找是對有序序列進行的,是以在使用binarySearch之前需要先對list集合裡面的元素進行排序。
如果沒有找到指定元素,則傳回負數,代表插入的位置點減一。如下圖中查找"dgs",沒有找到,是以
傳回負數,“dgs”的插入點在下标為2個位置,是以是-2。再減一就是傳回-3。
為什麼要減一?
因為如果插入點是0的話沒有減一直接傳回會引起歧義,不能判斷是找到還是沒找到。是以要減一,把0變成-1。
private static void demo2()
{
List<String> list = new ArrayList<String>();
list.add("ghj");
list.add("abcd");
list.add("cba");
list.add("zzz");
list.add("klg");
System.out.println(list);//[ghj, abcd, cba, zzz, klg]
//對list集合進行指定順序的排序
Collections.sort(list);//[abcd, cba, ghj, klg, zzz]
System.out.println(list);
int index = Collections.binarySearch(list, "dgs");
System.out.println("index = " + index);//-3 負數表示沒有找到,傳回插入點減1,即-2-1
}
reverseOrder方法傳回一個逆轉實作了Comparable接口的對象collection的自然順序的比較器,是以輸出時就逆序了。
private static void demo3()
{
TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder());
ts.add("abc");
ts.add("mer");
ts.add("bgh");
ts.add("kji");
ts.add("zpw");
System.out.println(ts);//[zpw, mer, kji, bgh, abc]
}
replaceAll方法的實作機制是:先使用集合中的indexOf方法找到"cba"的索引,然後用set方法指定索引,
指定替換的值,就實作了替換功能。
private static void demo4()
{
List<String> list = new ArrayList<String>();
list.add("ghj");
list.add("abcd");
list.add("cba");
list.add("zzz");
System.out.println(list);//[ghj, abcd, cba, zzz]
Collections.replaceAll(list, "cba", "uio");
System.out.println(list);//[ghj, abcd, uio, zzz]
}
collections中的靜态方法synchronizedList可以傳回清單支援的同步(線程安全的)清單。
Arrays:集合架構的工具類。裡面的方法都是靜态的。
Arrays中的asList方法可以将數組轉換成List集合。
public static void demo()
{
/*
* 好處:其實可以使用集合的方法操作數組中的元素。
* 注意:數組的長度是固定的,是以對于集合的增删方法是不可以使用的
* 否則會發生UnsupportedOperationException
*/
String[] arr = {"abc", "haha", "lgds"};
List<String> list = Arrays.asList(arr);
boolean b = list.contains("haha");
System.out.println(b);//true
}
如果數組中的元素是對象,那麼轉成集合時,直接将數組中的元素進行集合存儲。
如果數組中的元素是基本類型數值,那麼會将該數組作為集合中的元素進行存儲,是以下圖中列印出來的size是1,
說明list集合中隻有一個元素。
public static void demo1()
{
int[] arr = {24, 13, 35, 41};
List list = Arrays.asList(arr);
System.out.println(list);//[[[email protected]]
System.out.println("size = " + list.size());//size = 1
}
集合轉成數組,使用的就是Colletion接口中的toArray方法。
集合轉成數組,可以對集合中的元素操作的方法進行限定,不允許對其進行增删
toArray方法需要傳入一個指定類型的數組。
如果長度小于集合的size,那麼該方法會建立一個同類型并和集合相同size的數組,如下圖第8行。
如果長度大于集合的size,那麼該方法就會使用指定的數組,存儲集合的元素,其他位置預設為null,如下圖第10行。
是以建議最好長度就指定為集合的size,即list.size()
public static void demo1()
{
List<String> list = new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
String[] arr1 = list.toArray(new String[2]);
System.out.println(Arrays.toString(arr1));//[abc1, abc2, abc3]
String[] arr2 = list.toArray(new String[5]);
System.out.println(Arrays.toString(arr2));//[abc1, abc2, abc3, null, null]
}