原文轉載: http://blog.csdn.net/u014082714/article/details/49924419
Arrays的常用方法
代碼:
java.util 下的 Arrays 類沒有 public 的構造函數,所以註定我們只能拿這個類作爲工具類來使用。
這個類給我們提供了處理原生類型(long、int、short、byte、double、float、char、boolean)的數組的功能,
包括排序,填充,比較等功能,查看源碼還能看到java使用的排序算法(快速排序算法)。
下面具體說一下Arrays類的幾個用法:
1. 排序
// 重載 sort 方法 傳入各種類型的數值數組
這裏以對 long 型數組進行排序爲例子,在排序的時候都是先進行了數組下標越界檢查,這也就是我們在寫程序的時候經常會遇到的錯誤了。這個rangeCheck方法也可以拿來咱們自己用。
排序方法中調用的 sort1 方法就是具體的快速排序算法的實現了。除了對 long 型數組進行排序的功能外,
java 提供了 8中原生類型的重載的排序方法。這個設計的思想大家也可以借鑑一下。
2. 填充
填充方法可以把數組中的從起始下標到結束下標中間的數值都填充成你期望的值。看下面的源代碼(以填充 int 型數組爲例)
同樣的數組下標越界檢查,填充代碼。
3. 比較
以比較兩個double型數組爲例子,下面是源碼
如果兩個double型數組 的物理地址相同,或者都是NULL或者兩個數組的對應的元素都相同,則返回true,兩個數組相等,否則兩個數組不相等。
注意比較兩個數組的對應元素的時候的代碼 Double.doubleToLongBits(a[i]) != Double.doubleToLongBits(a2[i]),爲什麼要用這個比較方法呢,如果大家看了
int 型數組的比較的時候 都是直接比的值,不用做任何轉換。
Two doubles d1 and d2 are considered equal if:
new Double(d1).equals(new Double(d2))
(Unlike the == operator, this method considers NaN equals to itself, and 0.0d unequal to -0.0d.)
如果 new Double(d1).equals(new Double(d2)) 成立,那麼認爲 double型數值 d1 和 d2 是相等,不同於 == 運算符,這個方法認爲 NaN 和它自身是相等的,並且
0.0d 和 -0.0d 是不相等的。
真是夠複雜的 大家可以注意幾點,
== 運算符 和 equals 方法:一個是比的內存地址,一個是通過重構的 Object 的 public boolean equals(Object obj);方法對比
NaN 的意思是 not a number,用來定義一個不是數字的結果,這個常量在Double 和 Float 兩個類中都有定義,定義內容如下:
public static final double NaN = 0.0d / 0.0;
4.查找
查找的功能是在指定的數組中根據參數查找,返回找到的位置。以long 型數組爲例
public static int binarySearch(long[] a, long key)
查看源碼可知,java中的查找算法是 折半查找(binary search algorithm)這也是查找算法中最有效率的一種算法。
值得注意的是 目標數組必須是經過排序的,如果未經過排序的話,會返回意料之外的值。
// binary search algorithm 折半查找法
原文轉載:http://blog.csdn.net/u014082714/article/details/49924419