<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 數組特性 明明還有很多其他的辦法來保存對象,那么是什么令數組如此特別? 將數組和其他類型的集合區分開來的原因有三:效率,類型,保存基本數據類型的能力。在 Java 中,使用數組存儲和隨機訪問對象引用序列是非常高效的。數組是簡單的線性序列,這使得對元素的訪問變得非常快。然而這種高速也是有代價的,代價就是數組對象的大小是固定的,且在該數組的生存期內不能更改。 速度通常并不是問題,如果有問題,你保存和檢索對象的方式也很少是罪魁禍首。你應該總是從 **ArrayList** (來自 [集合](book/12-Collections.md ))開始,它將數組封裝起來。必要時,它會自動分配更多的數組空間,創建新數組,并將舊數組中的引用移動到新數組。這種靈活性需要開銷,所以一個 **ArrayList** 的效率不如數組。在極少的情況下效率會成為問題,所以這種時候你可以直接使用數組。 數組和集合(Collections)都不能濫用。不管你使用數組還是集合,如果你越界,你都會得到一個 **RuntimeException** 的異常提醒,這表明你的程序中存在錯誤。 在泛型前,其他的集合類以一種寬泛的方式處理對象(就好像它們沒有特定類型一樣)。事實上,這些集合類把保存對象的類型默認為 **Object**,也就是 Java 中所有類的基類。而數組是優于 **預泛型** (pre-generic)集合類的,因為你創建一個數組就可以保存特定類型的數據。這意味著你獲得了一個編譯時的類型檢查,而這可以防止你插入錯誤的數據類型,或者搞錯你正在提取的數據類型。 當然,不管在編譯時還是運行時,Java都會阻止你犯向對象發送不正確消息的錯誤。然而不管怎樣,使用數組都不會有更大的風險。比較好的地方在于,如果編譯器報錯,最終的用戶更容易理解拋出異常的含義。 一個數組可以保存基本數據類型,而一個預泛型的集合不可以。然而對于泛型而言,集合可以指定和檢查他們保存對象的類型,而通過 **自動裝箱** (autoboxing)機制,集合表現地就像它們可以保存基本數據類型一樣,因為這種轉換是自動的。 下面給出一例用于比較數組和泛型集合: ```java // arrays/CollectionComparison.java // (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; import onjava.*; import static onjava.ArrayShow.*; class BerylliumSphere { private static long counter; private final long id = counter++; @Override public String toString() { return "Sphere " + id; } } public class CollectionComparison { public static void main(String[] args) { BerylliumSphere[] spheres = new BerylliumSphere[10]; for(int i = 0; i < 5; i++) spheres[i] = new BerylliumSphere(); show(spheres); System.out.println(spheres[4]); List<BerylliumSphere> sphereList = Suppliers.create( ArrayList::new, BerylliumSphere::new, 5); System.out.println(sphereList); System.out.println(sphereList.get(4)); int[] integers = { 0, 1, 2, 3, 4, 5 }; show(integers); System.out.println(integers[4]); List<Integer> intList = new ArrayList<>( Arrays.asList(0, 1, 2, 3, 4, 5)); intList.add(97); System.out.println(intList); System.out.println(intList.get(4)); } } /* Output: [Sphere 0, Sphere 1, Sphere 2, Sphere 3, Sphere 4, null, null, null, null, null] Sphere 4 [Sphere 5, Sphere 6, Sphere 7, Sphere 8, Sphere 9] Sphere 9 [0, 1, 2, 3, 4, 5] 4 [0, 1, 2, 3, 4, 5, 97] 4 */ ``` **Suppliers.create()** 方法在[泛型](book/20-Generics.md)一章中被定義。上面兩種保存對象的方式都是有類型檢查的,唯一比較明顯的區別就是數組使用 **[ ]** 來隨機存取元素,而一個 **List** 使用諸如 `add()` 和 `get()` 等方法。數組和 **ArrayList** 之間的相似是設計者有意為之,所以在概念上,兩者很容易切換。但是就像你在[集合](book/12-Collections.md)中看到的,集合的功能明顯多于數組。隨著 Java 自動裝箱技術的出現,通過集合使用基本數據類型幾乎和通過數組一樣簡單。數組唯一剩下的優勢就是效率。然而,當你解決一個更加普遍的問題時,數組可能限制太多,這種情形下,您可以使用集合類。 ### 用于顯示數組的實用程序 在本章中,我們處處都要顯示數組。Java 提供了 **Arrays.toString()** 來將數組轉換為可讀字符串,然后可以在控制臺上顯示。然而這種方式視覺上噪音太大,所以我們創建一個小的庫來完成這項工作。 ```java // onjava/ArrayShow.java // (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package onjava; import java.util.*; public interface ArrayShow { static void show(Object[] a) { System.out.println(Arrays.toString(a)); } static void show(boolean[] a) { System.out.println(Arrays.toString(a)); } static void show(byte[] a) { System.out.println(Arrays.toString(a)); } static void show(char[] a) { System.out.println(Arrays.toString(a)); } static void show(short[] a) { System.out.println(Arrays.toString(a)); } static void show(int[] a) { System.out.println(Arrays.toString(a)); } static void show(long[] a) { System.out.println(Arrays.toString(a)); } static void show(float[] a) { System.out.println(Arrays.toString(a)); } static void show(double[] a) { System.out.println(Arrays.toString(a)); } // Start with a description: static void show(String info, Object[] a) { System.out.print(info + ": "); show(a); } static void show(String info, boolean[] a) { System.out.print(info + ": "); show(a); } static void show(String info, byte[] a) { System.out.print(info + ": "); show(a); } static void show(String info, char[] a) { System.out.print(info + ": "); show(a); } static void show(String info, short[] a) { System.out.print(info + ": "); show(a); } static void show(String info, int[] a) { System.out.print(info + ": "); show(a); } static void show(String info, long[] a) { System.out.print(info + ": "); show(a); } static void show(String info, float[] a) { System.out.print(info + ": "); show(a); } static void show(String info, double[] a) { System.out.print(info + ": "); show(a); } } ``` 第一個方法適用于對象數組,包括那些包裝基本數據類型的數組。所有的方法重載對于不同的數據類型是必要的。 第二組重載方法可以讓你顯示帶有信息 **字符串** 前綴的數組。 為了簡單起見,你通常可以靜態地導入它們。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看