Java中的陣列資料結構需要了解的要點
. 首先,陣列是Java中的物件。它們不是像int、short或long這樣的基本類,也不是具有很多方法的全功能物件,但由於它們是物件,所以它們隱式地擴充套件了Object,這就是為什麼可以使用陣列引用(例如toString())呼叫java.lang.object的任何方法。
2. Java中陣列的另一個重要之處是,一旦建立,就不能更改陣列的大小。好奇的開發人員可能會問,我們如何在Java中擁有像ArrayList這樣的動態集合,可以在飽和的時候調整自身大小?好吧,擴容不像你想得那樣,可以簡單地增加一個數組的大小來容納額外的元素。為了增加大小,必須建立一個新陣列,並將內容從舊陣列複製到新陣列。儘管存在將元素從一個數組複製到另一個數組的快速方法,但它仍然是一個代價很大的操作,還會降低Java應用程式的效能。 這就是為什麼初始化具有適當大小的陣列或集合仍然是最好的做法之一。
3. 關於陣列,第三件要知道的是它的長度屬性,它告訴你陣列的大小或它可以容納多少元素。這通常也是造成混淆的原因,因為字串有類似的length()方法,這是一個方法,而陣列長度是屬性,所以不再有括號。另一個增加這種混淆的是arraylist的size()方法,它也返回arraylist可以容納多少元素。 下面是一個程式碼片段示例,用於查詢Java中陣列的長度。
int[] arrayOfInts = new int[] { 101, 102, 103, 104, 105 };
System.out.println("length of arrayOfInts is : " + arrayOfInts.length); // print 5
在Java中迴圈遍歷陣列時,可以使用陣列的長度來避免訪問無效的索引,如下一個示例所示。
4.陣列索引從零開始,因此第一個元素的索引為0,最後一個元素的索引為length -1。 此屬性用於迭代for迴圈中的所有元素。 String[] cities = new String[]{"London", "Paris", "NewYork", "HongKong", "Tokyo"};
<b>for</b>(<b>int</b> i=0;i<cities.length;i++){ String city = cities[i]; System.out.println(<font>"Current city is @ "</font><font> + city); } Output : Current city is @ London Current city is @ Paris Current city is @ NewYork Current city is @ HongKong Current city is @ Tokyo </font>
您可以看到,我們從0(第一個元素)開始迴圈,以小於長度的方式結束迴圈,例如length -1(最後一個元素索引)。如果嘗試訪問陣列[長度],將獲得arrayIndexOutOfBoundsException,因為最後一個索引是length -1。
5. 正如我之前所說的,Java虛擬機器將陣列視為物件。陣列的型別是“[elementType”,其中element type是元素的型別。例如,一個(一維)整數陣列的型別為“[I”,同樣,一維短陣列的型別為“[S”,一維浮點陣列的型別為“[F”。對於二維陣列,可以得到兩個“[[”,例如,二維int陣列的型別為“[[i”。當您在Java中列印陣列時,可以檢查這一點。它列印其元素型別和雜湊程式碼,如下所示。
<b>public</b> <b>class</b> PrintArrayTypes{ <b>public</b> <b>static</b> <b>void</b> main(String args[]) { <font><i>// type of one dimensional array in Java</i></font><font> <b>int</b>[] arrayOfInts = <b>new</b> <b>int</b>[] { 101, 102, 103, 104, 105 }; System.out.println(arrayOfInts); <b>short</b>[] arrayOfShorts = <b>new</b> <b>short</b>[] { 20, 30, 40, 50, 60 }; System.out.println(arrayOfShorts); <b>float</b>[] arrayOfFloats = <b>new</b> <b>float</b>[] { 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; System.out.println(arrayOfFloats); </font><font><i>// type of two dimensional array in Java</i></font><font> <b>int</b>[][] arrayOfArrayOfInts = { { 1, 2, 3 }, { 10, 20, 30 }, { 100, 200, 300 } }; System.out.println(arrayOfArrayOfInts); <b>double</b>[][] arrayOfArrayOfDoubles = { { 2.0, 3.0 }, { 4.0, 5.0 } }; System.out.println(arrayOfArrayOfDoubles); } } Output <p>[I@1693b52b <p>[S@3b5b25a1 <p>[F@5d038b78 <p>[[I@7b9a29 <p>[[D@32c5f9fe </font>
6.如果關注我的上一個示例,那麼您會注意到使用toString()列印陣列不會產生除元素型別之外的任何有用的內容。 理想情況下,我們希望按照它們存在的順序檢視陣列的元素。 我們可以重寫array類的toString()方法嗎?不,這不是一個選項,但不要擔心我們有一個實用程式類java.util.Arrays,它包含幾種方法來處理不同型別的陣列。 我們可以使用Arrays類的toString()和deepToString()方法在Java中列印一維和多維陣列的陣列元素,如下所示。
7. 與toString()類似,陣列的equals()方法也沒有用處。在大多數情況下,我們希望將陣列的元素及其順序與另一個數組及其元素進行比較,但array的equals()方法不這樣做,而是引用比較,僅當兩個變數都指向同一個陣列物件時才返回true,如下例所示。但是不用擔心,Arrays類用equals() 和deepEquals() 方法來比較Java中的一維陣列和多維陣列元素。您可以通過以下示例推斷出相同的理解:
<b>public</b> <b>class</b> ArrayEquality{ <b>public</b> <b>static</b> <b>void</b> main(String args[]) { String[] cities = <b>new</b> String[]{<font>"London"</font><font>, </font><font>"Paris"</font><font>, </font><font>"NewYork"</font><font>, </font><font>"HongKong"</font><font>, </font><font>"Tokyo"</font><font>}; String[] metros = <b>new</b> String[]{</font><font>"London"</font><font>, </font><font>"Paris"</font><font>, </font><font>"NewYork"</font><font>, </font><font>"HongKong"</font><font>, </font><font>"Tokyo"</font><font>}; String[] capitals = cities; </font><font><i>// comparing array using == operator</i></font><font> System.out.println(</font><font>"cities == metros : "</font><font> + (cities == metros)); System.out.println(</font><font>"cities == capitals : "</font><font> + (cities == capitals)); </font><font><i>// comparing array using equals() method</i></font><font> System.out.println(</font><font>"cities.equals(metros) : "</font><font> + cities.equals(metros)); System.out.println(</font><font>"cities.equals(capitals) : "</font><font> + cities.equals(capitals)); </font><font><i>// comparing array using Arrays.equals() method</i></font><font> System.out.println(</font><font>"Arrays.equals(cities, metros) : "</font><font> + Arrays.equals(cities, metros)); System.out.println(</font><font>"Arrays.equals(cities, capitals) : "</font><font> + Arrays.equals(cities, capitals)); } } Output : cities == metros : false cities == capitals : <b>true</b> cities.equals(metros) : false cities.equals(capitals) : <b>true</b> Arrays.equals(cities, metros) : <b>true</b> Arrays.equals(cities, capitals) : <b>true</b> </font>
您可以看到儘管元素及其順序相同,第一條語句是假的,因為“==”運算子僅在兩個變數都指向同一陣列時才返回真,這是第二次相等性檢查的情況。同樣,equals()方法也模擬了==運算子的行為,因為陣列不會重寫物件的equals()方法,其預設行為是基於相同的引用來決定相等性。 Arrays.equals()是檢查兩個陣列在Java中是否相等的正確方法。為此,你應該一直使用它。
8. Java程式設計師應該習慣使用deepEquals()方法來檢查兩個多維陣列的相等性,因為Arrays.equals()方法不執行多維比較。 以下是檢查Java中多維陣列相等性的示例:
<b>public</b> <b>class</b> MultiDimensionalArray{ <b>public</b> <b>static</b> <b>void</b> main(String args[]) { <b>int</b>[][] a1 = { {2,4}, {4,6}, {8,10} }; <b>int</b>[][] a2 = { {12,14}, {14,16}, {18,20} }; <b>int</b>[][] a3 = { {2,4}, {4, 6}, {8,10} }; <font><i>// checking if two multi-dimensional array of same length but different element equal or not</i></font><font> <b>boolean</b> result = Arrays.deepEquals(a1, a2); System.out.println(</font><font>"Does two dimensional array a1 and a2 are equal : "</font><font> + result); </font><font><i>// checking if two multi-dimensional array of same length, elements equal or not</i></font><font> result = Arrays.deepEquals(a1, a3); System.out.println(</font><font>"Does two dimensional array a1 and a3 are equal : "</font><font> + result); } } Output : Does two dimensional array a1 and a2 are equal : false Does two dimensional array a1 and a3 are equal : <b>true</b> </font>
9.使用java時,你需要多次在靜態陣列與動態陣列之間進行轉換。
10. 在Java中有幾種初始化陣列的方法。你也可以在不初始化的情況下建立它們,在這種情況下,所有儲存桶都將保持元素型別的預設值,例如,如果你建立一個空陣列並且沒有初始化它,則所有儲存桶都將保持為零,因為這是Java中整數變數的預設值。 類似地,布林陣列預設使用false值初始化,String陣列使用空值初始化。 如果您事先知道這些值,則可以在建立時初始化陣列,如下所示:
<b>int</b>[] numbers = {1, 2, 3, 4, 5}; <font><i>// valid</i></font><font> <b>int</b> multipleOfThree[] = {3, 6, 9, 12, 15}; </font><font><i>// valid </i></font><font> <b>int</b>[] even = <b>new</b> <b>int</b>[]{2, 4, 6, 8, 10}; </font><font><i>// valid</i></font><font> </font>
11. 一個額外的提示是,array與arraylist有很大的不同,後者是一個動態陣列,它可以根據需要調整自身的大小。另一方面,建立後不能更改陣列的大小。除了這一事實之外,這兩個類之間還有幾個不同之處,例如ARAYLIST是Java集合框架的一部分,但陣列不是。
這是關於Java中陣列資料結構的一些要點的列表。使用陣列來儲存相同型別的元素,例如整數、字串或物件,但不能混合它們,例如Java陣列不能同時包含整數和字串,在編譯時是錯誤的,但對於物件,如果編譯器允許,它將在執行時丟擲arraystoreException。同樣,如果知道索引,陣列也是用於訪問元素的快速資料結構之一