1. 程式人生 > >[java] 陣列

[java] 陣列

陣列基本介紹

在大多數的時候,我們僅僅只需要知道:對於一個數組,我們可以建立並組裝它,通過使用整型的索引值訪問它們的元素,並且它的尺寸不能改變。但是在有的時候是需要在陣列上執行更加複雜的操作,並且程式設計師需要做出決策到底是使用陣列還是使用其他容器。

陣列與其他種類的容器之間的區別有三方面

  1. 效率
  2. 型別
  3. 儲存基本資料型別的能力

在java當中,陣列是效率最高的儲存和隨機訪問物件引用序列的方式。
陣列是使用[]來訪問元素,而List使用的add和get這樣的方法。隨著包裝機制的出現,容器已經可以與陣列幾乎一樣方便地用於基本型別了。陣列僅存的優點就是效率。
陣列物件儲存的是指向物件的引用,每一個引用指向在堆中建立的一個真實物件。”[]”語法是訪問陣列物件的唯一方式。

多維陣列

建立多維的陣列很方便。對於基本型別的多維陣列,可以用花括號將每個向量分隔開。例如

public class MutidimensionalPrimitiveArray {
    public static void main(String[] args){
        int[][] a = {
            {1,2,3},
            {4,5,6}
        };
        System.out.println(Arrays.deepToString(a));
   }
}

列印的結果是[ [1,2,3], [4,5,6] ] . 每對花括號擴起來的集合都會把你帶到下一級陣列。

陣列與泛型

通常陣列與泛型不能很好的結合,不能例項話具有引數化型別的陣列。但是你可以引數化陣列本身的型別.例如:

List<String>[] ls;

這條語句可以通過編譯器而不報任何錯誤。儘管你不能建立實際的持有泛型的陣列物件,但是你可以建立非泛型的陣列然後將其轉型。

Arrays的實用功能

在java.util類庫中可以找到Arrays類,它有一套用於陣列的static實用方法,其中有六個基本方法。

  1. equals:用於比較兩個陣列是否相等(deepEquals用於多維陣列),
  2. fill:把一個值賦給陣列的每一個元素
  3. sort:用於對陣列排序
  4. binarySearch: 用於在已經排序的陣列中查詢元素
  5. toString:產生陣列的string表示
  6. hashCode: 產生陣列的雜湊碼

此外,Arrays.asList方法接收任意的序列或陣列作為其引數,然後將它轉變為List容器。
有一個不屬於Arrays類但很有用的方法。

複製陣列

java的標準類庫提供了一個static方法System.arraycopy(),用它複製陣列比用for迴圈複製要快很多。此外,arraycopy方法針對所有型別都做了過載。

arraycopy方法需要的引數有:

  1. 源陣列
  2. 表示從源陣列中的什麼位置開始複製的偏移量
  3. 表示從目標陣列中的什麼位置開始複製的偏移量
  4. 需要複製的元素個數

System.arraycopy()不會自動包裝和自動拆箱,兩個陣列必須具有相同的確切型別。

陣列的比較

Arrays類提供了過載的equals方法,用於比較整個陣列。陣列相等的條件是元素個數相等,並且對應位置的元素也相等。
陣列元素的比較使用了策略模式。在定義做比較的方法時,由你來決定將你的物件與另一個物件作比較的含義。例如,我可以定義比較兩個物件的大小,如果當前物件小於引數返回負數,相等返回零,大於返回正值。
如果沒有實現Compareable介面,在呼叫sort方法的時候會丟擲ClassCastException這個執行時異常。因為sort方法需要把引數的型別轉變為
Comparable。

使用內建的排序方法,就可以對任意的基本型別陣列排序,也可以對任意的物件陣列進行排序,只要該物件實現了Comparable介面或者具有關聯的Comparator。
例如String的排序演算法是依據詞典編排順序排序,所以大寫字母開頭的詞都放在前面輸出,然後才是小寫字母開頭的詞。

如果陣列已經排好序了,就可以使用Arrays.binarySearch執行快速查詢。如果對未排序的陣列使用Arrays.binarySearch則將會產生不可預料的結果。

當我們程式設計時,應該優先選擇容器而不是陣列,只有在已經證明效能成為問題,並且切換到陣列對效能提高有幫助時,才應該將程式重構為使用陣列。