1.內存中的數組

在前面的例子中,插圖有點不准確。

創建數組時(與創建字符串時一樣),會分配兩個單獨的內存塊:一個用於存儲數組容器)本身,第二個塊用於存儲其地址的變量。下圖代表了這一澄清:

內存中的數組

為元素數組分配的內存10 intint[]存儲數組地址的變量以綠色int顯示。

int為了比較,存儲值的普通變量199顯示為藍色。

這有點讓人想起在內存中存儲字符串,你不覺得嗎?

沒錯,弦樂。就像使用字符串一樣,您可以將數組變量賦值給另一個:

代碼 解釋
int[] a = new int[10];
a[2] = 4;
a[7] = 9;
int[] b = a;

a[9] = b[2] + a[7];
創建一個元素數組10 int
將值分配4給具有索引的單元格2
將值分配9給具有索引的單元格7
b變量中,保存變量存儲的地址a
現在ab指向內存中的同一個數組對象。
在帶有索引的數組對象的單元格中,寫入存儲在單元格(存儲值)和(存儲值)9中的值的總和。 2479

數組對象保留在原來的位置,並且ab變量將相同的地址(引用)存儲到相同的對象。看圖:

內存中的數組 2

2. 有關使用數組的更多詳細信息

您可以創建任何類型的元素數組。為此,只需在類型名稱後寫上方括號即可。通常,創建數組如下所示:

type[] name = new type[number];

其中type是我們將存儲在數組中的元素的類型。Name是我們將用來引用數組的變量的名稱,number是數組中的單元格數。

上面的示例是創建數組變量和數組對象的規範形式。實際上,這是兩個獨立的實體。

您可以從數組對像中單獨創建一個數組變量:

type[] name;
name = new type[number];

還有一點並非無關緊要:

您可以使用變量甚至整個表達式作為索引數組數組元素的數量

例子:

代碼 解釋
int n = 100;
int[] a = new int[n];
n創建一個元素數組
int n = 100;
int[] a = new int[n * 2 + 3];
創建一個包含203元素的數組
int n = 100;
int[] a = new int[n];
a[n-1] = 2;
a[n-2] = 3;
a[n/5] = a[n-1] + a[n-2]


// a[99] = 2;
// a[98] = 3;
// a[20] = a[99] + a[98];
重要的:
順便說一句,您應該知道,如果您嘗試使用數組中不存在的索引訪問數組單元格(在我們的示例中,這意味著任何不在範圍內的整數),那麼程序將崩潰並0..99顯示ArrayIndexOfBoundException,這意味著索引超出了數組的範圍。

3.數組長度

正如您在前面的示例中看到的,您可以自己創建一個數組變量,然後在代碼中的某處為其賦值(對數組對象的引用)。你甚至可以這樣做:

代碼 解釋
int[] array;
if (a < 10)
   array = new int[10];
else
   array = new int[20];
創建一個類型為的數組變量int[]
如果a變量小於10
則創建一個元素數組10
否則創建一個元素
數組20

現在你還能用這樣的數組做什麼?你怎麼知道裡面有多少元素?

為了解決這個問題,數組有一個名為 的特殊屬性(變量)length。您可以使用以下表達式找到數組的長度:

array.length;

array是數組變量的名稱,length是數組屬性的名稱。屬性的值length不能改變:length屬性本身可以賦值給其他變量,但不能賦值給它(如果你試圖這樣做,程序將無法編譯)。

我們可以像這樣繼續前面的例子:

代碼 解釋
int[] array;
if (a < 10)
   array = new int[10];
else
   array = new int[20];
for (int i = 0; i < array.length; i++)
{
   System.out.println(array[i]);
}
創建一個類型為的數組變量int[]
如果a變量小於10
則創建一個元素數組10
否則創建一個元素
數組 循環遍歷數組的所有元素:從到長度20
0array.length - 1

4. Java 中關於數組的事實總結

讓我們回顧一下我們對數組的了解:

事實 1.數組由許多單元格組成。

事實 2.您可以使用其編號(索引)訪問特定單元格。

事實 3.所有細胞都屬於同一類型。

事實 4.所有單元格的初始值為 0(如果單元格存儲數字)、null(如果單元格存儲對象引用)或false(如果單元格存儲boolean值)。您將在本章中了解有關默認值的更多信息

事實 5. String[] list只是一個變量的聲明。這不會創建容器(數組對象)本身。要使用變量,首先需要創建一個數組(容器)並將其賦值給變量。請參見下面的示例。

事實 6.當我們創建一個數組對象(容器)時,我們必須指出它有多大,即它包含多少個單元格。這是通過如下語句完成的new TypeName[n]

事實 7.可以使用 屬性找到數組的長度.length

事實 8.創建數組後,您不能更改其元素的類型或它存儲的元素的數量。

代碼 解釋
String s;
String[] list;
snull
list_null
list = new String[10];
int n = list.length;
變量list存儲對對象的引用:由10元素組成的字符串數組。
n10
list = new String[0];

現在list指的是一個元素數組0。數組存在,但不能存儲任何元素。

list = null;
System.out.println(list[1]);
會拋出一個異常(程序錯誤),即程序會崩潰。list存儲對的引用null
list = new String[10];
System.out.println(list[10]);
將產生數組越界異常(程序錯誤)。
如果 alist存儲10元素/單元格,則有效索引為:0 1 2 3 4 5 6 7 8 910元素。