天天看點

java學習之集合架構工具類

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]
	}