本文纲要
- 数组介绍
- 数组定义格式
- 数组动态初始化
- 数组元素访问
- Java内存分配与数组内存图
- 两个数组内存图
- 多个数组指向相同内存
- 数组静态初始化
- 数组操作常见问题
- 数组遍历
- 数组获取最大值
- 数组元素求和
- 数组基本查找
- 评委打分案例
数组介绍
数组(Array)是一种容器,用来存储同种数据类型的多个值。与普通变量只能存储单个值不同,数组可以一次存储多个同类型数据,并通过索引访问每一个元素。
数组的典型使用场景:当需要操作一组数据时,例如统计多个班级的成绩、存储多个用户输入等,就可以用数组把这组数据整体管理起来,而不是定义大量零散的变量。
数组定义格式
Java中定义数组有两种格式:
java
// 格式1:数据类型[] 数组名;
int[] arr;
// 格式2:数据类型 数组名[];
int arr2[];
格式1使用最普遍,推荐使用。格式2也能定义数组,但较少见。
这两种方式只是定义了一个数组类型的变量,此时还没有实际的数组容器,不能直接使用。
数组动态初始化
1 ) 概念
动态初始化:在创建数组时只指定长度,系统自动为数组元素分配默认值。
2 ) 格式
java
数据类型[] 数组名 = new 数据类型[数组长度];
示例:
java
int[] arr = new int[5]; // 可以存储5个int型整数
byte[] bArr = new byte[3]; // 可以存储3个byte型整数
new关键字负责在堆内存中开辟数组空间,并返回内存地址给数组变量。
3 ) 打印数组名
打印数组名时,看到的是内存地址,例如 [I@10f87f48
解读:
@:分隔符[:表示数组类型I:表示存储的数据类型(int)10f87f48:十六进制内存地址
数组元素访问
1 ) 访问格式
log
数组名[索引]
索引是数组元素在容器中的编号,从0开始,连续递增。例如长度为3的数组,索引为0、1、2。
2 ) 存取操作
- 取值:
arr[0] - 存值:
arr[0] = 11
动态初始化后,即使没有赋值,元素也能取出,此时取出的都是默认值
不同类型默认值如下:
| 数组类型 | 默认值 |
|---|---|
| 整数类型 | 0 |
| 浮点类型 | 0.0 |
| 布尔类型 | false |
| 字符类型 | 空字符('\u0000') |
| 引用类型 | null |
示例代码
java
int[] arr = new int[3];
System.out.println(arr[0]); // 0
System.out.println(arr[1]); // 0
System.out.println(arr[2]); // 0
arr[0] = 11;
arr[1] = 22;
arr[2] = 33;
System.out.println(arr[0]); // 11
System.out.println(arr[1]); // 22
System.out.println(arr[2]); // 33
Java内存分配与数组内存图
Java程序运行时,内存主要划分为以下几块区域:
- 栈(Stack):方法运行时进入的内存,局部变量存放在这里。
- 堆(Heap):new出来的内容存放于此,都有地址值。
- 方法区(Method Area):字节码文件(.class)加载时进入的内存。
1 ) 单数组内存图
以如下代码为例:
java
int[] arr = new int[3];
arr[0] = 11;
arr[1] = 22;
arr[2] = 33;
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
#mermaid-svg-IvqY0osXeD3Vzdkk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IvqY0osXeD3Vzdkk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IvqY0osXeD3Vzdkk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IvqY0osXeD3Vzdkk .error-icon{fill:#552222;}#mermaid-svg-IvqY0osXeD3Vzdkk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IvqY0osXeD3Vzdkk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IvqY0osXeD3Vzdkk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IvqY0osXeD3Vzdkk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IvqY0osXeD3Vzdkk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IvqY0osXeD3Vzdkk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IvqY0osXeD3Vzdkk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IvqY0osXeD3Vzdkk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IvqY0osXeD3Vzdkk .marker.cross{stroke:#333333;}#mermaid-svg-IvqY0osXeD3Vzdkk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IvqY0osXeD3Vzdkk p{margin:0;}#mermaid-svg-IvqY0osXeD3Vzdkk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IvqY0osXeD3Vzdkk .cluster-label text{fill:#333;}#mermaid-svg-IvqY0osXeD3Vzdkk .cluster-label span{color:#333;}#mermaid-svg-IvqY0osXeD3Vzdkk .cluster-label span p{background-color:transparent;}#mermaid-svg-IvqY0osXeD3Vzdkk .label text,#mermaid-svg-IvqY0osXeD3Vzdkk span{fill:#333;color:#333;}#mermaid-svg-IvqY0osXeD3Vzdkk .node rect,#mermaid-svg-IvqY0osXeD3Vzdkk .node circle,#mermaid-svg-IvqY0osXeD3Vzdkk .node ellipse,#mermaid-svg-IvqY0osXeD3Vzdkk .node polygon,#mermaid-svg-IvqY0osXeD3Vzdkk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IvqY0osXeD3Vzdkk .rough-node .label text,#mermaid-svg-IvqY0osXeD3Vzdkk .node .label text,#mermaid-svg-IvqY0osXeD3Vzdkk .image-shape .label,#mermaid-svg-IvqY0osXeD3Vzdkk .icon-shape .label{text-anchor:middle;}#mermaid-svg-IvqY0osXeD3Vzdkk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-IvqY0osXeD3Vzdkk .rough-node .label,#mermaid-svg-IvqY0osXeD3Vzdkk .node .label,#mermaid-svg-IvqY0osXeD3Vzdkk .image-shape .label,#mermaid-svg-IvqY0osXeD3Vzdkk .icon-shape .label{text-align:center;}#mermaid-svg-IvqY0osXeD3Vzdkk .node.clickable{cursor:pointer;}#mermaid-svg-IvqY0osXeD3Vzdkk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-IvqY0osXeD3Vzdkk .arrowheadPath{fill:#333333;}#mermaid-svg-IvqY0osXeD3Vzdkk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IvqY0osXeD3Vzdkk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IvqY0osXeD3Vzdkk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IvqY0osXeD3Vzdkk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IvqY0osXeD3Vzdkk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IvqY0osXeD3Vzdkk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-IvqY0osXeD3Vzdkk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IvqY0osXeD3Vzdkk .cluster text{fill:#333;}#mermaid-svg-IvqY0osXeD3Vzdkk .cluster span{color:#333;}#mermaid-svg-IvqY0osXeD3Vzdkk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IvqY0osXeD3Vzdkk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IvqY0osXeD3Vzdkk rect.text{fill:none;stroke-width:0;}#mermaid-svg-IvqY0osXeD3Vzdkk .icon-shape,#mermaid-svg-IvqY0osXeD3Vzdkk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IvqY0osXeD3Vzdkk .icon-shape p,#mermaid-svg-IvqY0osXeD3Vzdkk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-IvqY0osXeD3Vzdkk .icon-shape .label rect,#mermaid-svg-IvqY0osXeD3Vzdkk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IvqY0osXeD3Vzdkk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-IvqY0osXeD3Vzdkk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-IvqY0osXeD3Vzdkk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 📒 堆内存 (Heap)
📙 栈内存 (Stack)
📘 方法区 (Method Area)
main 方法栈帧
引用地址
类加载,入栈执行
声明
Demo3.class
main方法字节码
arr 变量
📍 记录地址: 0x001
0x001 → int3
数组对象
索引0 = 11
索引1 = 22
索引2 = 33
执行过程:
- .class文件加载到方法区,main方法进入栈。
- 执行int\[\] arr = new int3,在堆中开辟数组空间(地址0x001),长度为3,默认值0。
- 地址赋给栈中的arr变量。
- 通过索引赋值,修改堆中对应元素的值。
- 打印时,arr通过地址找到堆中数组,再按索引取出元素。
两个数组内存图
java
int[] arr1 = new int[2];
arr1[0] = 11;
arr1[1] = 22;
int[] arr2 = new int[3];
arr2[0] = 33;
arr2[1] = 44;
arr2[2] = 55;
#mermaid-svg-d353Xgn3Y0qyKxw7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-d353Xgn3Y0qyKxw7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-d353Xgn3Y0qyKxw7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-d353Xgn3Y0qyKxw7 .error-icon{fill:#552222;}#mermaid-svg-d353Xgn3Y0qyKxw7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-d353Xgn3Y0qyKxw7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-d353Xgn3Y0qyKxw7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-d353Xgn3Y0qyKxw7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-d353Xgn3Y0qyKxw7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-d353Xgn3Y0qyKxw7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-d353Xgn3Y0qyKxw7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-d353Xgn3Y0qyKxw7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-d353Xgn3Y0qyKxw7 .marker.cross{stroke:#333333;}#mermaid-svg-d353Xgn3Y0qyKxw7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-d353Xgn3Y0qyKxw7 p{margin:0;}#mermaid-svg-d353Xgn3Y0qyKxw7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-d353Xgn3Y0qyKxw7 .cluster-label text{fill:#333;}#mermaid-svg-d353Xgn3Y0qyKxw7 .cluster-label span{color:#333;}#mermaid-svg-d353Xgn3Y0qyKxw7 .cluster-label span p{background-color:transparent;}#mermaid-svg-d353Xgn3Y0qyKxw7 .label text,#mermaid-svg-d353Xgn3Y0qyKxw7 span{fill:#333;color:#333;}#mermaid-svg-d353Xgn3Y0qyKxw7 .node rect,#mermaid-svg-d353Xgn3Y0qyKxw7 .node circle,#mermaid-svg-d353Xgn3Y0qyKxw7 .node ellipse,#mermaid-svg-d353Xgn3Y0qyKxw7 .node polygon,#mermaid-svg-d353Xgn3Y0qyKxw7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-d353Xgn3Y0qyKxw7 .rough-node .label text,#mermaid-svg-d353Xgn3Y0qyKxw7 .node .label text,#mermaid-svg-d353Xgn3Y0qyKxw7 .image-shape .label,#mermaid-svg-d353Xgn3Y0qyKxw7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-d353Xgn3Y0qyKxw7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-d353Xgn3Y0qyKxw7 .rough-node .label,#mermaid-svg-d353Xgn3Y0qyKxw7 .node .label,#mermaid-svg-d353Xgn3Y0qyKxw7 .image-shape .label,#mermaid-svg-d353Xgn3Y0qyKxw7 .icon-shape .label{text-align:center;}#mermaid-svg-d353Xgn3Y0qyKxw7 .node.clickable{cursor:pointer;}#mermaid-svg-d353Xgn3Y0qyKxw7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-d353Xgn3Y0qyKxw7 .arrowheadPath{fill:#333333;}#mermaid-svg-d353Xgn3Y0qyKxw7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-d353Xgn3Y0qyKxw7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-d353Xgn3Y0qyKxw7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-d353Xgn3Y0qyKxw7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-d353Xgn3Y0qyKxw7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-d353Xgn3Y0qyKxw7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-d353Xgn3Y0qyKxw7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-d353Xgn3Y0qyKxw7 .cluster text{fill:#333;}#mermaid-svg-d353Xgn3Y0qyKxw7 .cluster span{color:#333;}#mermaid-svg-d353Xgn3Y0qyKxw7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-d353Xgn3Y0qyKxw7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-d353Xgn3Y0qyKxw7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-d353Xgn3Y0qyKxw7 .icon-shape,#mermaid-svg-d353Xgn3Y0qyKxw7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-d353Xgn3Y0qyKxw7 .icon-shape p,#mermaid-svg-d353Xgn3Y0qyKxw7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-d353Xgn3Y0qyKxw7 .icon-shape .label rect,#mermaid-svg-d353Xgn3Y0qyKxw7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-d353Xgn3Y0qyKxw7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-d353Xgn3Y0qyKxw7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-d353Xgn3Y0qyKxw7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🟧 堆 Heap
🟦 栈 Stack
指向
指向
main() 方法
arr1 引用
0x001
arr2 引用
0x002
地址 0x001
int2
0=11, 1=22
地址 0x002
int3
0=33, 1=44, 2=55
关键点:每次new都会在堆中开辟一块新的空间,地址不会重复。
多个数组指向相同内存
java
int[] arr1 = new int[2];
arr1[0] = 11;
arr1[1] = 22;
int[] arr2 = arr1; // 将arr1记录的地址赋给arr2
arr2[0] = 33;
System.out.println(arr1[0]); // 33
System.out.println(arr1[1]); // 22
System.out.println(arr2[0]); // 33
System.out.println(arr2[1]); // 22
#mermaid-svg-dL3oOCEpbva5AVkb{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dL3oOCEpbva5AVkb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dL3oOCEpbva5AVkb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dL3oOCEpbva5AVkb .error-icon{fill:#552222;}#mermaid-svg-dL3oOCEpbva5AVkb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dL3oOCEpbva5AVkb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dL3oOCEpbva5AVkb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dL3oOCEpbva5AVkb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dL3oOCEpbva5AVkb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dL3oOCEpbva5AVkb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dL3oOCEpbva5AVkb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dL3oOCEpbva5AVkb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dL3oOCEpbva5AVkb .marker.cross{stroke:#333333;}#mermaid-svg-dL3oOCEpbva5AVkb svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dL3oOCEpbva5AVkb p{margin:0;}#mermaid-svg-dL3oOCEpbva5AVkb .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dL3oOCEpbva5AVkb .cluster-label text{fill:#333;}#mermaid-svg-dL3oOCEpbva5AVkb .cluster-label span{color:#333;}#mermaid-svg-dL3oOCEpbva5AVkb .cluster-label span p{background-color:transparent;}#mermaid-svg-dL3oOCEpbva5AVkb .label text,#mermaid-svg-dL3oOCEpbva5AVkb span{fill:#333;color:#333;}#mermaid-svg-dL3oOCEpbva5AVkb .node rect,#mermaid-svg-dL3oOCEpbva5AVkb .node circle,#mermaid-svg-dL3oOCEpbva5AVkb .node ellipse,#mermaid-svg-dL3oOCEpbva5AVkb .node polygon,#mermaid-svg-dL3oOCEpbva5AVkb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dL3oOCEpbva5AVkb .rough-node .label text,#mermaid-svg-dL3oOCEpbva5AVkb .node .label text,#mermaid-svg-dL3oOCEpbva5AVkb .image-shape .label,#mermaid-svg-dL3oOCEpbva5AVkb .icon-shape .label{text-anchor:middle;}#mermaid-svg-dL3oOCEpbva5AVkb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-dL3oOCEpbva5AVkb .rough-node .label,#mermaid-svg-dL3oOCEpbva5AVkb .node .label,#mermaid-svg-dL3oOCEpbva5AVkb .image-shape .label,#mermaid-svg-dL3oOCEpbva5AVkb .icon-shape .label{text-align:center;}#mermaid-svg-dL3oOCEpbva5AVkb .node.clickable{cursor:pointer;}#mermaid-svg-dL3oOCEpbva5AVkb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-dL3oOCEpbva5AVkb .arrowheadPath{fill:#333333;}#mermaid-svg-dL3oOCEpbva5AVkb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dL3oOCEpbva5AVkb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dL3oOCEpbva5AVkb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dL3oOCEpbva5AVkb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-dL3oOCEpbva5AVkb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dL3oOCEpbva5AVkb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-dL3oOCEpbva5AVkb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dL3oOCEpbva5AVkb .cluster text{fill:#333;}#mermaid-svg-dL3oOCEpbva5AVkb .cluster span{color:#333;}#mermaid-svg-dL3oOCEpbva5AVkb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dL3oOCEpbva5AVkb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-dL3oOCEpbva5AVkb rect.text{fill:none;stroke-width:0;}#mermaid-svg-dL3oOCEpbva5AVkb .icon-shape,#mermaid-svg-dL3oOCEpbva5AVkb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dL3oOCEpbva5AVkb .icon-shape p,#mermaid-svg-dL3oOCEpbva5AVkb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-dL3oOCEpbva5AVkb .icon-shape .label rect,#mermaid-svg-dL3oOCEpbva5AVkb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dL3oOCEpbva5AVkb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-dL3oOCEpbva5AVkb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-dL3oOCEpbva5AVkb :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 堆 Heap
栈 Stack
main() 栈帧
arr1
记录地址 0x001
arr2
记录地址 0x001
0x001
int2
0 = 33
1 = 22
当两个引用指向同一个数组时,通过任何一个引用修改数组,另一个引用看到的也是修改后的结果。可以把引用想象成"遥控器",多个遥控器控制同一台电视。
数组静态初始化
静态初始化:在创建数组时直接指定元素的值,系统自动计算长度
完整格式
java
数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, ...};
简化格式
java
数据类型[] 数组名 = {元素1, 元素2, ...};
示例:
java
int[] arr = new int[]{11, 22, 33};
int[] arr2 = {44, 55, 66};
简化格式虽然没有显式写new,但编译器会补齐,实际仍然会在堆中开辟空间。
动态初始化 vs 静态初始化
| 动态初始化 | 静态初始化 | |
|---|---|---|
| 指定 | 数组长度 | 元素的具体值 |
| 系统计算 | 默认值 | 数组长度 |
| 适用场景 | 只明确元素个数,不明确具体值(如键盘录入) | 已经明确要操作的具体数据 |
数组操作常见问题
1 )索引越界
访问了不存在的索引,抛出 ArrayIndexOutOfBoundsException
java
int[] arr = new int[3]; // 索引0~2
System.out.println(arr[3]); // 越界
避免方法:访问索引前确保 0 <= 索引 < 数组长度,通常用arr.length控制循环。
2 )空指针异常
数组变量不再指向任何堆内存空间(记录null),仍试图访问元素,抛出NullPointerException
java
int[] arr = new int[3];
arr = null;
System.out.println(arr[0]); // 空指针异常
null是引用类型的默认值,表示"空",不指向任何对象
数组遍历
1 ) 遍历:逐一获取数组中的每个元素。常用for循环配合数组名.length
java
int[] arr = {11, 22, 33, 44, 55};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
2 ) 改进:一行打印数组元素
需求:将数组元素按格式 11, 22, 33, 44, 55 在一行打印。
java
public static void printArray(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ", ");
}
}
// 换行
System.out.println();
}
数组获取最大值
1 ) 思路:
- 假设第一个元素为最大值
max = arr[0] - 遍历剩余元素,如果发现更大的值,则更新max
- 遍历结束,max即为最大值
java
int[] arr = {12, 45, 98, 73, 60};
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
System.out.println("max:" + max);
最小值同理,只需将比较条件改为 arr[i] < min
数组元素求和
需求:键盘录入5个整数,存入数组并求和。典型动态初始化场景。
java
Scanner sc = new Scanner(System.in);
int sum = 0;
int[] arr = new int[5];
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第" + (i + 1) + "个整数:");
arr[i] = sc.nextInt();
}
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
System.out.println("sum:" + sum);
数组基本查找
需求:已知数组,键盘录入一个数据,查找其在数组中的索引,找不到返回-1。
java
int[] arr = {19, 28, 37, 46, 50};
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要查找的元素:");
int num = sc.nextInt();
int index = -1; // 假设不存在
for (int i = 0; i < arr.length; i++) {
if (arr[i] == num) {
index = i;
break; // 找到后结束循环
}
}
System.out.println(index);
评委打分案例
需求:6个评委打分(0~100),去掉一个最高分和一个最低分,求平均分(不考虑小数)。
java
int[] arr = new int[6];
Scanner sc = new Scanner(System.in);
// 录入评委分数,并保证数据合法
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第" + (i + 1) + "个评委的打分:");
int score = sc.nextInt();
if (score >= 0 && score <= 100) {
arr[i] = score;
} else {
System.out.println("您的打分输入有误, 请检查是否是0-100之间的");
i--; // 重新输入本位置
}
}
// 求最大值
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) max = arr[i];
}
// 求最小值
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] < min) min = arr[i];
}
// 求和
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
// 计算平均分
int avg = (sum - max - min) / 4;
System.out.println(avg);
i--的作用:当输入非法分数时,强迫用户重新输入当前评委的分数,保证数组最终只存储合法值。
总结
本文从数组的概念、定义、初始化到内存模型、常见操作和经典案例,全面介绍了Java数组的基础知识。
掌握数组是学习Java集合等高级特性的重要前提,建议多动手练习,理解内存分配与引用机制。