数组是将类型相同的若干数据有序的形式组织起来的一种形式。数组中可以存放基本数据类型数据,也可以存放引用类型数据;而数组本身是引用数据类型。
数组名:数组的名称,用于区分不同的数组。
数组元素:数组中存放的数据
元素类型:数组要存储的元素的数据类型。
数组下标:对数组元素进行编号,每个元素在数组中的位置用下标或索引表示,下标是从0开始的
数组长度:数组中元素的个数,数组的长度一旦确定就不能被修改。
一、一维数组
- 定义
type[] arrayName,type可以是基本数据类型和对象类型。
例如,声明一个int数组:
int[] intArray; 或 int intArray[];
- 初始化
在定义数组时,只是声明了一个数组类型的变量,并没有为数组分配实际的内存空间,需要通过初始化操作来实现。
(1)、静态初始化:将数组中所有的数据给罗列出来,使用大括号{}包起来,数据的排列顺序就是在数组中的存放数据。
在定义数组的同时对数组元素进行初始化:
int[] arr = {1,2,3,4,5,6,7};
(2)、动态初始化:使用运算符new为数组分配空间,格式如下:
//type是数组的类型;arrayName是数组名字;arraySize是数组的大小(长度)
type[] arrayName = new type[arraySize];
实例:
int[] arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[3] = 3;
当然也可以不用对其初始化,但是不初始化会有默认值,如整型的默认值都为0。
- 数组的特点
(1)、数组是一个对象
(2)、同一数组中元素具有相同类型
(3)、同一数组中存放的数据元素是有序的
(4)、数组一旦创建,其大小是不可变的 - 数组的应用
// 获取数组的长度,通过属性length
int[] arr = {0,1,2,3,4,5,6,7,8,9};
int len = arr.length;
//访问数组和赋值,因为数组是一个随机访问结构,可以用任意的下标访问指定的数据元素,不用按顺序访问。赋值的时候也是一样
arr[1] = 52;
arr[3] =12;
//遍历数组
for(int i = 0; i <arr.length;i++){
System.out.println(arr[i]);
}
//foreach方式:没有下标变量;只支持从前往后循环
for(int i:arr){
System.out.println(i);
}
- 数组下标越界异常
数组下载超过了 [0,length)范围,就会抛出数组下标越界异常。例如
int[] arr = {0,1,2,3,4,5,6,7,8,9};
arr[-1]; //错误,数组下标从0开始
arr[11]; //错误,超出了数组的长度
arr[5]; //正确
- 数组内存分析
基本类型数组和引用类型数组的内存空间是有一些区别的。
(1)、基本类型数组创建对象时会在内存中开辟一块完整连续的空间,各数据的存储单元是连续有序的,而数组名中引用的是这块连续空间的首地址。
例如 int[] arr = {2,4,6};在内存里的存储示意图
(2)、引用类型的数组在数组中分配的只是引用变量的空间,即类似于c语言的指针。所有对象的空间是额外分配的,这些引用变量将指向对象的实际存储位置。
二、二维数组
规则的二维数组就是所有第二维数组的长度都是相等的。
二维数组相关演示如下
// 初始化
int[][] arr = {{1,2},{3,4},{5,6}}; //静态初始化
int[][] arr1 = new int[3][3]; //动态初始化,三行三列的数组
//访问二维数组
arr[1][1]; //取出来4
//遍历二维数组
for(int i = 0; i <arr.length;i++){
for(int j = 0; j <arr[i].length;j++){
System.out.println(arr[i][j]);
}
}