再一次問好!:) 在今天的課程中,我們將討論 Java 中的 Arrays 類。上節課我們認識了這樣一種數據結構,叫做數組。我們學習瞭如何創建它們並用數據填充它們。我們研究了它們是如何存儲在內存中的。今天,我們將研究您在實際工作中經常看到的一些使用數組的任務和示例。例如,想像一下這種情況:我們有一個包含 10 個隨機數的數組。

int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
我們的任務是按升序對這個數組進行排序:從小到大。最後,它應該是這樣的: [-234, -2, 16, 26, 35, 43, 92, 99, 167] 我們該怎麼做呢?這項任務並不簡單。我們以前從未這樣做過:/有什麼想法嗎?猜猜看。這是一種解決方案:
  • 遍歷數組的所有元素。將每個元素與下一個元素進行比較([0] 與 [1]、[1] 與 [2]、[2] 與 [3] 等)。如果當前元素大於下一個元素,我們交換它們,然後移動到下一個元素。如果沒有,請保持原樣,繼續前進
  • 因此,在第一次遍曆元素後,最大值 (167) 保證在最後一個單元格中。
  • 現在我們將再次遍歷所有元素,但這次我們將從倒數第二個元素的索引 [0] 開始(最大的數字已經在其位置)並進行相同的比較和交換。在這一步之後,在倒數第二個單元格中,我們將獲得第二大值 (99)。
  • 重複此過程的次數與我們有數組元素的次數一樣多。
我們有主意了。現在我們只需要編寫代碼。它看起來像這樣: Arrays 類及其使用 - 2

public class Main {

   public static void main(String[] args) {
      
       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Compare the elements in pairs.
             If they are not in the right order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
呃……看起來有點複雜-_- 就算大體原理看得懂,我們還是要寫相當多的代碼來解決這麼簡單的任務。好吧,也許我們只是高估了自己?我們已經解決的任務對我們來說可能仍然太複雜了。讓我們嘗試一些更簡單的事情。例如,取相同的數字數組。

int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
我們的任務是將其內容複製到另一個數組。

int [] numbersCopy = new int[10];
想想你將如何使用你已經了解的數組來做到這一點?例如,您可以循環遍歷numbers數組並將其元素按順序寫入numbersCopy

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];
      
       for (int i = 0; i < numbers.length; i++) {
          
           numbersCopy[i] = numbers[i];
       }

   }
}
嗯,嗯,到這裡我們基本上就完成了!看來我們已經解決了問題。但是,如果您需要經常這樣做,您的代碼就會有一堆相同的循環。事實上,這些(和其他)任務早已被 Java 的創建者解決了。我們不需要“重新發明輪子”並編寫我們自己的解決方案。有一個特殊的靜態類 ( Arrays ) 可以幫助您在使用數組時執行常見任務。此類中添加了用於執行 Java 程序員面臨的最常見任務的方法。例如,我們試圖處理的數組排序任務在一行中就解決了:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
      
       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
Arrays.sort ()方法對數組進行排序。而且它的算法比我們寫的代碼效率高很多。控制台輸出: [-234, -2, 16, 26, 35, 43, 80, 92, 99, 167] 注意:要將數組轉換為字符串,我們使用了Arrays類的另一個方法:Arrays.toString() . Java 中的數組不會自行覆蓋toString()方法。所以,如果你只是寫

System.out.println(numbers.toString());
將調用 Object 類的toString() 。對於一個數組,輸出將是這樣的: [I@4554617c 我們現在不會詳細說明為什麼這是輸出。最主要的是,這顯然不是我們所需要的。但是Arrays.toString()正是我們想要的。順便說一句,使用Arrays類也可以輕鬆完成複制:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
我們將原始數組(我們要從中復制值)和要將數據複製到其中的新數組的長度 傳遞給Arrays.copyOf()方法。在這種情況下,我們將numbers.length指定為長度,因為要復制整個數組。如果我們只想複製前幾個元素,我們可以指定一個新的較小數組的長度:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
這裡我們指定 4 作為新數組的長度。因此,只有 numbers 的前 4 個元素將被複製到新數組中。控制台輸出: [167, -2, 16, 99] 順便說一句,Arrays還允許您從數組的中間而不是數組的開頭複製數組的一部分:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
輸出: [16, 99, 26, 92] 數字從第二個數組的第二個(含)到第六個(不含)元素複製到新數組中。我們可能還需要比較兩個數組。與toString()方法一樣,數組本身不會覆蓋equals()方法。所以如果我們嘗試像這樣比較它們

public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
然後我們得到假。這是因為將調用比較引用的Object.equals() 。而且,很明顯,它們是不同的!但我們需要的是比較數組內容,而不是引用。Arrays類重寫了equals()方法,使其完全按照我們的要求執行

public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
輸出: true 順便說一下,Arrays類不僅適用於普通數組,還適用於二維數組:

public class Main {

   public static void main(String[] args) {

       int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println("Are these two-dimensional arrays equal?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));
      
       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
輸出: 這些二維數組是否相等?true [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 如您所見,Arrays.copyOf()方法能夠複製二維數組。並且該類具有用於比較和顯示二維數組的特殊方法:deepEqualsdeepToString()。將來,您會反复看到(並為此感到高興)Java 的創建者預見到了程序員經常遇到的許多情況,並用該語言為他們實現了現成的解決方案。使用這些解決方案比重新發明輪子更容易、更方便,對吧?:) 請務必閱讀Oracle網站上 Arrays 類的文檔。祝你學業順利!