news 2026/4/23 11:20:34

【Java基础|Day04】Java数组详解:从定义到内存原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Java基础|Day04】Java数组详解:从定义到内存原理

【Java基础|Day04】Java数组详解:从定义到内存原理(2026最新实用版)

Java数组是最基础、最常用引用数据类型,几乎所有集合框架(如ArrayList底层)都依赖它。掌握数组 = 掌握了Java中连续内存 + 引用机制 + 堆栈区别的核心。

本篇按定义 → 初始化 → 访问/遍历 → 常见操作 → 内存原理顺序拆解,带图文 + 代码 + 内存图 + 面试高频坑。

1. 数组是什么?核心特性速记(5句话记住)

  • 同类型元素的有序集合(固定长度,不可变)
  • 引用类型:数组变量本身是引用,真实数据在堆
  • 长度固定:创建后不可改变(不像List)
  • 下标从0开始,范围[0, length-1]
  • 默认初始化:创建后元素有默认值(int→0, 对象→null)

2. 数组的定义与声明(三种写法都懂)

// 推荐写法(类型在前,[]可放变量名后)int[]scores;// 声明(推荐,阅读性好)double[]prices;String[]names;// 也合法(C/C++风格,但不推荐)intscores[];

注意:声明时不指定长度,长度在初始化时确定。

3. 数组初始化(两种方式 + 简化写法)

初始化方式语法示例特点适用场景默认值情况
动态初始化int[] arr = new int[5];先new分配空间,系统赋默认值后期赋值,长度已知有(0 / false / null / 0.0)
静态初始化int[] arr = new int[]{1,2,3};直接写元素,长度由元素个数决定元素已知,少量数据无需默认值
简化静态int[] arr = {1,2,3};最常用,只能声明+初始化一起写常量数组、测试数据无需默认值

代码示例(三种方式对比):

