Java数组深度解析:概念、初始化与内存分配

0 下载量 103 浏览量 更新于2024-08-03 收藏 1.2MB PDF 举报
"Java学习笔记,涵盖Java概述、环境搭建、语言基础、选择结构和数组" 在Java学习的第六部分,我们重点探讨了数组这一重要概念。数组是编程中常用的数据结构,它允许我们存储一组相同类型或兼容类型的数据。在Java中,数组具有以下特点: 1. **数据类型相同或兼容**:数组内的所有元素必须是同一类型或兼容的类型,例如,你可以创建一个只包含整数的数组或一个只包含字符串的数组。 2. **长度固定**:数组的长度在声明时必须确定,并且在数组的生命周期内无法改变。这意味着一旦创建,数组的大小是固定的。 声明数组有两种方式: **方式一**:`数组元素类型[] 数组名` 这是推荐的方式,例如 `int[] numbers`。 **方式二**:`数组元素类型 数组名[]` 例如 `int numbers[]`,虽然可行,但不常见。 数组的初始化至关重要,Java中的数组必须先初始化才能使用。初始化分为两种方式: **静态初始化**: 在声明时指定每个元素的初始值。系统会根据提供的值自动计算数组长度。例如: ```java int[] arr1 = new int[]{10, 8, 28, 15, 12}; int[] arr2 = {10, 8, 28, 15, 12}; // 简写形式 String[] names1 = new String[]{"张三", "李四", "王五"}; String[] names2 = {"张三", "李四", "王五"}; // 简写形式 ``` 简写形式必须在同一语句中完成,不能分开写。 **动态初始化**: 仅指定数组长度,元素会自动分配默认值。例如: ```java int[] nums = new int[5]; // 整数默认为0 String[] cities = new String[3]; // 引用类型默认为null char[] chars = new char[10]; // 字符默认为'\u0000' ``` 在初始化时,静态初始化和动态初始化不能混用,即不能同时指定长度和初始化元素。 数组的使用涉及其下标,下标通常从0开始,到数组长度减1,例如一个长度为5的数组,下标范围是0到4。遍历数组通常通过循环实现,如for-each循环或传统的for循环。 数组在程序内存中分为两部分存储: **栈**: 这是一个有限的空间,用于存储局部变量(基本类型和引用类型的地址)。栈的存储速度快,但空间相对较小。 **堆**: 堆空间较大,但存取速度较慢。引用类型的实际数据(如对象和数组)存储在这里。数组虽然在声明时在栈上创建引用,但其实际内容是在堆中。 当需要扩大数组容量时,Java不会自动扩容数组。如果需要更大的空间,需要创建新的数组并将旧数组的内容复制到新数组中。在函数中传递数组时,实际上是传递数组的引用,而不是数组本身,这意味着对数组的修改会影响到原始数组。 数组类是Java中的一个重要概念,如`ArrayList`和`ArrayDeque`等,它们提供了动态调整大小的功能,弥补了固定大小数组的不足。在实际开发中,这些集合类经常被用来替代基本的数组,提供更灵活的数据管理能力。