Java基础-数组

本文介绍了Java中的数组初始化,包括动态初始化、默认初始化和静态初始化。动态初始化是在声明时指定数组长度,但不赋值。默认初始化时,数组元素会根据类型获得默认值,如int为0,String为null,char为空字符。静态初始化则在创建时直接赋值。此外,文章还探讨了数组的特点和稀疏数组的概念,展示了如何将包含大量无效元素的数组转换为稀疏数组以节省空间。
摘要由CSDN通过智能技术生成

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};
这种初始化数组的方式叫做**静态初始化数组**:创建+赋值, 也就是在创建的数组的时候就已经赋值了,这叫静态初始化数组

数组的基本特点

  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)的坐标形式将其记录下来:第一列代表的是行号,第二列代表列号,第三列代表的是有效的元素值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值