数组
多个相同类型的数据按照顺序排列的集合
常见概念:
- 数组名
- 数组下标(可以用来访问和修改数组中元素的值)
- 元素(数组中存放的值)
- 数组的长度(用来表示数组中存放有多少元素)
数组的特点:
- 数组中存放的元素的类型都是相同的。
- 数组是有序排列的。
- 数组是引用类型数据的一种数组类型。
- 数组的元素可以使基本数据类型,也可以是引用数据类型。
- 数组对象在内存中分配的是一块连续的存储空间。
- 数组名中引用的是这块连续空间的首地址 。
- 数组的长度一旦确定,就不能再修改!
数组的分类:
- 按照维数分类:一维数组、二维数组…
- 按照数组元素类型:基本数据类型元素的数组、引用数据类型元素的数组。
一维数组
一维数组的声明和初始化
// 一维数组的声明和初始化
int[] ids; // 声明
ids = new int[] { 1001, 1002, 1003, 1004 }; //初始化
//静态类型的声明和初始化
int[] ids = new int[] { 1001, 1002, 1003, 1004 };
//动态类型的声明和初始化
String[] names = new String[5]; //元素是动态的,不确定的。
//注意:在声明和初始化过程中,不能既指定了长度,有赋了相应的值;不能静态初始化和动态初始化合二为一。
//错误示范
// int[] arr3 = new int[4] {1001, 1002, 1003, 1004};
总结:
初始化时,元素确定了就是静态初始化,元素未确定是动态初始化。
如何调用数组的指定位置的元素
通过下标的方式调用数组中执行元素的值。
注意数组的下标是从0
开始的,倒数租的length - 1
结束。超出范围,报数组越界异常!
String names = new String[4];
names[0] = "无名";
如何获取数组的长度
数组有一个length
属性,可以通过数组名.length
获取数组中元素的个数,即数组的长度。
String names = new String[4];
System.out.println(names.length); // 4
如何遍历数组
遍历数组中所有元素的值。
String names = new String[4];
for (int i = 0; i < names.length; ++i) {
System.out.println(names[i]);
}
数组元素的默认初始化值
总结:
- 数组元素为byte、short、int、long 未初始化时默认值为0
- 数组元素为float、double 未初始化时默认值为0.0
- 数组元素为char 未初始化时默认值为:ASCII为0的值NUL
- 数组元素为boolean型, 未初始化时默认值为:false
- 数组元素为引用数据类型 默认值为null
数组的内存解析
public static void main(String[] args) {
String[] names = new String[2];
names[0] = "无名";
names[1] = "孙强";
上述代码的解析:
当main方法之行结束之后,栈中的变量将会弹出,释放相应的空间,所以,在堆中的数组将不会被引用。根据引用计数算法,未被引用的数据将被视为“垃圾”,会自动被垃圾回收机制GC释放。
二维数组
根据上述一维数组的特点:数组本身是引用类型,数组元素的类型可以是基本数据类型,也可以是引用数据类型。所以,二维数组可以看做是,数组元素是一维数组的一维数组。
一维数组的声明和初始化
//1.二维数组的初始化
//方式一:静态初始化
int[][] arr = new int[][]{{1, 2, 3},{4, 5, 6}};
//方式二:动态初始化
int[][] arr = new int[3][4]; //通俗的理解,确定了3行4列
int[][] arr = new int[3][];//确定了3行,列数不确定
//正确的声明初始化方式
String[][] arr = new String[3][4];
String[] arr[] = new String[3][4];
String arr[][] = new String[3][4];
int[][] arr = new int[][]{{1, 2, 3}, {4, 5, 6}}
//错误示例
String[][] arr = new String[][4]
String[3][4] arr = new String[][];
int[][] nums = new int[4][3] = {{1, 2, 3},{4, 5, 6},{7, 8, 9},{10, 11, 12}};
如何调用数组的指定位置的元素
//数组下标始终从0开始
//如果想使用数组中第2行第1列的元素
int[][] nums = new int[][] = {{1, 2, 3},{4, 5, 6},{7, 8, 9},{10, 11, 12}};
int num = nums[1][0];
//给数组中的元素赋值
int[][] nums1 = new int[4][];
//如果先要给数组中第2个元素赋值
arr[1] = new int[5];
如何获取数组的长度
int[][] arr = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int lengthRow = arr.length; //理解为获取二维数组的行数
int lengthCol = arr[0].length; //理解为获取二维数组中第一行的列数
数组元素的默认初始化值
规定:二维数组分为外层数组的元素,内层数组元素
int[][] arr = new int[4][3];
外层元素:arr[1],arr[2]…
内层元素:arr[1][2], arr[0][1]…
总结:
初始化方式一:
int[][] arr = new int[4][3];
外层元素的初始化值为:哈希地址值
内层元素的初始化值与一维数组的元素初始化情况相同。
初始化方式二:
int[][] arr = new int[4][];
外层元素的初始化值为:null
内层元素的初始化值为:内层元素不存在不能调用内层元素,否则出现空指针异常。
int[][] arr = new int[4][3]; //已经默认初始化了哦
int[][] arr1 = new int[4][];
String[][][] arr2 = new String[4][3][5];
System.out.println(arr11); //哈希地址值 [[[Ljava.lang.String;@6504e3b2 [[[三维数组 Ljava.lang.String;表示String类型数组
System.out.println(arr9); //哈希地址值 [[I@6504e3b2 [[表示二维数组 I表示整型数组
System.out.println(arr9[0]); //哈希地址值 [I@515f550a [表示一维数组 I表示整型组数
System.out.println(arr10[0]); //null
System.out.println(arr9[0][0]); //0
数组的内存解析
int[][] arr = new int[2][3];
int[][] arr = new int[2][];
总结:
- 在二维数组中,外层数组元素的值只能有两种情况,要么为null,要么为地址值。内层元素的值可以是基本数据类型,也可以是引用数据类型。
- 计算机中只存在数组,并不存在二维数组,计算机中通过外层数组元素存储内层数组的地址来表示所谓的“二维数组”。