亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

1. 前言

數組是一種重要的數據結構,可以利用它作為基礎來實現很多復雜的數據結構。因此我們要深入理解數組的存儲原理和特點,熟悉它的常用操作,重點掌握它在聲明、查詢、存儲、復制等操作時的效率,便于我們在今后的學習和使用中能夠充分利用數組的優勢。

2. 什么是數組?

數組(Array)是一種簡單的復合數據類型,它是一組有序數據的集合。數組根據維度可以分為一維數組、二維數組和多維數組。

因為數據結構的本質就是存放數據的容器,所以我們可以找到它們在生活中的很多原型。如果把冰箱比作計算機存儲的話,我們最常見到的雞蛋盒就是數組的最佳模型了,他們的很多特點甚至都非常相似。

(圖片來源于網絡,版權歸原作者所有)

3. 數組的特點

數組在內存中是存儲在一段連續的空間中,這使得數組在讀取的時候非常高效。我們在冰箱中用雞蛋盒存放雞蛋也是利用了冰箱里一塊完整連續的空間,便于我們存取雞蛋的時候快速準確而不是把雞蛋散落在各個角落里。但是雞蛋盒有一個缺點就是我們買來的時候它的容量是固定的,如果裝滿了就不能再擴容了,數組也是一樣,在創建的時候必須確定長度并且不能變更,使得數組不適用于元素需要頻繁增加和刪除的場景。總結起來數組和雞蛋盒同時具有以下三大特點:

  • 一致性:數組中的每個元素都具有相同的數據類型,我們生活中一般也只會在雞蛋盒中放置雞蛋而不會摻雜草莓;
  • 有序性:數組中的元素是有序的,并且可以用唯一下標來訪問;雞蛋盒也是有序的,甚至我們也可以對雞蛋盒中的格子編號來明確快速地指出是哪一個格子的雞蛋有裂紋;
  • 不可變性:數組在初始化的時候長度一旦確定,就不可以再變更;而雞蛋盒子一旦需要變更容量,我們就只能買一個新的盒子了。

4. 數組的幾個常用操作

了解了數組的特點,我們來看下怎么使用他們。

4.1 聲明和賦值

  • 只聲明數組,并未在堆內存中開辟空間
// 數據類型 [] 數組名稱 = null;
int [] array = null;
  • 聲明數組的同時開辟空間
// 數據類型 [] 數組名稱 = new 數據類型[長度];
int [] array = new int[3];
  • 聲明數組的同時開辟空間、同時給數組插入元素
//數據類型 [] 數組名稱 = new 數據類型[]{元素1,元素2...};
int [] array = new int[]{1,2,3};

//數據類型 [] 數組名稱 = {元素1,元素2...}(上一種方法的縮寫,不建議);
int [] array = {1,2,3};
  • 多維數組的聲明方式
//數據類型 對象數組[][] = new 數據類型[一維長度][二維長度];
int array[][] = new int[3][5];

聲明數組有以上幾種方式,因為數組是引用數據類型,在棧內存聲明、在堆內存中開辟連續的定長空間,所以我們可以在下圖中看到第二種方式聲明數組的時候,其實是分步完成的,第一步開辟了一個長度為3的數組空間,第二步分別為數組的三個元素賦值。

(圖片來源于網絡,版權歸原作者所有)

4.2 遍歷和讀取

數組有一個屬性 length 表示數組的長度,使得我們可以很方便的遍歷數組。這個長度在開辟空間的時候就已經固定了,就像雞蛋盒子的容量一樣,而且不論格子里存放元素的數量是多少,它的容量都是恒定不變的。

// 聲明一個數組并賦值
int [] array = new int[5];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;
 //遍歷方式1:
 for (int i = 0; i < array.length; i++) {
   System.out.println(array[i]);
 }
 //遍歷方式2:
 for(int a:array){
   System.out.println(a);
 }

4.3 復制擴容

前面我們提到,盒子里的雞蛋放不下只能去購買新的盒子,數組也是一樣,容量不夠的時候只能去創建新的數組,并且將原有數組中的元素按照原來的序號復制到新的數組中去。

//為長度為5的原數組擴容一倍
//第一步:聲明初始數組
int [] array = new int[]{1,2,3,4,5};
//第二步:聲明一個容量為原始數組2倍的新數組
int [] newArray = new int[array.length*2];
//第三步:將元素復制到新數組中 
for ( int i = 0; i < array.length; i++) { 
newArray[i] = array[i];                                `
}

說到這里我們還要提一個細節,就是數組的空間是連續的,不等同于數組的元素是連續的,我們可以在數組中的任意位置存放或不存放元素,就像我們可以在雞蛋盒子的任何一個格子里放或不放雞蛋,都不影響數組本身的特性。

(圖片來源于網絡,版權歸原作者所有)

4. java.util.Arrays

我們對數組進行的操作其實很多都被封裝在一個叫做 Arrays 的工具類中了,它為數組封裝了一些常用的靜態方法,使得我們可以輕松的對數組實現查詢、排序、填充等操作,大家可以通過查看源代碼或 API 來了解他們的使用方法。前面我們講到的復制擴容數組就可以用 Arrays.copyOf (原數組名,新數組長度) 方法來輕松實現。
這里我們還要單獨提一下 asList () 方法,這個方法可以將數組轉換成 ArrayList,使我們有更多的手段來處理數組,比如追加元素、刪除元素、判斷某個元素是否在數組中等等,解決了數組長度不能改變等特性給我們帶來的不便。

//聲明一個數組并賦值
Integer[] array = new Integer[5];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;

ArrayList<Integer> arrayList = new ArrayList<Integer>(Arrays.asList(array));
System.out.println(arrayList);

輸出:[1,2,3,4,5]

boolean isExist = Arrays.asList(array).contains(1);
System.out.println(isExist);

輸出:true

5. 數組的應用與思考

根據數組的特點我們可以發現,數組的使用場景多是在讀取頻繁,增減較少最好是不需要增減的場合,在初始化數組的時候能夠確定元素的最大個數,比如以下場景:

  • 存儲某班級學生的語文成績時可以使用數組,元素長度固定幾乎不需要增減,讀取高效
  • 導入EXCEL模板數據的時候可以使用二維數組來儲存臨時數據,充分利用了數組讀取效率高的特性

對于動態增加和減少元素的場景,我們可以使用剛剛提到的 ArrayList,后面的章節我們會對這部分內容做詳細介紹。
這里分享一個有意思的小插曲,我在制做上面圖片敲代碼的時候手誤寫了這樣一行代碼,小伙伴們可以結合第二行和第三行的執行結果來解釋一下第一行代碼的實現結果。

int [] array = new int[]{};
System.out.println(array.length);
array[0] = 1;

6. 小結

本節我們知道了數組是一組有序數據的集合,它的特點一致性、有序性和不可變性,因此它的讀取效率高,增加或刪除元素的效率低。此外我們要熟練掌握數組的聲明方法和基本操作,作為一個基本數據結構,了解它的原理和擴容方式還將有助于我們后面鏈表等知識的學習。