Java中的陣列資料結構需要了解的要點

java愛好者i發表於2019-03-14

. 首先,陣列是Java中的物件。它們不是像int、short或long這樣的基本類,也不是具有很多方法的全功能物件,但由於它們是物件,所以它們隱式地擴充套件了Object,這就是為什麼可以使用陣列引用(例如toString())呼叫java.lang.object的任何方法。

  1. Java中陣列的另一個重要之處是,一旦建立,就不能更改陣列的大小。好奇的開發人員可能會問,我們如何在Java中擁有像ArrayList這樣的動態集合,可以在飽和的時候調整自身大小?好吧,擴容不像你想得那樣,可以簡單地增加一個陣列的大小來容納額外的元素。為了增加大小,必須建立一個新陣列,並將內容從舊陣列複製到新陣列。儘管存在將元素從一個陣列複製到另一個陣列的快速方法,但它仍然是一個代價很大的操作,還會降低Java應用程式的效能。 這就是為什麼初始化具有適當大小的陣列或集合仍然是最好的做法之一。

  2. 關於陣列,第三件要知道的是它的長度屬性,它告訴你陣列的大小或它可以容納多少元素。這通常也是造成混淆的原因,因為字串有類似的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"};

for(int i=0; i<cities.length; i++){ String city = cities[i]; System.out.println("Current city is @ " + city); } Output : Current city is @ London Current city is @ Paris Current city is @ NewYork Current city is @ HongKong Current city is @ Tokyo 您可以看到,我們從0(第一個元素)開始迴圈,以小於長度的方式結束迴圈,例如length -1(最後一個元素索引)。如果嘗試訪問陣列[長度],將獲得arrayIndexOutOfBoundsException,因為最後一個索引是length -1。

  1. 正如我之前所說的,Java虛擬機器將陣列視為物件。陣列的型別是“[elementType”,其中element type是元素的型別。例如,一個(一維)整數陣列的型別為“[I”,同樣,一維短陣列的型別為“[S”,一維浮點陣列的型別為“[F”。對於二維陣列,可以得到兩個“[[”,例如,二維int陣列的型別為“[[i”。當您在Java中列印陣列時,可以檢查這一點。它列印其元素型別和雜湊程式碼,如下所示。

public class PrintArrayTypes{ public static void main(String args[]) { // type of one dimensional array in Java int[] arrayOfInts = new int[] { 101, 102, 103, 104, 105 }; System.out.println(arrayOfInts); short[] arrayOfShorts = new short[] { 20, 30, 40, 50, 60 }; System.out.println(arrayOfShorts); float[] arrayOfFloats = new float[] { 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; System.out.println(arrayOfFloats); // type of two dimensional array in Java int[][] arrayOfArrayOfInts = { { 1, 2, 3 }, { 10, 20, 30 }, { 100, 200, 300 } }; System.out.println(arrayOfArrayOfInts); double[][] arrayOfArrayOfDoubles = { { 2.0, 3.0 }, { 4.0, 5.0 } }; System.out.println(arrayOfArrayOfDoubles); } } Output

[I@1693b52b

[S@3b5b25a1

[F@5d038b78

[[I@7b9a29

[[D@32c5f9fe 6.如果關注我的上一個示例,那麼您會注意到使用toString()列印陣列不會產生除元素型別之外的任何有用的內容。 理想情況下,我們希望按照它們存在的順序檢視陣列的元素。 我們可以重寫array類的toString()方法嗎?不,這不是一個選項,但不要擔心我們有一個實用程式類java.util.Arrays,它包含幾種方法來處理不同型別的陣列。 我們可以使用Arrays類的toString()和deepToString()方法在Java中列印一維和多維陣列的陣列元素,如下所示。

  1. 與toString()類似,陣列的equals()方法也沒有用處。在大多數情況下,我們希望將陣列的元素及其順序與另一個陣列及其元素進行比較,但array的equals()方法不這樣做,而是引用比較,僅當兩個變數都指向同一個陣列物件時才返回true,如下例所示。但是不用擔心,Arrays類用equals() 和deepEquals() 方法來比較Java中的一維陣列和多維陣列元素。您可以通過以下示例推斷出相同的理解:

public class ArrayEquality{ public static void main(String args[]) { String[] cities = new String[]{"London", "Paris", "NewYork", "HongKong", "Tokyo"}; String[] metros = new String[]{"London", "Paris", "NewYork", "HongKong", "Tokyo"}; String[] capitals = cities;

// comparing array using == operator System.out.println("cities == metros : " + (cities == metros)); System.out.println("cities == capitals : " + (cities == capitals));

// comparing array using equals() method System.out.println("cities.equals(metros) : " + cities.equals(metros)); System.out.println("cities.equals(capitals) : " + cities.equals(capitals));

// comparing array using Arrays.equals() method System.out.println("Arrays.equals(cities, metros) : " + Arrays.equals(cities, metros)); System.out.println("Arrays.equals(cities, capitals) : " + Arrays.equals(cities, capitals));

} } Output : cities == metros : false cities == capitals : true cities.equals(metros) : false cities.equals(capitals) : true Arrays.equals(cities, metros) : true Arrays.equals(cities, capitals) : true 您可以看到儘管元素及其順序相同,第一條語句是假的,因為“==”運算子僅在兩個變數都指向同一陣列時才返回真,這是第二次相等性檢查的情況。同樣,equals()方法也模擬了==運算子的行為,因為陣列不會重寫物件的equals()方法,其預設行為是基於相同的引用來決定相等性。 Arrays.equals()是檢查兩個陣列在Java中是否相等的正確方法。為此,你應該一直使用它。

  1. Java程式設計師應該習慣使用deepEquals()方法來檢查兩個多維陣列的相等性,因為Arrays.equals()方法不執行多維比較。 以下是檢查Java中多維陣列相等性的示例:

public class MultiDimensionalArray{ public static void main(String args[]) { int[][] a1 = { {2,4}, {4,6}, {8,10} }; int[][] a2 = { {12,14}, {14,16}, {18,20} }; int[][] a3 = { {2,4}, {4, 6}, {8,10} };

// checking if two multi-dimensional array of same length but different element equal or not boolean result = Arrays.deepEquals(a1, a2); System.out.println("Does two dimensional array a1 and a2 are equal : " + result);

// checking if two multi-dimensional array of same length, elements equal or not result = Arrays.deepEquals(a1, a3); System.out.println("Does two dimensional array a1 and a3 are equal : " + result);

} } Output : Does two dimensional array a1 and a2 are equal : false Does two dimensional array a1 and a3 are equal : true 9.使用java時,你需要多次在靜態陣列與動態陣列之間進行轉換。

  1. 在Java中有幾種初始化陣列的方法。你也可以在不初始化的情況下建立它們,在這種情況下,所有儲存桶都將保持元素型別的預設值,例如,如果你建立一個空陣列並且沒有初始化它,則所有儲存桶都將保持為零,因為這是Java中整數變數的預設值。 類似地,布林陣列預設使用false值初始化,String陣列使用空值初始化。 如果您事先知道這些值,則可以在建立時初始化陣列,如下所示:

int[] numbers = {1, 2, 3, 4, 5}; // valid int multipleOfThree[] = {3, 6, 9, 12, 15}; // valid int[] even = new int[]{2, 4, 6, 8, 10}; // valid 11. 一個額外的提示是,array與arraylist有很大的不同,後者是一個動態陣列,它可以根據需要調整自身的大小。另一方面,建立後不能更改陣列的大小。除了這一事實之外,這兩個類之間還有幾個不同之處,例如ARAYLIST是Java集合框架的一部分,但陣列不是。

這是關於Java中陣列資料結構的一些要點的列表。使用陣列來儲存相同型別的元素,例如整數、字串或物件,但不能混合它們,例如Java陣列不能同時包含整數和字串,在編譯時是錯誤的,但對於物件,如果編譯器允許,它將在執行時丟擲arraystoreException。同樣,如果知道索引,陣列也是用於訪問元素的快速資料結構之一

歡迎工作一到五年的Java工程師朋友們加入Java架構師:697558955

群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的

架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代

相關文章