Java时间胶囊-数组的使用(1)
数组(Array)
是多个相同类型数据按照一定顺序排列的集合 并使用一个名字命名 并通过编号的方式对这些数据进行统一管理
数组的概述
数组的相关概念
数组名
元素
索引/下标/角标(从零开始)
数组的长度(数组存储元素的个数)
数组的相关特点
数组元素是有序排列
数组是引用数据类型 ---> 数组的元素既可以是基本数据类型也可以是引用数据类型
数组的长度一旦确定 不能修改
创建数组对象会在内存中开辟一整块连续的空间 而数组名中引用的是这块连续空间的首地址
数组的分类
按照维数 一维数组.二维数组(会出现 少).. .. .
按照数组元素的类型数组分为:基本数据类型元素的数组 引用数据类型元素的分组
数组的使用
一维数组的使用
一维数组的声明和初始化
如何调用数组的指定索引位置元素
获取数组的长度
遍历数组
数组元素的默认初始化值
数组的内存解析
1~5
// 1. 一维数组的声明和初始化
int[] ids;// 声明
// 1.1 静态初始化(数组的初始化和数组元素的赋值操作同时进行)(知道值的情况下进行)(引用类型初始化 --->new... .. .)
ids = new int[] { 1001, 1002, 1003, 1004 };
// 1.2 动态初始化(数组的初始化和数组元素的赋值操作分开进行)(不知道值的情况下进行)
String[] names = new String[5];
// 总结:无论静态还是动态初始化 数组初始化完成后 ---> 数组长度就确定了(数组的长度一旦确定 不能修改)
// 2. 如何调用数组指定位置的元素:通过索引(index)的方式(一方面赋值 /一方面调用)
// Java中数组的索引 ---> 从0开始~到数组长度-1结束
// 编译只是生成字节码文件 真正运行中才将字节码文件解释运行在内存中
names[0] = "张三";
names[1] = "李四";
names[2] = "王五";
names[3] = "赵六";
names[4] = "李七";
// 3. 如何获得数组长度
System.out.println(names.length);
System.out.println(ids.length);
// 4. 遍历数组元素(将数组元素全部输出)
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
// 5. 数组元素的默认初始化值
System.out.println("\n整型数据类型数组默认值:");
System.out.println("--------------------------------------------------");
int[] arr = new int[4];
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}// 输出 = 0/0/0/0 ---> 0这是整型数组的默认初始化值
System.out.println("\n短整型数据类型数组默认值:");
System.out.println("--------------------------------------------------");
short[] arr1 = new short[4];
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
System.out.println("\n浮点型数据类型数组默认值:");
System.out.println("--------------------------------------------------");
double[] arr2 = new double[4];
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
System.out.println("\n字符型数据类型数组默认值:");
System.out.println("--------------------------------------------------");
char[] arr3 = new char[4];
for (int i = 0; i < arr3.length; i++) {
System.out.println(arr3[i]);
}// 输出是相当于空格的效果 但不是空格(空格ASCII == 48)输出结果是0
System.out.println("\n布尔型数据类型数组默认值:");
System.out.println("--------------------------------------------------");
boolean[] arr4 = new boolean[4];
for (int i = 0; i < arr4.length; i++) {
System.out.println(arr4[i]);
}
System.out.println("\n引用数据类型数组默认值:");
System.out.println("--------------------------------------------------");
String[] arr5 = new String[4];
for (int i = 0; i < arr5.length; i++) {
System.out.println(arr5[i]);
}
/*
* 数组元素的默认初始化值... .. .
* 数组元素是整形:0
* 数组元素是浮点型:0.0
* 数组元素是char型:0或者'\u0000' 而非'0'
* 数组元素是boolean型:false
*
* 数组元素是引用数据类型:null
*
*/
6. 数组内存结构简单说明(结构的规范在jVM中体现)(随着JDK版本的提升 规范也有所变化)
内存中主要结构:栈(stack)(是线性表结构) 堆(heap)方法区(常量池 静态域 还有类加载的信息... .. .)
栈 ---> 存储局部变量 引用
堆 ---> 对象 数组
(String --> 常量池 static --> 静态域)
栈 ---> 堆 堆中连续的空间 使用首地址值(使用16进制表示)(这里的地址并不是内存中真实的地址 而是JVM算出来的哈希值 屏蔽了底层真实内存地址) 值赋予栈空间引用
一维数组的简单应用
从键盘输入5个学生成绩 提取最高分 并分级输出每个学生的成绩等级
... .. .
多维数组(二维即以上)
如果说可以把一维数组当作几何中的线性结构 那么二维数组就相当于一个表格(对于多维数组 数组的元素可以是引用类型 那么数组的元素也可以是数组 可以想象一个线性结构 它的每一项都是数组 就构成了表格(二维数组))
把一个数组当作另一个数组的元素 即是二维数组
从计算机底层来看 没有二维数组 因为当栈中引用指向堆中的一维数组 一维数组的每一项索引 又指向堆中的一项一维数组
二维数组的使用
二维数组的声明和初始化
如何调用数组的指定索引位置元素
获取数组的长度
遍历数组
数组元素的默认初始化值
数组的内存解析
// 1. 二维数组的声明和初始化
// 1.1 静态初始化
int[][] arr1 = new int[][] { { 1, 2, 3 }, { 4, 5 }, { 6, 7, 8 } };
// 1.2 动态初始化
int[][] arr2 = new int[3][2];
// 1.2.1 动态初始化
int[][] arr3 = new int[3][];
// 2. 如何调用数组的指定位置的元素
System.out.println(arr1[0][0]);
System.out.println(arr1[1][1]);
System.out.println(arr2[0][0]);
// 3. 获取数组的长度
System.out.println(arr1.length);
System.out.println(arr1[1].length);
// 4. 如何遍历二维数组
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
System.out.print(arr1[i][j] + "\t");
}
System.out.println();
}
/*
* 5. 数组元素的默认初始化值 规定:二维数组 我们分为两层(外层数组元素 内层数组元素) int[][] arr = new
* int[4][3]; 外层元素:arr[0],arr[1].. .. . 内层元素:arr[0][0],arr[1][2]... .. .
*
*/
int[][] arr = new int[4][3];
System.out.println(arr[0]);// [I@15db9742 “[”代表是一维的数组 “I”是int型
// “@”地址是15db9742(hex) 因为数组每一个下标中都存着数组
System.out.println(arr[0][0]);// 0
String[][] arr4 = new String[4][2];
System.out.println(arr4[1]);// [Ljava.lang.String;@6d06d69c
System.out.println(arr4[1][1]);// null
double[][] arr5 = new double[4][];
System.out.println(arr5[1]);// null 因为数组的每一个下标中存储的是数组 现在下标中并没有初始化过
// 所以是null 无关是何种类型
/*
* 针对于初始化方式1:int[][] arr = new int[4][3];
* 外层元素的初始化值为:地址值
* 内层元素的初始化值为:与一维数组初始化情况相同
* 针对于初始化方式1:int[][] arr = new int[4][];
* 外层元素的初始化值为:null
* 内层元素的初始化值为:不能调用 否则报错
*/