核心内容摘要
VisionPro模板匹配避坑指南:为什么你的CogPMAlignTool总识别失败?
【Java基础|Day04】Java数组详解从定义到内存原理2026最新实用版Java数组是最基础、最常用的引用数据类型几乎所有集合框架如ArrayList底层都依赖它。
掌握数组 掌握了Java中连续内存 引用机制 堆栈区别的核心。
本篇按定义 → 初始化 → 访问/遍历 → 常见操作 → 内存原理顺序拆解带图文 代码 内存图 面试高频坑。
数组是什么核心特性速记5句话记住同类型元素的有序集合固定长度不可变引用类型数组变量本身是引用真实数据在堆里长度固定创建后不可改变不像List下标从0开始范围[0, length-1]默认初始化创建后元素有默认值int→0, 对象→null
数组的定义与声明三种写法都懂// 推荐写法类型在前[]可放变量名后int[]scores;// 声明推荐阅读性好double[]prices;String[]names;// 也合法C/C风格但不推荐intscores[];注意声明时不指定长度长度在初始化时确定。
数组初始化两种方式 简化写法初始化方式语法示例特点适用场景默认值情况动态初始化int[] arr new int[5];先new分配空间系统赋默认值后期赋值长度已知有0 / false / null /
0静态初始化int[] arr new int[]{1,2,3};直接写元素长度由元素个数决定元素已知少量数据无需默认值简化静态int[] arr {1,2,3};最常用只能声明初始化一起写常量数组、测试数据无需默认值代码示例三种方式对比publicclassArrayInit{publicstaticvoidmain(String[]args){// 动态初始化int[]arr1newint[4];// 长度4元素默认0System.out.println(arr1[0]);// 0// 静态初始化完整写法double[]arr2newdouble[]{
14,
718,
414};// 简化静态初始化最常用String[]arr3{苹果,香蕉,橙子};// 二维数组不规则也行int[][]matrix;}}二维数组本质一维数组的数组每个元素又是一个一维数组引用。
数组访问、遍历、长度length属性访问arr[下标]下标越界 →ArrayIndexOutOfBoundsException长度arr.length属性不是方法四种遍历方式对比面试常问int[]arr{10,20,30,40};//
普通for最灵活可改值for(inti0;iarr.length;i){System.out.println(arr[i]);arr[i]*2;// 可以修改}//
增强forforeach只读简洁for(intnum:arr){System.out.println(num);// num 100; // 无效只是副本}//
Arrays工具类快捷importjava.util.Arrays;System.out.println(Arrays.toString(arr));// [20, 40, 60, 80]//
Java 8 Stream函数式进阶Arrays.stream(arr).forEach(System.out::println);
数组常见操作面试/实战高频求最大/最小/和/平均查找线性、二分排序Arrays.sort()拷贝System.arraycopy() / Arrays.copyOf()反转双指针 / Collections.reverse() 转List后扩容本质new新数组 copy经典面试题代码模板// 数组反转双指针publicstaticvoidreverse(int[]arr){intleft0,rightarr.length-1;while(leftright){inttemparr[left];arr[left]arr[right];arr[right]temp;left;right--;}}// 查找元素第一次出现位置线性publicstaticintindexOf(int[]arr,inttarget){for(inti0;iarr.length;i){if(arr[i]target)returni;}return-1;}
数组的内存原理最重要画图理解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}]关键结论数组变量引用在栈指向堆中的数组对象数组对象包含对象头长度4字节 连续的元素数据元素是基本类型→ 直接存值元素是引用类型→ 存地址又指向别的堆对象数组长度不可变 → 扩容必须new新数组 复制多维数组不一定是矩形jagged array每行长度可不同经典面试追问int[] a new int[0];合法吗 → 合法长度0不报错arr null;后arr.length → NullPointerException数组拷贝是浅拷贝引用类型只拷地址
Day04 速成自测题答案在文末下面哪种初始化方式是错误的A.int[] a new int[3];B.int[] b {1,2,3};C.int[] c new int[]{ };← 空数组合法增强for循环中修改变量能改变原数组吗为什么二维数组int\[\]\[\] arr new int\[3\]\[\];后arr[0]是什么能直接arr[0][0]吗答案C合法空数组不能foreach是值拷贝基本类型或引用拷贝但赋值是局部变量arr[0]是nullarr[0][0] → NullPointerException需先arr[0] new int[长度];数组看似简单但内存模型是Java面向对象、JVM运行时的基石。
下一讲Day05我们直接进入方法、参数传递值传递 vs 引用传递的本质数组就是最好的切入点有具体代码想调试、内存图想细化、或面试题想刷的直接贴上来我继续陪练