Java數(shù)組定義、使用與核心應(yīng)用完全指南
一、 數(shù)組基礎(chǔ)概念
1.1 什么是數(shù)組
數(shù)組:可以看成是相同類型元素的一個集合。在內(nèi)存中是一段連續(xù)的空間。
為什么要使用數(shù)組呢?
當(dāng)我們需要存儲大量相同類型的數(shù)據(jù)時,數(shù)組是我們的最佳選擇。
比如:
// ? 不推薦:每個成績一個變量 int score1 = 70; int score2 = 80; // ... 100個成績需要100個變量 // ? 推薦:使用數(shù)組 int[] scores = new int[100]; // 一個變量存儲100個成績
可以看到數(shù)組可以大大提高我們的效率。
1.2 數(shù)組的基本概念
數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[長度];
如下圖:

這是一個數(shù)組 其中
1. array 叫做 引用變量 簡稱:引用
2. 上面這個數(shù)組在創(chuàng)建時并沒有直接給定你元素個數(shù),而是直接將具體的數(shù)據(jù)內(nèi)容指定 這種叫靜態(tài)初識化
3.
這兩種方法本質(zhì)上和上面的沒什么區(qū)別,new是創(chuàng)建新的對象
1. 這種定義方式?jīng)]有 初始化 當(dāng)前指定的值 ,默認(rèn)里面的所有值為0,如果是引用類型默認(rèn)則是null
2. 這種指定長度,沒有給定默認(rèn)值的叫 動態(tài)初始化
二、 數(shù)組的內(nèi)存模型
2.1 基本類型 vs 引用類型
// 基本類型:變量直接存儲值
int a = 10; // 內(nèi)存中:a -> 10
// 引用類型:變量存儲的是地址
int[] arr = new int[]{1, 2, 3};
// 內(nèi)存中:arr -> 0x123 (地址) -> [1,2,3]2.2 內(nèi)存結(jié)構(gòu)圖
在JVM中 有Java虛擬機(jī)棧 方法區(qū) 本地方法棧 程序計(jì)數(shù)器 堆 今天我們先來看看棧和堆

