一、數組類型定義
* 在java中使用數組必須先進行類型說明。
數組說明的一般形式為:類型說明符 數組名 [常量表達式],……;
其中,類型說明符是任一種基本數據類型或構造數據類型。數組名是用戶定義的數組標識符。方括號中的常量表達式表示數據元素的個數,也稱為數組的長度。
數組就是一次性定義相同數據類型的一組變量數組定義。
*舉例
int a[10]; 說明整型數組a,有10個元素。若要表示第10個元素,則使用a[9]。第一個則是a[0]。
float b[10],c[20]; 說明實型數組b,有10個元素,實型數組c,有20個元素。
char ch[20]; 說明字符數組ch,有20個元素。
*特點
1.數組是相同數據類型的元素的集合。
2.數組中的各元素的存儲是有先后順序的,它們在內存中按照這個先后順序連續存放在一起。
3.數組元素用整個數組的名字和它自己在數組中的順序位置來表示。例如,a[0]表示名字為a的數組中的第一個元素,a[1]代表數組a的第二個元素,以此類推。
*一維數組
①定義:一維數組是最簡單的數組,其邏輯結構是線性表。要使用一維數組,需經過定義、初始化和應用等過程。
②數組聲明: 在數組的聲明格式里,“數據類型”是聲明數組元素的數據類型,可以是java語言中任意的數據類型,包括簡單類型和結構類型。
“數組名”是用來統一這些相同數據類型的名稱,其命名規則和變量的命名規則相同。
數組聲明之后,接下來便是要分配數組所需要的內存,這時必須用運算符new,其中“個數”是告訴編譯器,所聲明的數組要存放多少個元素,所以new運算符是通知編譯器根據括號里的個數,在內存中分配一塊空間供該數組使用。利用new運算符為數組元素分配內存空間的方式稱為動態分配方式。
③舉例:
int[] x; //聲明名稱為x的int型數組
x=new int[10]; //x數組中包含有10個元素,並為這10個元素分配內存空間
在聲明數組時,也可以將兩個語句合並成一行,利用這種格式在聲明數組的同時,也分配一塊內存供數組使用,格式如下:
數據類型[] 數組名= new 數據類型[個數];
int[] x = new int [10];
int[] x= new int{1,3,9,4};
等號左邊的int[]x相當於定義了一個特殊的變量x,x的數據類型是一個對int型數組對象的引用,x就是一個數組的引用變量,其引用的數組元素個數不定。等號右邊的new int[10]就是在堆內存中創建一個具有10個int型變量的數組對象。int[]x = new int [10];就是將右邊的數組對象賦值給左邊的數組引用變量。[5]
*二維數組
①定義:前面介紹的數組只有一個下標,稱為一維數組, 其數組元素也稱為單下標變量。在實際問題中有很多量是二維的或多維的, 因此Java中允許構造多維數組。多維數組元素有多個下標, 以標識它在數組中的位置,所以也稱為多下標變量。
②二維數組類型說明的一般形式是:
類型說明符數組名[常量表達式1][常量表達式2]…;
其中常量表達式1表示第一維下標的長度,常量表達式2 表示第二維下標的長度
int[][] arr2=new int[3][4];
♦ int[][] arr=new int[4][]; //首先開辟一個4行的一維數組
arr[0]=new int[]{12}; //然后給每一行數組進行賦值
arr[1]=new int[]{8,9}; //此時相當於新new了一個一維數組,然后將一維數組的地址,賦給arr[i]
arr[2]=new int[]{11,7,16}; //所以,在二維數組中,一維一般存的都是地址
arr[3]=new int[]{13,9,8,7};
注意:在二維數組中,一維一般存儲地址
♥arr arr1打印出是地址,是因為數組為引用數據類型,變量里存儲地址,且變量在棧里存放,而new出來的數組內容在堆里存放
♥arr[0]打印出來是地址是因為在二維數組中,一維存放地址,二維存放內容,因此arr[0][1]打印出來是數值。
二維數組在概念上是二維的,即是說其下標在兩個方向上變化, 下標變量在數組中的位置也處於一個平面之中, 而不是象一維數組只是一個向量。但是,實際的硬件存儲器卻是連續編址的, 也就是說存儲器單元是按一維線性排列的。如何在一維存儲器中存放二維數組,可有兩種方式:一種是按行排列, 即放完一行之后順次放入第二行。另一種是按列排列, 即放完一列之后再順次放入第二列。在C語言中,二維數組是按行排列的。在如上中,按行順次存放,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四個元素也是依次存放。由於數組a說明為int類型,該類型占兩個字節的內存空間,所以每個元素均占有兩個字節(圖中每一格為一字節)。
*三維數組
三維數組,是指維數為三的數組結構。三維數組是最常見的多維數組,由於其可以用來描述三維空間中的位置或狀態而被廣泛使用。
三維數組就是維度為三的數組,可以認為它表示對該數組存儲的內容使用了三個獨立參量去描述,但更多的是認為該數組的下標是由三個不同的參量組成的。
數組這一概念主要用在編寫程序當中,和數學中的向量、矩陣等概念有一定的差別,主要表現:在數組內的元素可以是任意的相同數據類型,包括向量和矩陣。
對數組的訪問一般是通過下標進行的。在三維數組中,數組的下標是由三個數字構成的,通過這三個數字組成的下標對數組的內容進行訪問。
二、數組的內存分配
*棧內存
在方法中定義的一些基本類型的變量和對象的引用變量都在方法的棧內存中分配,當在一段代碼中定義一個變量時,java就在棧內存中為這個變量分配內存空間,當超出變量的作用域后,java會自動釋放掉為該 變量所分配的內存空間。
*堆內存
堆內存用來存放由new運算符創建的對象和數組,在堆中分配的內存,由java虛擬機的自動垃圾回收器來管理。在堆中創建了一個數組或對象后,同時還在棧內存中定義一個特殊的變量。讓棧內存中的這個變量 的取值等於數組或者對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量,引用變量實際上保存的是數組或對象在堆內存中的地址(也稱為對象的句柄),以后就可以在程序中使用棧的引用變 量來訪問堆中的數組或對象
三、數組的特征
* 1.定義數組必須指定大小
* 2.數組的每一個元素的內存都是連續的
* 3.數組的隨機訪問操作,是一個常量時間 arr[index]
* 4.每一個數組都內置了一個成員變量 length,表示數組的總長度
* 5.數組增加元素,涉及增加位置后面的所有元素都要進行移動,所以該操作花費的
* 時間線性時間
* 6.數組刪除元素,涉及增加位置后面的所有元素都要進行移動,所以該操作花費的
* 時間線性時間
* 7.數組的元素查找花費時間為線性時間
四、數組的三種輸出方式
①方式一:
// 輸出數組方式一 標准for循環
for (int i = 0; i < arr.length; i++)
{
System.out.print(arr[i] + " ");
}
②方式二
// 輸出數組方式二 foreach arr.length
for (int val : arr)
{
System.out.print(val + " "); //用於輸出一維數組
}
/*****************************/
for(int[] ints:arr)
{
for(int val: ints)
{
System.out.print(val+" "); //用於輸出二維數組
}
}
③方式三
//輸出數組方式三 Arrays.toString輸出數組元素的內容
System.out.println(Arrays.toString(arr)); //用於輸出一維數組
System.out.println(Arrays.deepToString(arr)); //用於輸出二維數組
五,數組的輔助類Arrays
Arrays.copyOf 數組的擴容和縮容
Arrays.toString 打印數組元素
Arrays.deepToString 打印二維數組元素的值
Arrays.fill 給數組初始化/重置
Arrays.equals 比較兩個數組的內容是否相等
練習題:(分蘋果問題)
n個奶牛,每個奶牛擁有的蘋果數量不相同,現要求你每次只能從一個奶牛身上取兩個蘋果起給其他奶牛,問要至少移動多少次,可以將蘋果均分,如果方案不存在輸出-1。
練習題:(最長路徑問題)
* 12
8 9
11 7 16
13 9 8 7
可以從每個結點 往下,往左斜下,往右斜下分別遍歷,以致找到一條從上到下的最長路徑。

練習題:定義一個容量為100的數組,給每個元素隨機分配一個數,范圍在【101,200】,先打印出其中的偶數,然后將其容量擴大到200,使其前面的數值大小不發生改變,並給后100個元素也隨機分配【0,50】的任意一個數。





