Java基础-数组
动态初始化
- 声明一个数组
int[] i;
这种写法属于声明一个数组,但其实该数组并不存在。且该数组未被赋值、未被实例化,并不能直接使用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5rmdOvYh-1626277354780)(C:\Users\lyrzn\AppData\Roaming\Typora\typora-user-images\image-20210712215511697.png)]
可以看到,当直接打印该数组时,编译器提示错误:变量i未被初始化。
- 声明并实例化一个数组
int[] i = new int[10];
这种初始化方式叫做动态初始化数组,我们将声明和实例化写在了一起,表示我们声明并实例化了一个数组,并设置该数组长度为10,但却未对其赋值,这中方式叫做动态初始化数组。而当代码执行时会在内存栈中分配对应大小的内存给该数组。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OIbFQFmE-1626277354782)(C:\Users\lyrzn\AppData\Roaming\Typora\typora-user-images\image-20210712220323428.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-azdX4fh7-1626277354783)(C:\Users\lyrzn\AppData\Roaming\Typora\typora-user-images\image-20210712220346521.png)]
可以看到,因为该数组实例化了,所以我们可以打印出该数组的内存地址
默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中每个元素也被按照实例化变量同样的方式被隐式初始化
int[] ints = new int[10];
String [] strings = new String[10];
char[] chars = new char[10];
System.out.println("int 类型默认值---:"+ints[1]);
System.out.println("String 类型默认值---:"+strings[1]);
System.out.println("chars 类型默认值---:"+chars[1]);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D0eohjmc-1626277354786)(C:\Users\lyrzn\AppData\Roaming\Typora\typora-user-images\image-20210712223125341.png)]
可以看到,当数组被实例化后,该数组的每一个元素都被实例化了,且元素实例化后会根据不同的数组类型变为不同的默认值,int类型默认值为0、String类型为null、char类型为空字符串。
静态初始化
int[] i = {1,2,3};
这种初始化数组的方式叫做**静态初始化数组**:创建+赋值, 也就是在创建的数组的时候就已经赋值了,这叫静态初始化数组
数组的基本特点
- 数组长度是确定的,一旦创建就大小就不可更改
- **数组元素是相同类型的,数组中不能出现混合类型的元素 **
- 数组变量属于引用类型,它本身也可以看作一个对象
稀疏数组
- 稀疏数组其实就是将原数组中无效数据剔除,以坐标X,Y的形式将其有效元素记录下来。
/**
* 稀疏数组
*/
static void Test03(){
//定义一个棋盘
int [][] arrAy = new int[11][11];
//为该棋盘上定义两个棋子
arrAy[1][2]=888;
arrAy[2][3]=666;
System.out.println("打印棋盘:");
//打印该棋盘
for (int[] Arrays:arrAy) {
for (int i:Arrays) {
System.out.print(i+"\t");
}
//每输出一行旧进行换行
System.out.println('\n');
}
System.out.println("分割线-------------------------");
//记录棋盘数组中的有效元素个数
int sum = 0;
for (int[] arr:arrAy) {
for (int s :arr) {
if(s!=0){
sum++;
}
}
}
//将该数组转换为稀疏数组 (将原数组中无效数据剔除,以坐标X,Y的形式将其有效元素记录下来)
//定义一个稀疏数组(数组行长度为需要储存的元素个数,列长度为3:[X,Y,元素值])
System.out.println("打印稀疏数组:");
int[][] arrays = new int[sum][3];
//将原棋盘中的有效元素记录到稀疏数组中
int s =0;
for (int i = 0; i < arrAy.length; i++) {
for (int j = 0; j < arrAy[i].length; j++) {
if(arrAy[i][j]!=0){
//第一列为X轴上的坐标
arrays[s][0] = i;
arrays[s][1] = j;
arrays[s][2] = arrAy[i][j];
s++;
}
}
}
for (int[] Arrays:arrays) {
for (int i:Arrays) {
System.out.print(i+"\t");
}
//每输出一行旧进行换行
System.out.println('\n');
}
}
- 如上图所示,原数组中太多无效元素占据了空间,我们使用程序时会大大的浪费资源。所有我们可以使用稀疏数组以行和列(X,Y)的坐标形式将其记录下来:第一列代表的是行号,第二列代表列号,第三列代表的是有效的元素值