publicclassArrayInit{publicstaticvoidmain(String[]args){// 动态初始化int[]arr1=newint[4];// 长度4,元素默认0System.out.println(arr1[0]);// 0// 静态初始化(完整写法)double[]arr2=newdouble[]{3.14,2.718,1.414};// 简化静态初始化(最常用)String[]arr3={"苹果","香蕉","橙子"};// 二维数组(不规则也行)int[][]matrix={{1,2,3},{4,5},{6,7,8,9}};}}

二维数组本质一维数组的数组(每个元素又是一个一维数组引用)。

4. 数组访问、遍历、长度(length属性)

  • 访问:arr[下标],下标越界 →ArrayIndexOutOfBoundsException
  • 长度:arr.length(属性,不是方法!)

四种遍历方式对比(面试常问):

int[]arr={10,20,30,40};// 1. 普通for(最灵活,可改值)for(inti=0;i<arr.length;i++){System.out.println(arr[i]);arr[i]*=2;// 可以修改}// 2. 增强for(foreach,只读,简洁)for(intnum:arr){System.out.println(num);// num = 100; // 无效!只是副本}// 3. Arrays工具类(快捷)importjava.util.Arrays;System.out.println(Arrays.toString(arr));// [20, 40, 60, 80]// 4. Java 8+ Stream(函数式,进阶)Arrays.stream(arr).forEach(System.out::println);

5. 数组常见操作(面试/实战高频)

  • 求最大/最小/和/平均
  • 查找(线性、二分)
  • 排序(Arrays.sort())
  • 拷贝(System.arraycopy() / Arrays.copyOf())
  • 反转(双指针 / Collections.reverse() 转List后)
  • 扩容(本质new新数组 + copy)

经典面试题代码模板

// 数组反转(双指针)publicstaticvoidreverse(int[]arr){intleft=0,right=arr.length-1;while(left<right){inttemp=arr[left];arr[left]=arr[right];arr[right]=temp;left++;right--;}}// 查找元素第一次出现位置(线性)publicstaticintindexOf(int[]arr,inttarget){for(inti=0;i<arr.length;i++){if(arr[i]==target)returni;}return-1;}

6. 数组的内存原理(最重要!画图理解)

Java内存分为栈(Stack)堆(Heap)

  • :存放局部变量方法调用帧数组的引用(地址)
  • :存放new出来的对象数组的真实元素(所有数组元素都在堆)

内存图示意(一维数组):

栈内存(main方法帧) 堆内存 int[] scores → 0x1234 ------------→ [数组对象头] 长度: 5 元素0: 0 ← scores[0] 元素1: 85 ← scores[1] 元素2: 92 元素3: 0 元素4: 0

二维数组内存图(本质是“数组的数组”):

栈 int[][] matrix → 0xABCD → [外层数组对象] 长度: 3 元素0 → 0x1111 → [内层数组1: {1,2,3}] 元素1 → 0x2222 → [内层数组2: {4,5}] 元素2 → 0x3333 → [内层数组3: {6,7,8,9}]

关键结论

  1. 数组变量(引用)在,指向中的数组对象
  2. 数组对象包含:对象头+长度(4字节) +连续的元素数据
  3. 元素是基本类型→ 直接存值;元素是引用类型→ 存地址(又指向别的堆对象)
  4. 数组长度不可变 → 扩容必须new新数组 + 复制
  5. 多维数组不一定是矩形(jagged array),每行长度可不同

经典面试追问

  • int[] a = new int[0];合法吗? → 合法,长度0,不报错
  • arr = null;arr.length? → NullPointerException
  • 数组拷贝是浅拷贝(引用类型只拷地址)

7. Day04 速成自测题(答案在文末)

  1. 下面哪种初始化方式是错误的?
    A.int[] a = new int[3];
    B.int[] b = {1,2,3};
    C.int[] c = new int[]{ };← 空数组合法

  2. 增强for循环中修改变量,能改变原数组吗?为什么?

  3. 二维数组int\[\]\[\] arr = new int\[3\]\[\];后,arr[0]是什么?能直接arr[0][0]吗?

答案

  1. C合法(空数组)
  2. 不能,foreach是值拷贝(基本类型)或引用拷贝(但赋值是局部变量)
  3. arr[0]是null,arr[0][0] → NullPointerException(需先arr[0] = new int[长度];)

数组看似简单,但内存模型是Java面向对象、JVM运行时的基石。下一讲(Day05)我们直接进入方法、参数传递(值传递 vs 引用传递的本质),数组就是最好的切入点!

有具体代码想调试、内存图想细化、或面试题想刷的,直接贴上来,我继续陪练!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 14:19:38

Vue 双向绑定原理剖析

Vue 双向绑定原理剖析&#xff08;Vue 3 时代完整版&#xff0c;2026视角&#xff09; Vue 的“双向绑定”其实是两个方向的单向流动巧妙组合的结果&#xff1a; 数据 → 视图&#xff1a;响应式系统&#xff08;Reactivity&#xff09;自动更新 DOM&#xff08;Vue 2 用 Obj…

作者头像 李华
网站建设 2026/4/16 20:21:42

谷歌AlphaGenome登Nature封面!破译生命基因暗物质

AlphaGenome能够一次性读取 100 万个 DNA 碱基对&#xff0c;并以单碱基的惊人精度破译这一庞大序列中的调控密码&#xff0c;为人类理解占据基因组 98% 的非编码区域带来了史无前例的清晰视野。Google DeepMind 团队去年 6 月发布的 AlphaGenome 模型刚刚开源了。而且同步登上…

作者头像 李华
网站建设 2026/4/16 22:40:18

一个模型千万个灵魂!Anthropic找到了防止AI陷入疯狂的防线

Anthropic和牛津大学的最新研究发现&#xff0c;助手只是大模型在广阔人格空间中扮演的一个特定角色&#xff0c;而这个角色极其容易在长对话中发生漂移甚至崩塌。 细心的朋友应该注意到&#xff0c;大多数大模型的系统提示词都是&#xff1a;你是一个有用的助手&#xff08;Y…

作者头像 李华
网站建设 2026/4/17 15:14:21

AI革命者苏茨克维:从GPT之父到安全先锋

从AlexNet到GPT-4&#xff1a;一位AI巨匠的技术哲学与安全远征当世界还在为GPT-3的惊艳表现惊叹时&#xff0c;它的核心架构师却悄然转身&#xff0c;创办了一家专注于“安全超级智能”的公司——这是伊尔亚苏茨克维的选择&#xff0c;也是他对AI未来最深刻的警示。2012年的Ima…

作者头像 李华
网站建设 2026/4/22 20:52:23

2026年毕业论文AI率高于30%怎么办?5招教你安全过检测

2026年毕业论文AI率高于30%怎么办&#xff1f;5招教你安全过检测 查完AI率&#xff0c;心态崩了&#xff1a;58%。 学校的红线是30%&#xff0c;我超了28个百分点。 如果你也面临这个问题&#xff0c;别慌。这篇文章教你5招&#xff0c;把AI率从30%以上降到安全线以下。 先搞…

作者头像 李华
网站建设 2026/4/20 21:46:32

【小程序毕设源码分享】基于springboot+小程序的网上订餐服务管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华