天天看點

Arrays數組工具類

位于java.util包内的Arrays類是Java提供的一個 操作數組 的工具類,其内部定義了一些常見的用于操作數組的靜态方法 ;

1:數組轉List;2:排序3:查找4:元素填充;5:數組複制;6:toString;7:相等性判斷;8:數組交換

1: Arrays.asList([]) ;

  • asList 不接受基本資料類型的數組名,作為參數直接傳遞。
  • asList 通過backed(拷貝)的方式,傳回的是一個固定長度的List;
  • 不能對這個傳回的List執行add 方法,可以調用set方法。arrays中的ArrayList并不是平常使用的arraylist,它并沒有實作list接口,而是直接繼承的AbstractList;且沒有複習add方法;
  • 同理不能調用remove方法,但可以調用get方法擷取元素。

【 List轉數組的實作,Collection接口定義了統一的方法toArray 】

2:sort(): 實作數組的排序,預設按升序進行排列 ; 一類是基本資料類型的排序,一類是Object類型的排序; sort靜态方法的實作,按參數主要有兩種實作方法,一種是數組整體進行排序;一種是在數組内指定一段起始位置進行排序,之後的 對象數組 排序也隻是按指定起始位置排序,不再重複描述。其内部具體實作是DualPivotQuicksort(雙軸快速排序);

2.1 基本資料類型的排序

  • 可以接收的參數類型可以是int,long,short,char,byte,float,double類型數組。

2.2 Object 類型數組排序 public static <T> void sort(T[] a, Comparator<? super T> c) { 這個方法是泛型為T的數組,需要提供一個實作了Comparator接口的執行個體,同理也是必須明确告知排序規則,如果同時實作了Comparable接口和Comparator接口,Comparator接口的實作将覆寫Comparable接口的排序規則。 使用這個方法時,提供的“數組中的對象”必須是實作了Comparable接口的,也就是說必須告知明确告知,對數組中的對象是按什麼規則排序。 [ 對象數組排序内部實作采用了LegacyMergeSort(歸并排序)和TimSort排序。 ] parallelSort parallelSort 是Java8新增的排序方式,和sort方法不同的是,他采用多線程并行的方式進行排序,當資料規模較大時和sort相比有明顯優勢;具體可見 arrays-sort-versus-arrays-parallelsort .

3: 查找 Arrays内部的查找,主要是binarySearch(二分查找法)。可以說,關于查找到實作分類和排序完全一樣。首先從資料類型上也是 分為基礎資料類型構成的數組和對象數組。都支援 按特定範圍進行排序;對于對象數組的排序,對象數組需要實作Comparable接口或者是提供Comparator接口的執行個體。

4: fill() :元素填充 結論:java.util.Arrays.fill() 方法隻适合于把數組用同一個值初始化;

5:copyOf(); 實作兩個将 原數組 按指定長度複制到 目标數組内 傳回。 其内部使用System.arraycopy方法,這是一個Java提供的native方法,是以效率會高一些。Java 内部關于數組複制的實作,都用到了這個方法。 同樣,也包括一個copyOfRange的方法,這個按名字就可以了解,就是按照範圍進行複制。

6:toString() 這個toString的靜态方法,其實也很實用;從下面的代碼的實作,可以看出,他的作用就是将我們定義的數組,按照 "[a0,a1,....]"的格式轉成字元串,友善我們直接列印整個數組,列印出來的日志也會看起來更直覺,更友善;

7:equals相等性 Arrays内部關于兩個數組相等的判斷可以首先看下下面的代碼: 基礎資料類型數組,以long類型為例 public static boolean equals(float[] a, float[] a2) { if (a==a2) return true; if (a==null || a2==null) return false; int length = a.length; if (a2.length != length) return false; for (int i=0; i<length; i++) if (Float.floatToIntBits(a[i])!=Float.floatToIntBits(a2[i])) return false; return true; } Object 類型數組 public static boolean equals(Object[] a, Object[] a2) { if (a==a2) return true; if (a==null || a2==null) return false; int length = a.length; if (a2.length != length) return false; for (int i=0; i<length; i++) { Object o1 = a[i]; Object o2 = a2[i]; if (!(o1==null ? o2==null : o1.equals(o2))) return false; } return true; }

deepEquals 關于deepEquals和equals的差別,可以看看這篇文章 Java中Arrays類的兩個方法:deepEquals和equals;

8:swap數組交換 private static void swap(Object[] x, int a, int b) { Object t = x[a]; x[a] = x[b]; x[b] = t; }

繼續閱讀