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

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

如圖,假如我們給定一個(gè)地址為0x9的array數(shù)組 里面有1-5的元素,它在棧和堆是這樣表示出來(lái)的
2.3 空引用與空指針異常
int[] arr = null; // arr不指向任何對(duì)象 // ? 以下都會(huì)拋出 NullPointerException System.out.println(arr.length); System.out.println(arr[0]); arr[0] = 10;
調(diào)試技巧:遇到NullPointerException,找到報(bào)錯(cuò)行,檢查那個(gè)引用為 null
三、 數(shù)組的基本操作
3.1 訪問(wèn)與修改元素
int[] arr = {10, 20, 30, 40, 50};
// 訪問(wèn):通過(guò)下標(biāo)(從0開(kāi)始)
System.out.println(arr[0]); // 輸出: 10
System.out.println(arr[4]); // 輸出: 50
// 修改
arr[0] = 100; // 第一個(gè)元素改為100
arr[2] = 300; // 第三個(gè)元素改為300
// ? 下標(biāo)越界
System.out.println(arr[5]); // 運(yùn)行時(shí)異常: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ù)組的長(zhǎng)度
int[] arr = {1, 2, 3, 4, 5};
int length = arr.length; // length = 5
// 注意:length是屬性,不是方法,不要加括號(hào)!四、數(shù)組的拷貝
4.1 淺拷貝 (共享同一數(shù)組)
int[] arr = {1, 2, 3, 4, 5};
int[] newArr = arr; // 淺拷貝:兩個(gè)引用指向同一個(gè)數(shù)組
newArr[0] = 100; // 修改newArr也會(huì)影響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)范圍的元素(左閉右開(kāi))
int[] newArr = Arrays.copyOfRange(arr, 1, 3); // 得到[2, 3]方式3:手動(dòng)實(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; // 會(huì)修改原數(shù)組
}
public static void main(String[] args) {
int[] arr = {1, 2, 3};
modifyArray(arr);
System.out.println(arr[0]); // 輸出: 99(被修改了)
}5.2 重新賦值不會(huì)影響原數(shù)組
public static void reassignArray(int[] array) {
// array指向新對(duì)象,不會(huì)影響原數(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(沒(méi)變)
}總結(jié):
- 方法內(nèi)部修改數(shù)組元素 → 會(huì)影響原數(shù)組
- 方法內(nèi)部讓數(shù)組引用指向新對(duì)象 → 不會(huì)影響原數(shù)組
六、二維數(shù)組
6.1 定義和初始化
// 靜態(tài)初始化
int[][] arr1 = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 動(dòng)態(tài)初始化(指定行列數(shù))
int[][] arr2 = new int[3][4]; // 3行4列
// 動(dòng)態(tài)初始化(只指定行數(shù))
int[][] arr3 = new int[3][]; // 3行,每行長(zhǎng)度不同
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ù)組工具類(lèi) 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. 比較兩個(gè)數(shù)組是否相等
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(Arrays.equals(a, b)); // true八、注意事項(xiàng)與常見(jiàn)錯(cuò)誤
8.1 必須記住的規(guī)則
- 下標(biāo)從0開(kāi)始:長(zhǎng)度為n的數(shù)組,下標(biāo)的范圍是[0,n-1]
- length是屬性:arr.length,不是arr.length()
- 數(shù)組長(zhǎng)度固定:創(chuàng)建后不能改變長(zhǎng)度
- 引用類(lèi)型默認(rèn)為null:String[ ] arr = new String[3];每個(gè)元素都是null
8.2 常見(jiàn)錯(cuò)誤
// ? 錯(cuò)誤1:下標(biāo)越界
int[] arr = {1, 2, 3};
System.out.println(arr[3]); // ArrayIndexOutOfBoundsException
// ? 錯(cuò)誤2:空指針異常
int[] arr2 = null;
System.out.println(arr2.length); // NullPointerException
// ? 錯(cuò)誤3:類(lèi)型不匹配
// int[] arr3 = {1.0, 2.0, 3.0}; // 編譯錯(cuò)誤,double不能直接賦給int
// ? 正確做法
int[] arr4 = new int[3];
arr4[0] = 1; // 先創(chuàng)建,后賦值九、總結(jié)要點(diǎn)
- 數(shù)組是引用類(lèi)型,存儲(chǔ)的是地址,不是值本身
- 內(nèi)存分棧和堆:引用在棧,數(shù)組對(duì)象在堆
- 深拷貝 vs 淺拷貝:理解區(qū)別很重要
- Arrays 工具類(lèi):掌握常用方法,提高效率
- 二維數(shù)組:本質(zhì)是 "數(shù)組的數(shù)組"
到此這篇關(guān)于Java數(shù)組定義、使用與核心應(yīng)用完全指南的文章就介紹到這了,更多相關(guān)Java數(shù)組定義、使用與應(yīng)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Servlet實(shí)現(xiàn)共享數(shù)據(jù)JavaWeb組件的幾種方法
本文將結(jié)合實(shí)例代碼,介紹Servlet實(shí)現(xiàn)共享數(shù)據(jù)JavaWeb組件的幾種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Logback動(dòng)態(tài)修改日志級(jí)別的方法
這篇文章主要介紹了Logback動(dòng)態(tài)修改日志級(jí)別的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
簡(jiǎn)單了解spring bean作用域?qū)傩詓ingleton和prototype的區(qū)別
這篇文章主要介紹了簡(jiǎn)單了解spring bean作用域?qū)傩詓ingleton和prototype的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
SpringBoot利用dynamic-datasource-spring-boot-starter解決多數(shù)據(jù)源問(wèn)題
dynamic-datasource-spring-boot-starter 是一個(gè)用于在 Spring Boot 項(xiàng)目中實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的工具,下面我們看看如何使用dynamic-datasource-spring-boot-starter解決多數(shù)據(jù)源問(wèn)題吧2025-03-03
idea maven項(xiàng)目無(wú)法識(shí)別jar包里的class解決方案
這篇文章主要介紹了idea maven項(xiàng)目無(wú)法識(shí)別jar包里的class解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
基于Mock測(cè)試Spring MVC接口過(guò)程解析
這篇文章主要介紹了基于Mock測(cè)試Spring MVC接口過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11


