數(shù)組:
數(shù)組是具有多個連續(xù)存儲的相同數(shù)據(jù)類型的變量組成的集合體茄茁。
數(shù)組元素:
構(gòu)成一個數(shù)組的每一個數(shù)據(jù)都是數(shù)組元素。
數(shù)組下標:
表示數(shù)組元素在數(shù)組中的位置,用整數(shù)表示,從0開始非剃,依次加一洽腺,也可以叫做索引(index)嗦嗡,下標的界限為0到數(shù)組長度(數(shù)組大械ň纭)-1旱物,下標如果是負數(shù)遥缕,或者下標超過了數(shù)組長度-1,會發(fā)生越界(ArrayIndexOutOfbounds)宵呛。
使用數(shù)組的步驟:
1.定于數(shù)組
2.為數(shù)組元素分配內(nèi)存
3.數(shù)組元素初始化
4.使用數(shù)據(jù)
數(shù)組長度:
數(shù)組中元素的個數(shù)单匣,也稱為數(shù)組大小,獲取數(shù)組長度的方法為數(shù)組名.length宝穗,數(shù)組的長度是在為數(shù)組分配內(nèi)存時確定大小户秤,大小不可以改變,如果需要擴大或者縮小逮矛,需要重新定義一個數(shù)組鸡号。
數(shù)組的定義和使用:
數(shù)據(jù)類型 []數(shù)組名; 或者 數(shù)據(jù)類型 數(shù)組名[]; 定義數(shù)組本質(zhì)上就是向JVM虛擬機申請數(shù)據(jù)。JVM將內(nèi)存劃分為棧须鼎、堆鲸伴、方法區(qū)幾個區(qū)域,不同的區(qū)域存儲不用類別的數(shù)據(jù)莉兰。JVM在定義數(shù)組時是將數(shù)組的名稱存儲在棧中,棧是一個先進后出的數(shù)據(jù)結(jié)構(gòu)礁竞。指出數(shù)組元素的個數(shù)糖荒,通過new運算符,讓系統(tǒng)為數(shù)組元素分配內(nèi)存空間模捂,數(shù)組元素存儲在堆中捶朵。數(shù)組元素的初始化就是第一次賦值,沒有初始化的數(shù)組元素為默認值狂男。
數(shù)組的數(shù)據(jù)結(jié)構(gòu)(線性表):
全名為線性存儲結(jié)構(gòu)综看,使用線性表存儲數(shù)據(jù)的方式可以理解為把所有數(shù)據(jù)用一根線串起來,存儲到物理空間中岖食。
數(shù)組的排序:
排序算法有很多種红碑,常用的有冒泡排序、插入排序泡垃、選擇排序析珊、快速排序、堆排序蔑穴、歸并排序忠寻、希爾排序、二叉樹排序存和、計時排序等等奕剃。
列舉幾個我學過的例子:
冒泡排序代碼案例
public static void main(String[] args) {
int score[] =new int[80000]; // 定義數(shù)組大小
Random random =new Random();
for (int i =0; i < score.length; i++) {
score[i] = random.nextInt(80000); // 隨機生成數(shù)組元素
}
long start = System.currentTimeMillis(); // 開始計時
for (int i =0; i < score.length-1;i++){
for (int j =0;j < score.length-i-1;j++){
if (score[j] > score[j +1]) {
int tmp = score[j];
score[j] = score[j +1];
score[j +1] = tmp; //數(shù)據(jù)進行兩兩比較衷旅,較小的放在前面,較大的放在后面纵朋,依次類推柿顶,直至全部確定位置,排序完畢
}
}
}
long end = System.currentTimeMillis();// 計時結(jié)束
System.out.println(end-start);// 輸出排序所用的時間
}
數(shù)據(jù)進行兩兩比較倡蝙,較小的放在前面九串,較大的放在后面,依次類推寺鸥,直至全部確定位置猪钮,排序完畢。
插入排序代碼案例
public static void main(String[] args) {
int arr[] =new int[80000]; // 定義數(shù)組大小
for (int i=0 ;i <80000;i++){
arr[i] = (int)(Math.random()*80000); // 隨機生成數(shù)組元素
}
long start = System.currentTimeMillis(); //計時開始
for (int i =0; i < arr.length ; i++) {
int j = i;
while(j >0){
if(arr[j] < arr[j-1]){
int tmp;
tmp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tmp;
j--;
}
else{
break;
}
}
} // 從第二個數(shù)據(jù)開始胆建,依次和前面的數(shù)據(jù)進行兩兩比較烤低,比前面的數(shù)據(jù)小則繼續(xù)進行比較,比前面的數(shù)據(jù)大則插入到該數(shù)據(jù)的后方笆载,到了下標為0的位置則直接插入扑馁,依次類推,直至全部確定位置凉驻,排序完畢腻要。
long end = System.currentTimeMillis(); //計時結(jié)束
System.out.print(end - start); // 輸出排序所用時間
}
從第二個數(shù)據(jù)開始,依次和前面的數(shù)據(jù)進行兩兩比較涝登,比前面的數(shù)據(jù)小則繼續(xù)進行比較雄家,比前面的數(shù)據(jù)大則插入到該數(shù)據(jù)的后方,到了下標為0的位置則直接插入胀滚,依次類推趟济,直至全部確定位置,排序完畢
選擇排序案例代碼
public static void main(String[] args) {
int arr[] =new int[80000]; // 定義數(shù)組的大小
Random input =new Random();
for (int i =0; i < arr.length; i++) {
arr[i] = input.nextInt(80000); // 隨機生成數(shù)組元素
}
long start = System.currentTimeMillis(); // 計時開始
for (int i =0; i < arr.length-1; i++) {
int minIndex = i;
int min = arr[i];
for (int j = i+1; j < arr.length; j++) {
if (arr[j] < min) {
min = arr[j];
minIndex = j;
}
}
int tmp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = tmp;
} // 選中下標為0的數(shù)據(jù)和后面的數(shù)據(jù)兩兩進行比較咽笼,如果后者比前者小顷编,則記錄后者的下標,然后用后者和后面的數(shù)據(jù)進行兩兩比較剑刑,一輪比較完成后媳纬,最后那個被記錄下標的元素與第一個數(shù)據(jù)比較,較小則交換位置并且確定位置施掏,之后選中下標為1的數(shù)據(jù)進行上述操作层宫,每比較一輪確定一個數(shù)據(jù)的位置,直至全部確定其监,排序完畢萌腿。
long end = System.currentTimeMillis(); //計時結(jié)束
System.out.println(end-start); // 輸出排序所用的時間
System.out.println(Arrays.toString(arr)); // 輸出隨機生成數(shù)組元素的數(shù)組
}
選中下標為0的數(shù)據(jù)和后面的數(shù)據(jù)兩兩進行比較,如果后者比前者小抖苦,則記錄后者的下標毁菱,然后用后者和后面的數(shù)據(jù)進行兩兩比較米死,一輪比較完成后,最后那個被記錄下標的元素與第一個數(shù)據(jù)比較贮庞,較小則交換位置并且確定位置峦筒,之后選中下標為1的數(shù)據(jù)進行上述操作,每比較一輪確定一個數(shù)據(jù)的位置窗慎,直至全部確定物喷,排序完畢
使用數(shù)組時的常見問題:
(1)下標越界異常
例如一個擁有五個元素的數(shù)組,下標分別為0遮斥、1峦失、2、3术吗、4尉辑,輸出時下標不能大于4,輸出的下標大于4時较屿,系統(tǒng)會提示運行該程序時發(fā)生了java.labg.ArrayIndexOutOfBoundsException異常隧魄,表示下標越界了,數(shù)組下標超過0——數(shù)組長度-1的范圍的值就會發(fā)生下標越界異常隘蝎。
(2)沒有分配內(nèi)存空間
例如一個數(shù)組score[] = null;輸出時系統(tǒng)提示運行該程序時發(fā)生了java.lang.NullPointerException異常购啄,表示空指針異常,這個程序只為數(shù)組名在棧中分配了內(nèi)存嘱么,但是沒有在堆中為數(shù)組元素分配內(nèi)存狮含。
(3)語法錯誤
數(shù)組類型 數(shù)組名[] //中括號中不允許寫長度;數(shù)組類型 數(shù)組名 = new 數(shù)組類型[] {數(shù)組元素} //直接為數(shù)組元素初始化不允許指定數(shù)組長度拱撵;錯誤類型:數(shù)組類型 數(shù)組名[];換行 數(shù)組名 = {數(shù)組元素} //直接初始化數(shù)組元素的代碼必須寫在同一行辉川。
二維數(shù)組
定義方法:數(shù)據(jù)類型 [][]數(shù)組名 或者 數(shù)據(jù)類型 數(shù)組名[][]表蝙,第一個[]表示第一維拴测,第二個[]表示第二維。
二維數(shù)組中數(shù)據(jù)的元素類型必須相同府蛇,表示一個一維數(shù)組集索,這個一維數(shù)組的每一個元素又是一個一維數(shù)組。
Arrays類
常用方法:
1.equals(數(shù)組名1汇跨,數(shù)組名2) 返回類型為boolean 用于比較兩個數(shù)組是否相等务荆。
2.sorry(數(shù)組名) 返回類型為void 對數(shù)組的元素進行排序。
3.toString(數(shù)組名) 返回類型為String 把一個數(shù)組轉(zhuǎn)換成一個字符串穷遂。
4.fill(數(shù)組名1函匕,元素值) 返回類型為void 把數(shù)組的所有元素都賦值成元素值。
5.copyOf(數(shù)組名1,length) 返回類型與數(shù)組1數(shù)據(jù)類型相同 把數(shù)組復(fù)制成一個長度為length的新數(shù)組蚪黑。
6.binarySearch(數(shù)組名,元素值) 返回類型為int 查詢元素值在數(shù)組中的下標盅惜。
數(shù)組的輸出:
Systom.out.print(數(shù)組名稱) 這樣輸出的是數(shù)組的內(nèi)存地址編號 Systom.out.print(Arrays.toString) 這樣輸出的是數(shù)組元素