Java 数组
概述
- 数组是存储数据
长度固定
的容器,其中的数据类型保持一致
- 是相同类型数据的有序集合
- 每个数据称为数组元素,每个元素通过下标访问
- 元素可以是任意数据类型,包括基本类型和引用类型
- 数组变量属引用类型
- 数组也可看成是对象,其每个元素可看成该对象的成员变量
- 数组对象本身是在堆中的
定义
数据类型名[] 数组名
数据类型名 数组名[]
int[] arr;
int arr[];
初始化
动态初始化
- 格式
数据类型[] 数组名 = new 数据类型[数组长度];
int[] arr = new int[3];
- new:表示为数组开辟内存空间
- 3表示数组长度
- 系统自动为创建的数组赋初值
- 如,int型则赋初值0
- 包含:默认初始化
- 数组是引用类型,其元素相当于类的实例变量
- 数组一经分配空间,其中元素也按照实例变量同样的方式被隐式初始化
静态初始化
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
数据类型[] 数组名 = {元素1,元素2,...}
int[] arr = new int[]{11,22,33};
int[] arr = {11,22,33}
访问
打印数组
System.out.println(arr);
执行该语句结果为一串字符
- 如:
- [表示数组
- I表示数组类型为整型
- @是分隔符
- 73a987ac表示数组的十六位地址
访问格式
- 索引:数组中元素的编号
- 从0开始
- 格式:
数组名[索引]
System.out.println(arr[0]);
- 遍历
- 将数组中元素遍历出来
- 获取数组长度:
arr.length
- 方法
- for循环
public class ArrayTest01 { public static void main(String[] args) { //定义数组 int[] arr = {11, 22, 33, 44}; //使用通用的遍历格式 for(int x=0; x<arr.length; x++) { System.out.println(arr[x]); } } }
- forEach循环
package com.cxl.demo26; public class Demo26_1 { public static void main(String[] args) { int[] arr = {11,22,33,44}; for (int i : arr) { System.out.println(i); } } }
- 数组作方法参数
package com.cxl.demo26; public class Demo26_2 { public static void main(String[] args) { int[] arr = {11,22,33,44}; printArray(arr); } public static void printArray(int[] arr){ for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]); } } }
- 数组作返回值
public static void main(String[] args) { int[] arr = {11,22,33,44}; } public static int[] 方法名(int[] arr){ int[] result = new int[arr.length]; return result; }
- for循环
内存分配
- 我们只需记住:栈内存和堆内存
区域名称 | 作用 |
---|---|
寄存器 | 给CPU使用,和我们开发无关。 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关。 |
方法区 | 存储可以运行的class文件。 |
堆内存 | 存储对象或者数组,new来创建的,都存储在堆内存。 |
方法栈 | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行。 |
-
一个数组的内存图
-
多个数组的内存图
-
多个数组指向同个数组的内存图
常见异常
索引越界异常
int[] arr = new int[3]; //索引:0 1 2
System.out.println(arr[3]);
- 数组长度为3,索引最大只到2,却访问了索引3
空指针异常
//把null赋值给数组
arr = null;
多维数组
- 可看成是数组的数组
- 是特殊的一维数组
- 每个数组元素都是一个数组
二维数组
- 定义
int arr[][] = new int[2][5]; //可看成一个两行五列数组
int[][] arr = {{11,22},{33,44},{55,66}};
- 遍历
int[][] arr = {{11,22},{33,44},{55,66}};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
}
Arrays类
- 数组的工具类:java.util.Arrays
- 数组本事没有方法供我们调用,但API中提供了工具类Arrays,可对数据对象进行基本操作
- Array类中方法都是static修饰的静态方法
- 使用时可直接使用类名调用,不用使用对象调用
- 常用功能
- 打印数组:toString方法
- 给数组赋值:通过fill方法
- 对数组排序:通过sort方法,按升序
- 比较数组:通过equals方法
- 查找数组元素:通过binarySearch方法,对排序好的数组进行二分查找
- 可通过JDK帮助文档查看其所含方法
稀疏数组
- 当一个数组中大部分元素为0或同一数值时,可用稀疏数组存储
- 处理方式
- 记录数组共几行几列,有多少个不同值
- 将具不同值元素和行列及值记录在一个小规模数组中,从而缩小程序的规模