别再死记硬背了!用Python代码实现NFA转DFA,理解编译原理核心算法
2026/5/6 4:37:03
本文将想你介绍数组是什么?数组的定义?数组的声明创建。希望这对你有帮助。
数组是Java中最基本的数据结构之一,它是一个容器对象,用于存储固定数量的相同类型的元素。数组在内存中是连续存储的,这使得通过索引访问元素的速度非常快。
Java数组具有以下几个重要特性:
从内存角度来看,数组在Java虚拟机中的存储结构包含以下几个部分:
// 数组内存结构示意图/* ┌─────────────────────────────────────┐ │ 数组对象头 │ │ - 标记字 (Mark Word) │ │ - 类型指针 (Class Pointer) │ │ - 数组长度 (Array Length) │ ├─────────────────────────────────────┤ │ 数据区域 │ │ 元素[0] 元素[1] 元素[2] ... │ ├─────────────────────────────────────┤ │ 对齐填充 (可选) │ └─────────────────────────────────────┘ */Java数组可以分为以下几类:
虽然数组都是集合框架的一部分,但它们有一些重要区别:
| 特性 | 数组 | 集合 |
|---|---|---|
| 长度 | 固定 | 可变 |
| 类型 | 基本类型和对象类型 | 仅对象类型 |
| 性能 | 访问速度快O(1) | 根据具体实现而定 |
| 功能 | 基础功能 | 丰富的方法和算法 |
| 泛型支持 | 不支持 | 支持 |
数组是一种数据结构,它包含一组相同类型的元素,这些元素在内存中连续存储。每个元素可以通过索引(从0开始)来访问和修改。
从数学角度来看,数组可以看作是一个有限序列或向量:
A = [a₀, a₁, a₂, ..., aₙ₋₁]其中:
数组使用从0开始的索引机制,这是计算机科学中的常见约定:
// 索引与元素的对应关系int[]array={10,20,30,40,50};/* 索引: 0 1 2 3 4 元素: 10 20 30 40 50 */// 访问第一个元素intfirst=array[0];// 10// 访问最后一个元素intlast=array[array.length-1];// 50数组的边界是指有效索引的范围:
int[]array=newint[5];/* 有效索引范围:0, 1, 2, 3, 4 无效索引:-1, 5, 6, ... */Java提供了三种数组声明方式:
// 方式一:推荐使用int[]array1;// 方式二:C语言风格(不推荐)intarray2[];// 方式三:声明多个数组int[]array3,array4,array5;// 方式四:混合声明(不推荐)intarray6[],array7;// array6是数组,array7是int变量最佳实践:推荐使用第一种声明方式int[] array1,因为它更清晰地表明变量是一个数组类型。
数组可以在不同的时机进行声明和初始化:
publicclassArrayDeclaration{// 成员变量声明privateint[]memberArray;publicArrayDeclaration(){// 构造函数中初始化memberArray=newint[10];}publicvoidmethod(){// 局部变量声明和初始化int[]localArray=newint[5];// 分步声明和初始化int[]stepArray;stepArray=newint[3];}}数组创建有两种方式:
// 创建指定长度的数组int[]numbers=newint[5];// 创建长度为5的int数组,默认值为0// 创建并初始化数组String[]names=newString[]{"张三","李四","王五"};// 分步创建double[]scores;scores=newdouble[10];// 长度为10的double数组,默认值为0.0// 使用变量指定长度intsize=8;int[]dynamic=newint[size];// 简化语法(只能在声明时使用)int[]primes={2,3,5,7,11,13,17,19};// 匿名数组String[]weekdays=newString[]{"周一","周二","周三","周四","周五"};// 多维数组初始化int[][]matrix={{1,2,3},{4,5,6},{7,8,9}};当我们创建一个数组时,Java虚拟机会执行以下步骤:
// 创建数组的详细过程分析int[]array=newint[5];/* 步骤1:检查int[]是否为有效类型 步骤2:在堆内存中分配 5 × 4 = 20 字节的连续空间 步骤3:将所有元素初始化为0 步骤4:将数组引用赋值给array变量 */| 数组类型 | 默认值 | 字节大小 |
|---|---|---|
| byte[] | 0 | 1 |
| short[] | 0 | 2 |
| int[] | 0 | 4 |
| long[] | 0L | 8 |
| float[] | 0.0f | 4 |
| double[] | 0.0d | 8 |
| char[] | ‘\u0000’ | 2 |
| boolean[] | false | 1(实际可能占用更多) |
| 对象数组 | null | 4或8(取决于JVM) |
Java数组的大小受到以下限制:
// 数组大小的理论限制intmaxSize=Integer.MAX_VALUE;// 2^31 - 1 = 2,147,483,647// 实际限制取决于可用内存// 例如:int数组的最大元素数量约为 2^31 - 1// 但实际可用内存可能更小// 测试数组大小限制try{int[]largeArray=newint[Integer.MAX_VALUE];}catch(OutOfMemoryErrore){System.out.println("数组太大,内存不足");}Java数组提供编译时类型检查:
// 类型安全的数组操作int[]intArray=newint[5];String[]stringArray=newString[5];// 编译时类型检查// intArray[0] = "hello"; // 编译错误:类型不匹配// 运行时类型检查Object[]objArray=newString[5];// objArray[0] = new Integer(10); // 运行时错误:ArrayStoreException数组和泛型之间存在一些重要的限制:
// 不能创建泛型数组// List<String>[] stringLists = new List<String>[10]; // 编译错误// 可以使用通配符List<?>[]wildcardLists=newList<?>[10];// 可以创建参数化类型的数组引用List<String>[]stringListRefs=newArrayList[10];// 警告但允许数组的初始化遵循特定的顺序:
publicclassArrayInitialization{// 静态数组初始化privatestaticint[]staticArray={1,2,3};// 实例数组初始化privateint[]instanceArray={4,5,6};publicArrayInitialization(){// 构造函数中的数组初始化int[]constructorArray={7,8,9};}publicstaticvoidmain(String[]args){// 局部数组初始化int[]localArray={10,11,12};}}int[] array而不是int array[]importjava.util.Arrays;publicclassArrayExample{// 常量定义privatestaticfinalintDEFAULT_SIZE=5;// 成员变量数组privateint[]memberArray;publicArrayExample(){// 构造函数中初始化成员数组memberArray=newint[DEFAULT_SIZE];// 初始化数组元素for(inti=0;i<memberArray.length;i++){memberArray[i]=(i+1)*10;}}publicvoiddemonstrateArrayCreation(){// 方式一:声明后创建int[]array1;array1=newint[5];// 方式二:声明并创建int[]array2=newint[5];// 方式三:声明并初始化int[]array3={10,20,30,40,50};// 方式四:使用new关键字初始化String[]names=newString[]{"张三","李四","王五"};// 方式五:动态大小数组intsize=8;int[]dynamicArray=newint[size];// 访问和修改数组元素array1[0]=100;array1[1]=200;// 获取数组长度intlength=array1.length;System.out.println("数组长度:"+length);// 遍历数组System.out.println("遍历array1:");for(inti=0;i<array1.length;i++){System.out.println("索引"+i+"的值:"+array1[i]);}// 使用增强for循环遍历System.out.println("遍历array3:");for(intvalue:array3){System.out.println("值:"+value);}// 使用Arrays工具类System.out.println("array3的内容:"+Arrays.toString(array3));System.out.println("names的内容:"+Arrays.toString(names));// 访问成员数组System.out.println("成员数组:"+Arrays.toString(memberArray));}publicstaticvoidmain(String[]args){ArrayExampleexample=newArrayExample();example.demonstrateArrayCreation();}}掌握数组的基本概念为后续学习更复杂的数据结构和算法奠定了基础。
⭐ 如果这对你有帮助,不妨收藏和分享一下!