如圖,假如我們給定一個地址為0x9的array數(shù)組 里面有1-5的元素,它在棧和堆是這樣表示出來的
2.3 空引用與空指針異常
int[] arr = null; // arr不指向任何對象 // ? 以下都會拋出 NullPointerException System.out.println(arr.length); System.out.println(arr[0]); arr[0] = 10;
調(diào)試技巧:遇到NullPointerException,找到報錯行,檢查那個引用為 null
三、 數(shù)組的基本操作
3.1 訪問與修改元素
int[] arr = {10, 20, 30, 40, 50};
// 訪問:通過下標(biāo)(從0開始)
System.out.println(arr[0]); // 輸出: 10
System.out.println(arr[4]); // 輸出: 50
// 修改
arr[0] = 100; // 第一個元素改為100
arr[2] = 300; // 第三個元素改為300
// ? 下標(biāo)越界
System.out.println(arr[5]); // 運(yùn)行時異常:ArrayIndexOutOfBoundsException3.2 遍歷數(shù)組的三種方式
int[] arr = {1, 2, 3, 4, 5};
// 方式1:傳統(tǒng)for循環(huán)(可以獲取下標(biāo))
for (int i = 0; i < arr.length; i++) {
System.out.println("下標(biāo)" + i + ": " + arr[i]);
}
// 方式2:for-each循環(huán)(只能獲取值,不能改下標(biāo))
for (int num : arr) {
System.out.println(num);
}
// 方式3:while循環(huán)(不常用)
int i = 0;
while (i < arr.length) {
System.out.println(arr[i]);
i++;
}3.3 獲取數(shù)組的長度
int[] arr = {1, 2, 3, 4, 5};
int length = arr.length; // length = 5
// 注意:length是屬性,不是方法,不要加括號!四、數(shù)組的拷貝
4.1 淺拷貝 (共享同一數(shù)組)
int[] arr = {1, 2, 3, 4, 5};
int[] newArr = arr; // 淺拷貝:兩個引用指向同一個數(shù)組
newArr[0] = 100; // 修改newArr也會影響arr
System.out.println(arr[0]); // 輸出: 1004.2 深拷貝 (創(chuàng)建新數(shù)組)
深拷貝有三種方式:
方式1:使用Arrays.copyOf
int[] arr = {1, 2, 3, 4, 5};
int[] newArr = Arrays.copyOf(arr, arr.length); // 深拷貝
newArr[0] = 100; // 只修改newArr,不影響arr
System.out.println(arr[0]); // 輸出: 1(不變)方式2:拷貝指定范圍
int[] arr = {1, 2, 3, 4, 5};
// 拷貝下標(biāo)[1,3)范圍的元素(左閉右開)
int[] newArr = Arrays.copyOfRange(arr, 1, 3); // 得到[2, 3]方式3:手動實(shí)現(xiàn)深拷貝
public static int[] copyArray(int[] arr) {
int[] newArr = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
newArr[i] = arr[i];
}
return newArr;
}五、數(shù)組作為方法參數(shù)
5.1 傳遞引用,可以修改數(shù)組內(nèi)容
public static void modifyArray(int[] array) {
array[0] = 99; // 會修改原數(shù)組
}
public static void main(String[] args) {
int[] arr = {1, 2, 3};
modifyArray(arr);
System.out.println(arr[0]); // 輸出: 99(被修改了)
}5.2 重新賦值不會影響原數(shù)組
public static void reassignArray(int[] array) {
// array指向新對象,不會影響原數(shù)組
array = new int[]{9, 8, 7};
}
public static void main(String[] args) {
int[] arr = {1, 2, 3};
reassignArray(arr);
System.out.println(arr[0]); // 輸出: 1(沒變)
}總結(jié):
- 方法內(nèi)部修改數(shù)組元素 → 會影響原數(shù)組
- 方法內(nèi)部讓數(shù)組引用指向新對象 → 不會影響原數(shù)組
六、二維數(shù)組
6.1 定義和初始化
// 靜態(tài)初始化
int[][] arr1 = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 動態(tài)初始化(指定行列數(shù))
int[][] arr2 = new int[3][4]; // 3行4列
// 動態(tài)初始化(只指定行數(shù))
int[][] arr3 = new int[3][]; // 3行,每行長度不同
arr3[0] = new int[2]; // 第0行有2列
arr3[1] = new int[3]; // 第1行有3列
arr3[2] = new int[4]; // 第2行有4列6.2 遍歷二維數(shù)組
int[][] arr = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int i = 0; i < arr.length; i++) { // 遍歷行
for (int j = 0; j < arr[i].length; j++) { // 遍歷列
System.out.print(arr[i][j] + " ");
}
System.out.println(); // 換行
}
// 輸出:
// 1 2 3
// 4 5 6
// 7 8 96.3 獲取二維數(shù)組信息
int[][] arr = new int[3][4]; System.out.println(arr.length); // 輸出: 3(行數(shù)) System.out.println(arr[0].length); // 輸出: 4(第0行的列數(shù))
七、數(shù)組工具類 Arrays
7.1 常用方法
import java.util.Arrays;
int[] arr = {5, 3, 8, 1, 9};
// 1. 數(shù)組轉(zhuǎn)字符串(方便打印)
System.out.println(Arrays.toString(arr)); // [5, 3, 8, 1, 9]
// 2. 排序(升序)
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // [1, 3, 5, 8, 9]
// 3. 二分查找(必須先排序?。?
int index = Arrays.binarySearch(arr, 5); // 返回下標(biāo): 2
int notFound = Arrays.binarySearch(arr, 10); // 返回負(fù)數(shù): -6
// 4. 填充(全部賦相同值)
int[] arr2 = new int[5];
Arrays.fill(arr2, 7); // [7, 7, 7, 7, 7]
// 5. 比較兩個數(shù)組是否相等
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(Arrays.equals(a, b)); // true八、注意事項(xiàng)與常見錯誤
8.1 必須記住的規(guī)則
- 下標(biāo)從0開始:長度為n的數(shù)組,下標(biāo)的范圍是[0,n-1]
- length是屬性:arr.length,不是arr.length()
- 數(shù)組長度固定:創(chuàng)建后不能改變長度
- 引用類型默認(rèn)為null:String[ ] arr = new String[3];每個元素都是null
8.2 常見錯誤
// ? 錯誤1:下標(biāo)越界
int[] arr = {1, 2, 3};
System.out.println(arr[3]); // ArrayIndexOutOfBoundsException
// ? 錯誤2:空指針異常
int[] arr2 = null;
System.out.println(arr2.length); // NullPointerException
// ? 錯誤3:類型不匹配
// int[] arr3 = {1.0, 2.0, 3.0}; // 編譯錯誤,double不能直接賦給int
// ? 正確做法
int[] arr4 = new int[3];
arr4[0] = 1; // 先創(chuàng)建,后賦值九、總結(jié)要點(diǎn)
- 數(shù)組是引用類型,存儲的是地址,不是值本身
- 內(nèi)存分棧和堆:引用在棧,數(shù)組對象在堆
- 深拷貝 vs 淺拷貝:理解區(qū)別很重要
- Arrays 工具類:掌握常用方法,提高效率
- 二維數(shù)組:本質(zhì)是 "數(shù)組的數(shù)組"
到此這篇關(guān)于Java數(shù)組定義、使用與核心應(yīng)用完全指南的文章就介紹到這了,更多相關(guān)Java數(shù)組定義、使用與應(yīng)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 深入淺出分析Synchronized原理與Callable接口
Synchronized關(guān)鍵字解決的是多個線程之間訪問資源的同步性,synchronized關(guān)鍵字可以保證被它修飾的方法或者代碼塊在任意時刻只能有一個線程執(zhí)行,Runnable是執(zhí)行工作的獨(dú)立任務(wù),但是不返回任何值。如果我們希望任務(wù)完成之后有返回值,可以實(shí)現(xiàn)Callable接口2022-03-03
IDEA Maven Mybatis generator 自動生成代碼(實(shí)例講解)
下面小編就為大家分享一篇IDEA Maven Mybatis generator 自動生成代碼的實(shí)例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12
java實(shí)現(xiàn)超市庫存管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)超市庫存管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10
Java中HashSet和LinkedHashSet的常用方法示例詳解
本文主要介紹了Java中HashSet和LinkedHashSet的常用方法,包括添加、刪除、檢查元素、獲取大小、遍歷和轉(zhuǎn)換為數(shù)組等操作,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2025-12-12
Java中spring boot 字符串判斷是否為空方法小結(jié)
這篇文章主要介紹了Java中spring boot字符串判斷是否為空,通過安裝依賴,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-11-11
全面匯總SpringBoot和SpringClould常用注解
Java注解是附加在代碼中的一些元信息,用于一些工具在編譯、運(yùn)行時進(jìn)行解析和使用,起到說明、配置的功能,這篇文章就帶你來了解一下2021-08-08
Java實(shí)現(xiàn)的簡單數(shù)字時鐘功能示例
這篇文章主要介紹了Java實(shí)現(xiàn)的簡單數(shù)字時鐘功能,涉及java日期時間及JFrame框架圖形界面操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-02-02


