一、数组的概念
- 一组连续的存储空间,存储多个相同数据类型的值。
- 特点:类型相同,长度固定,可以自动给数组中的元素从0开始编号,方便操作这些元素。
二、数组的定义
数组的创建
//格式一:
//元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
int[] arr1 = new int[5];
//格式二:元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
int[] arr1 = new int[]{3,5,1,7};
//
- 声明数组变量:推荐使用int[] x 的形式声明数组。
- 创建数组:要使用一个新的关键字叫做new,new 用来在内存中产生一个容器实体。
给数组分配空间时,必须指定数组能够存储的元素个数来确定数组大小,体现了数组长度固定的特点;创建数组之后不能修改数组的大小。可以使用length 属性获取数组的大小。
三、数组的初始化
如果数组初始化中不使用运算符new。需要注意:下列写法是错误的:
int[] arr;
arr = {20,30,40};
初始化数组,必须将声明,创建,初始化都放在一条语句中,分开会产生语法错误。
四、数组下标的有效范围与常见异常
- ArrayIndexOutOfBoundsException 索引值越界异常。
一旦我们访问了不在有效范围的下标,那么就会产生数组下标越界异常。 - NullPointerException 空指针异常
引用类型变量没有指向任何对象,而访问了对象的属性或者是调用了对象的方法。
五、数组内存分析
-
栈内存:栈内存存储的都是局部变量,变量一旦出了自己的作用域,那么就会马上从内存的消失,释放内存空间。
-
堆内存:堆内存存储的都是对象内存,对象一旦被使用完,并不会马上从内存中消失,而是等待垃圾回收器不定时的把垃圾对象回收,这时候该对象才会消失,释放内存。
-
凡是以new关键字创建的对象,JVM都会在堆内存中开辟一个新的空间,创建一个新的对象。
-
对象如果没有变量引用了,那么该对象就是一个垃圾对象了。
六、二维数组
- 创建二维数组
//数组元素类型 数组名字[][];
//数组元素类型[][] 数组名字;
int arr1[][];
char[][] arr2;
//分配内存
int a[][];
a = new int[2][4]; //直接分配行类
int b[][];
b = new int[2][]; //先分配行,再分配列
b[0] = new int[2]; //给第一行分配列
b[1] = new int[2]; //给第二行分配列
如果不声明"行"数量的话,就是错误的写法。
- 二维数组的赋值
有三种方式:
public class InitTDArray {
public static void main(String[] args) {
/* 第一种方式 */
int tdarr1[][] = { { 1, 3, 5 }, { 5, 9, 10 } };
/* 第二种方式 */
int tdarr2[][] = new int[][] { { 65, 55, 12 }, { 92, 7, 22 } };
/* 第三种方式 */
int tdarr3[][] = new int[2][3]; // 先给数组分配内存空间
tdarr3[0] = new int[] { 6, 54, 71 }; // 给第一行分配一个一维数组
tdarr3[1][0] = 63; // 给第二行第一列赋值为63
tdarr3[1][1] = 10; // 给第二行第二列赋值为10
tdarr3[1][2] = 7; // 给第二行第三列赋值为7
}
}
- 多维数组
多维数组在Java中是可以使用的,但因为其结构关系太过于复杂,容易出错,所以不推荐在程序中使用比二维数组更高维数的数组,如果需要存储复杂的数据,推荐使用集合类或自定义类集合类包括List、Map等。
七、不规则数组
上文讲的数组都是行、列固定的矩形方阵, Java同时也支持不规则的数组,例如二维数组中,不同行的元素个数可以不同,例如∶
a[][] = new int[3][];
// 创建二维数组,指定行数,不指定列数
a[0]= new int[5];// 第一行分配5个元素
a[1] = new int[3];// 第二行分配3个元素
a[2] = new int[4];// 第三行分配4个元素
八、数组的基本操作
-
数组遍历:
遍历二维数组需使用双层for循环,通过数组的length属性可获得数组的长度。 -
填充和替换数组元素
数组中的元素定义完成后,可通过Arrays类的静态方法fill()方法来对数组中的元素进行分配,起到填充和替换的效果。fill()方法可将指定的int值分配给int型数组的每个元素。 语法如下∶
Arrays.fill()(int[] a ,int value)
a∶要进行元素分配的数组。
value∶要存储数组中所有元素的值。