Java數(shù)組(Array)最全匯總(上篇)
前言
本章是關(guān)于Java數(shù)組的最全匯總,本篇為匯總上篇,主要講了一維數(shù)組的相關(guān)內(nèi)容。
數(shù)組是最常見的一種數(shù)據(jù)結(jié)構(gòu),它是相同類型的用一個標(biāo)識符封裝到一起的基本類型數(shù)據(jù)序列或者對象序列。
數(shù)組使用一個統(tǒng)一的數(shù)組名和不同的下標(biāo)來唯一確定數(shù)組中的元素。
實質(zhì)上,數(shù)組是一個簡單的線性序列,因此訪問速度很快。
本章將詳細(xì)介紹 Java 中數(shù)組的創(chuàng)建、初始化和處理方法,如獲取數(shù)組長度、查找數(shù)組元素和數(shù)組排序等。
本章學(xué)習(xí)要點
- 掌握一維數(shù)組的創(chuàng)建方法
- 掌握一維數(shù)組的初始化方法
- 熟練掌握一維數(shù)組的應(yīng)用
- 掌握二維數(shù)組的創(chuàng)建
- 掌握二維數(shù)組的初始化
- 熟練掌握二維數(shù)組元素的訪問方式
- 掌握數(shù)組的復(fù)制方法
- 掌握搜索數(shù)組元素的方法
- 掌握對數(shù)組的排序算法
Java數(shù)組簡介:數(shù)組是什么?
在某些情況下,雖然可以使用單個變量來存儲信息,但是如果需要存儲的信息較多(例如存儲 50 名學(xué)生的成績),這時再依次創(chuàng)建變量聲明并賦值顯得非常麻煩。
隨著處理的信息量越來越大,工作也就越來越煩瑣,這時可以使用數(shù)組或集合來存儲信息。
通過使用數(shù)組,可以在很大程度上縮短和簡化程序代碼,從而提高應(yīng)用程序的效率。
數(shù)組(array)是一種最簡單的復(fù)合數(shù)據(jù)類型,它是有序數(shù)據(jù)的集合,數(shù)組中的每個元素具有相同的數(shù)據(jù)類型,可以用一個統(tǒng)一的數(shù)組名和不同的下標(biāo)來確定數(shù)組中唯一的元素。
根據(jù)數(shù)組的維度,可以將其分為一維數(shù)組、二維數(shù)組和多維數(shù)組等。
在計算機語言中數(shù)組是非常重要的集合類型,大部分計算機語言中數(shù)組具有如下三個基本特性:
- 一致性:數(shù)組只能保存相同數(shù)據(jù)類型元素,元素的數(shù)據(jù)類型可以是任何相同的數(shù)據(jù)類型。
- 有序性:數(shù)組中的元素是有序的,通過下標(biāo)訪問。
- 不可變性:數(shù)組一旦初始化,則長度(數(shù)組中元素的個數(shù))不可變。
總的來說,數(shù)組具有以下特點:
- 數(shù)組可以是一維數(shù)組、二維數(shù)組或多維數(shù)組。
- 數(shù)值數(shù)組元素的默認(rèn)值為 0,而引用元素的默認(rèn)值為 null。
- 數(shù)組的索引從 0 開始,如果數(shù)組有 n 個元素,那么數(shù)組的索引是從 0 到(n-1)。
- 數(shù)組元素可以是任何類型,包括數(shù)組類型。
- 數(shù)組類型是從抽象基類 Array 派生的引用類型。
注意:如果你熟悉 C/C++,請注意,Java 數(shù)組的工作原理與它們不同。
在 Java 中數(shù)組的下標(biāo)是從零開始的,很多計算機語言的數(shù)組下標(biāo)也從零開始。
Java 數(shù)組下標(biāo)訪問運算符是中括號,如 intArray[0],表示訪問 intArray 數(shù)組的第一個元素,0 是第一個元素的下標(biāo)。
Java 中的數(shù)組本身是引用數(shù)據(jù)類型,它的長度屬性是 length。
Java一維數(shù)組的定義、賦值和初始化
當(dāng)數(shù)組中每個元素都只帶有一個下標(biāo)時,這種數(shù)組就是“一維數(shù)組”。
一維數(shù)組(one-dimensional array)實質(zhì)上是一組相同類型數(shù)據(jù)的線性集合,是數(shù)組中最簡單的一種數(shù)組。
數(shù)組是引用數(shù)據(jù)類型,引用數(shù)據(jù)類型在使用之前一定要做兩件事情:聲明和初始化。所以本文將重點介紹一維數(shù)組的創(chuàng)建、初始化和使用。
創(chuàng)建一維數(shù)組
為了在程序中使用一個數(shù)組,必須聲明一個引用該數(shù)組的變量,并指明整個變量可以引用的數(shù)組類型。
聲明一維數(shù)組的語法格式為:
type[] arrayName; // 數(shù)據(jù)類型[] 數(shù)組名;
或者
type arrayName[]; // 數(shù)據(jù)類型 數(shù)組名[];
可見數(shù)組的聲明有兩種形式:一種是中括號”[]“跟在元素數(shù)據(jù)類型之后,另一種是中括號”[]“跟在變量名之后。
對于以上兩種語法格式而言,Java 更推薦采用第一種聲明格式,因為第一種格式不僅具有更好的語意,而且具有更好的可讀性。
對于第一種格式
type[] arrayName
很容易理解這是定義一個變量,其中變量名是 arrayName,而變量類型是 type[]。
前面已經(jīng)指出:type[] 確實是一種新類型,與 type 類型完全不同(例如 int 類型是基本類型,但 int[] 是引用類型)。
因此,這種方式既容易理解,也符合定義變量的語法。
但第二種格式
type arrayName[]
可讀性就差了,看起來好像定義了一個類型為 type 的變量,而變量名是 arrayName[],這與真實的含義相去甚遠(yuǎn)。
可能有些讀者非常喜歡
type arrayName[]
這種定義數(shù)組的方式,這可能是因為早期某些計算機讀物的誤導(dǎo),從現(xiàn)在開始最好就不要再使用這種糟糕的方式了。
提示:Java 的模仿者 C# 就不再支持
type arrayName[]
這種語法,它只支持第一種定義數(shù)組的語法。
以上兩種格式都可以聲明一個數(shù)組,其中的數(shù)據(jù)類型既可以是基本數(shù)據(jù)類型,也可以是引用數(shù)據(jù)類型。
數(shù)組名可以是任意合法的變量名。
聲明數(shù)組就是要告訴計算機該數(shù)組中數(shù)據(jù)的類型是什么。例如:
int[] score; // 存儲學(xué)生的成績,類型為整型double[] price; // 存儲商品的價格,類型為浮點型String[] name; // 存儲商品名稱,類型為字符串型
在聲明數(shù)組時不需要規(guī)定數(shù)組的長度,例如:
int score[10]; // 這是錯誤的
注意:在聲明數(shù)組變量時千萬不要漏寫[]。
分配空間
聲明了數(shù)組,只是得到了一個存放數(shù)組的變量,并沒有為數(shù)組元素分配內(nèi)存空間,不能使用。
因此要為數(shù)組分配內(nèi)存空間,這樣數(shù)組的每一個元素才有一個空間進(jìn)行存儲。
簡單地說,分配空間就是要告訴計算機在內(nèi)存中為它分配幾個連續(xù)的位置來存儲數(shù)據(jù)。
在 Java 中可以使用 new 關(guān)鍵字來給數(shù)組分配空間。分配空間的語法格式如下:
arrayName = new type[size]; // 數(shù)組名 = new 數(shù)據(jù)類型[數(shù)組長度];
其中,數(shù)組長度就是數(shù)組中能存放的元素個數(shù),顯然應(yīng)該為大于 0 的整數(shù),例如:
score = new int[10];price = new double[30];name = new String[20];
這里的 score 是已經(jīng)聲明過的 int[] 類型的變量,當(dāng)然也可以在聲明數(shù)組時就給它分配空間,語法格式如下:
type[] arrayName = new type[size]; // 數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[數(shù)組長度];
例 1
例如,聲明并分配一個長度為 5 的 int 類型數(shù)組 arr,代碼如下:
int[] arr = new int[5];
執(zhí)行后 arr 數(shù)組在內(nèi)存中的格式如圖 1 所示。
圖 1 一維數(shù)組的內(nèi)存格式
在圖 1 中 arr 為數(shù)組名稱,方括號“[]”中的值為數(shù)組的下標(biāo)。
數(shù)組通過下標(biāo)來區(qū)分?jǐn)?shù)組中不同的元素,并且下標(biāo)是從 0 開始的。
因此這里包含 5 個元素的 arr 數(shù)組最大下標(biāo)為 4。
注意:一旦聲明了數(shù)組的大小,就不能再修改。這里的數(shù)組長度也是必需的,不能少。
盡管數(shù)組可以存儲一組基本數(shù)據(jù)類型的元素,但是數(shù)組整體屬于引用數(shù)據(jù)類型。
當(dāng)聲明一個數(shù)組變量時,其實是創(chuàng)建了一個類型為“數(shù)據(jù)類型[]”(如 int[]、double[]、String[])的數(shù)組對象。
初始化一維數(shù)組
Java 語言中數(shù)組必須先初始化,然后才可以使用。
所謂初始化,就是為數(shù)組的數(shù)組元素分配內(nèi)存空間,并為每個數(shù)組元素賦初始值。
能不能只分配內(nèi)存空間,不賦初始值呢?
不行,一旦為數(shù)組的每個數(shù)組元素分配了內(nèi)存空間,每個內(nèi)存空間里存儲的內(nèi)容就是該數(shù)組元素的值,即使這個內(nèi)存空間存儲的內(nèi)容為空,這個空也是一個值(null)。
不管以哪種方式來初始化數(shù)組,只要為數(shù)組元素分配了內(nèi)存空間,數(shù)組元素就具有了初始值。
初始值的獲得有兩種形式,一種由系統(tǒng)自動分配,另一種由程序員指定。
數(shù)組在初始化數(shù)組的同時,可以指定數(shù)組的大小,也可以分別初始化數(shù)組中的每一個元素。
在 Java 語言中,初始化數(shù)組有以下 3 種方式。
使用 new 指定數(shù)組大小后進(jìn)行初始化
使用 new 關(guān)鍵字創(chuàng)建數(shù)組,在創(chuàng)建時指定數(shù)組的大小。語法如下:
type[] arrayName = new int[size];
創(chuàng)建數(shù)組之后,元素的值并不確定,需要為每一個數(shù)組的元素進(jìn)行賦值,其下標(biāo)從 0 開始。
例 2
創(chuàng)建包含 5 個元素的 int 類型的數(shù)組,然后分別將元素的值設(shè)置為 1、2、3、5 和 8。代碼如下:
int[] number = new int[5]; number[0] = 1; number[1] = 2; number[2] = 3; number[3] = 5; number[4] = 8;
如果程序員只指定了數(shù)組的長度,那么系統(tǒng)將負(fù)責(zé)為這些數(shù)組元素分配初始值。指定初始值時,系統(tǒng)按如下規(guī)則分配初始值。
- 數(shù)組元素的類型是基本類型中的整數(shù)類型(byte、short、int 和 long),則數(shù)組元素的值是 0。
- 數(shù)組元素的類型是基本類型中的浮點類型(float、double),則數(shù)組元素的值是 0.0。
- 數(shù)組元素的類型是基本類型中的字符類型(char),則數(shù)組元素的值是‘\u0000’。
- 數(shù)組元素的類型是基本類型中的布爾類型(boolean),則數(shù)組元素的值是 false。
- 數(shù)組元素的類型是引用類型(類、接口和數(shù)組),則數(shù)組元素的值是 null。
使用 new 指定數(shù)組元素的值
使用上述方式初始化數(shù)組時,只有在為元素賦值時才確定值。
可以不使用上述方式,而是在初始化時就已經(jīng)確定值。語法如下:
type[] arrayName = new type[]{值 1,值 2,值 3,值 4,? ? ?,值 n};
例 3
更改例 2 中的代碼,使用 new 直接指定數(shù)組元素的值。代碼如下:
int[] number = new int[]{1, 2, 3, 5, 8};
上述代碼的效果等價于例 2 的效果。
注意:不要在進(jìn)行數(shù)組初始化時,既指定數(shù)組的長度,也為每個數(shù)組元素分配初始值,這樣會造成代碼錯誤。例如下面代碼:
int[] number = new int [5] {1,2,3,4,5};
3)直接指定數(shù)組元素的值
在上述兩種方式的語法中,type 可以省略,如果已經(jīng)聲明數(shù)組變量,那么直接使用這兩種方式進(jìn)行初始化。
如果不想使用上述兩種方式,那么可以不使用 new 直接指定數(shù)組元素的值。語法如下:
type[] arrayName = {值 1,值 2,值 3,...,值 n};
例 4
在前面例子的基礎(chǔ)上更改代碼,直接使用上述語法實現(xiàn) number 數(shù)組的初始化。代碼如下:
int[] number = {1,2,3,5,8};
使用這種方式時,數(shù)組的聲明和初始化操作要同步,即不能省略數(shù)組變量的類型。如下的代碼就是錯誤的:
int[] number; number = {1,2,3,5,8};
獲取單個元素
獲取單個元素是指獲取數(shù)組中的一個元素,如第一個元素或最后一個元素。
獲取單個元素的方法非常簡單,指定元素所在數(shù)組的下標(biāo)即可。語法如下:
arrayName[index];
其中,arrayName 表示數(shù)組變量,index 表示下標(biāo),下標(biāo)為 0 表示獲取第一個元素,下標(biāo)為 array.length-1 表示獲取最后一個元素。
當(dāng)指定的下標(biāo)值超出數(shù)組的總長度時,會拋出 ArraylndexOutOfBoundsException 異常。
例 5
獲取 number 數(shù)組中的第一個元素、最后一個元素和第六個元素,并將元素的值輸出。代碼如下:
int[] number = {1,2,3,5,8}; System.out.println("獲取第一個元素:"+number[0]); System.out.println("獲取最后一個元素:"+number[number.length-1]); System.out.println("獲取第6個元素:"+number[5]);
執(zhí)行上述代碼,輸出結(jié)果如下所示:
獲取第一個元素:1 獲取最后一個元素:8 java.lang.ArrayIndexOutOfBoundsException: 5
我們一共存入了 5 個值,所以下標(biāo)的取值為 0~4。
因為 number[5] 取出的內(nèi)容超過了這個下標(biāo),所以輸出結(jié)果會提示數(shù)組索引超出綁定異常(ArrayIndexOutOfBoundsException)。
這一點是在使用數(shù)組中是經(jīng)常出現(xiàn)的問題,大家在編寫程序時應(yīng)該引起注意。
例 6
編寫一個 Java 程序,使用數(shù)組存放錄入的 5 件商品價格,然后使用下標(biāo)訪問第 3 個元素的值。
import java.util.Scanner; public class Test06 { public static void main(String[] args) { int[] prices = new int[5]; // 聲明數(shù)組并分配空間 Scanner input = new Scanner(System.in); // 接收用戶從控制臺輸入的數(shù)據(jù) for (int i = 0; i < prices.length; i++) { System.out.println("請輸入第" + (i + 1) + "件商品的價格:"); prices[i] = input.nextInt(); // 接收用戶從控制臺輸入的數(shù)據(jù) } System.out.println("第 3 件商品的價格為:" + prices[2]); } }
上述代碼的“int[] prices = new int[5]”語句創(chuàng)建了需要 5 個元素空間的 prices 數(shù)組,然后結(jié)合 for 循環(huán)向數(shù)組中的每個元素賦值。
注意:在 Java 中取得數(shù)組的長度(也就是數(shù)組元素的長度)可以利用“數(shù)組名稱.length”,返回一個 int 型數(shù)據(jù)。
數(shù)組的索引從 0 開始,而 for 循環(huán)中的變量 i 也從 0 開始,因此 score 數(shù)組中的元素可以使用 scored 來表示,大大簡化了代碼。
最后使用 prices[2] 獲取 prices 數(shù)組的第 3 個元素,最終運行效果如下所示。
請輸入第1件商品的價格: 5 請輸入第2件商品的價格: 4 請輸入第3件商品的價格: 6 請輸入第4件商品的價格: 4 請輸入第5件商品的價格: 8 第 3 件商品的價格為:6
獲取全部元素
當(dāng)數(shù)組中的元素數(shù)量不多時,要獲取數(shù)組中的全部元素,可以使用下標(biāo)逐個獲取元素。
但是,如果數(shù)組中的元素過多,再使用單個下標(biāo)則顯得煩瑣,此時使用一種簡單的方法可以獲取全部元素——使用循環(huán)語句。
下面利用 for 循環(huán)語句遍歷 number 數(shù)組中的全部元素,并將元素的值輸出。代碼如下:
int[] number = {1,2,3,5,8}; for (int i=0;i<number.length;i++) { System.out.println("第"+(i+1)+"個元素的值是:"+number[i]); }
除了使用 for 語句,還可以使用 foreach 遍歷數(shù)組中的元素,并將元素的值輸出。代碼如下:
for(int val:number) { System.out.print("元素的值依次是:"+val+"\t"); }
到此這篇關(guān)于Java數(shù)組(Array)最全匯總(上篇)的文章就介紹到這了,其他兩個部分的內(nèi)容(中、下篇)請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java數(shù)組(Array)最全匯總(中篇)
- Java之?dāng)?shù)組在指定位置插入元素實現(xiàn)
- Java自定義一個變長數(shù)組的思路與代碼
- Java中如何將?int[]?數(shù)組轉(zhuǎn)換為?ArrayList(list)
- Java中將 int[] 數(shù)組 轉(zhuǎn)換為 List分享
- java如何將int數(shù)組轉(zhuǎn)化為Integer數(shù)組
- 淺談Java當(dāng)作數(shù)組的幾個應(yīng)用場景
- 計算Java數(shù)組長度函數(shù)的方法以及代碼分析
- Java C++題解leetcode915分割數(shù)組示例
- Java?從json提取數(shù)組并轉(zhuǎn)換為list的操作方法
- Java數(shù)據(jù)結(jié)構(gòu)之稀疏數(shù)組的實現(xiàn)與應(yīng)用
- Java?C++題解leetcode1441用棧操作構(gòu)建數(shù)組示例
- Java postgresql數(shù)組字段類型處理方法詳解
- Java中數(shù)組的常見操作合集
- 關(guān)于Java?SE數(shù)組的深入理解
- Java二維數(shù)組與稀疏數(shù)組相互轉(zhuǎn)換實現(xiàn)詳解
- Java數(shù)組隊列及環(huán)形數(shù)組隊列超詳細(xì)講解
- Java數(shù)組(Array)最全匯總(下篇)
相關(guān)文章
Springmvc項目web.xml中servlet-mapping路徑映射配置注意說明
這篇文章主要介紹了Springmvc項目web.xml中servlet-mapping路徑映射配置注意說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12Spring中@ControllerAdvice注解的用法解析
這篇文章主要介紹了Spring中@ControllerAdvice注解的用法解析,顧名思義,@ControllerAdvice就是@Controller 的增強版,@ControllerAdvice主要用來處理全局?jǐn)?shù)據(jù),一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用,需要的朋友可以參考下2023-10-10Spring?代理?Bean?獲取不到原始?Bean?對象注解解決方法
這篇文章主要介紹了Spring?代理?Bean?獲取不到原始?Bean?對象注解解決方法,文章圍繞主題相關(guān)資料展開詳細(xì)介紹,需要的小伙伴可以參考一下2022-04-04java使用靜態(tài)關(guān)鍵字實現(xiàn)單例模式
這篇文章主要為大家詳細(xì)介紹了java使用靜態(tài)關(guān)鍵字實現(xiàn)單例模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04