Java数组

一、数组概述

数组的定义:相同类型数据的有序集合,相同类型若干个数据按照一定的先后次序排列组合而成。每一个数据称为一个数组元素,每个数组元素可以通过一个下标来访问它。

二、数组声明创建

  • 两种声明数组的方式:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oKakXJi0-1632397262576)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210923182953045.png)]

  • 使用new创建数组
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-29ohBWpk-1632397262580)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210923182542718.png)]

  • 定义数组=声明+创建
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3IedZx2a-1632397262582)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210923183127884.png)]

🎈数组对应的内存

在这里插入图片描述
在这里插入图片描述
🎈数组的三种初始化

  • 动态初始化
    - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3FyM7ZHK-1632397262589)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210923192630862.png)]

  • 静态初始化

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VLtO1v17-1632397262590)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210923192717512.png)]

  • 数组的默认初始化:数组是引用类型,它的元素相当于类的实例变量,数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。

🎈数组的特点

数组一旦被创建,其大小不可变,长度确定
数组的元素可以是任何数据类型,包括基本类型和引用类型,但一个数组中的元素类型必须相同,不允许出现混合类型
数组变量 属于引用类型,数组本身就是对象,Java中的对象位于堆中,数组对象也在堆中,数组中的每个元素相当于该对象的成员变量

🎈数组边界

合法区间:[0 , length-1]

ArrayIndexOutOfBoundsException: 数组下标越界异常!

三、数组使用

for-each循环、for循环遍历

数组作方法入参

数组作返回值

四、多维数组

多位数组即数组的数组,例如二维数组就是特殊的一维数组,它的每个元素都是一个一维数组

  • 二维数组
int[][] a=new int[3][2];
int[][] b={{1,2}, {3,4}, {5,6}};
  • 二维数组的遍历
        int[][] arr=new int[11][11];
        arr[1][2]=1;
        arr[2][3]=2;
//开始遍历!!!!!!!
//方法一!!
        for (int[] arr1 : arr) {
            for (int a : arr1) {
                System.out.print(a+"\t");
            }
            System.out.println();
        }
//方法二!!
       for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j <arr1[i].length; j++) {
                System.out.print(arr1[i][j]+"\t");
            }
        }

五、Arrays类

借助API文档,利用Arrays中的方法,向Arrays中传入创建的数组。

  • 冒泡排序,八大排序之一

两层排序,外层表示冒泡轮数、里层表示元素依次比较。

嵌套循环:时间复杂度O(n^2)

import java.util.Arrays;

public class 冒泡排序 {

    //冒泡排序
    //1.比较数组中两个相邻的元素,如果第一个数比第二个数大,则交换他们的位置
    //2.每一轮比较,都会在 结尾 产生最大数、或者最小数
    //3.下一轮,可以减少一次排序
    //4.依次循环,直到结束
    public static void main(String[] args) {
        int[] arr={2,99,1,4,6,7,2};
        int[] ints = bubbleSort(arr);

        System.out.println(Arrays.toString(ints));

    }

    public static int[] bubbleSort(int[] a) {
        boolean flag=false;//优化冒泡排序,不需要两两交换即已经排好序的数组,停止冒泡。
        //不用对开始就排好序的数组重复比较以及待排序数组的最后一次的比较
        for (int i = 0; i <a.length-1; i++) {
            //外层循环:进行多少轮冒泡
            int tmp=0;
            for (int j = 0; j <a.length-1-i; j++) {
                if (a[j]>a[j+1]) {
                    flag=true;
                    tmp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=tmp;
                }
            }
            if (flag==false) {
                break;//结束循环
            }
        }
        return a;
    }
}

六、稀疏数组

稀疏数组,是一种数据结构,是一种压缩数据的途径。

  • 使用场景

    当一个数组中大部分元素为0时,或者为同一个值时,可以使用稀疏数组来保存。

  • 处理方式

​ 记录数组一共有几行几列,有多少个不同值

​ 把具有不同值的元素和行列及值,记录在一个小规模的数组中,从而压缩程序的规模。

在这里插入图片描述

public class 稀疏数组表示棋盘 {
    public static void main(String[] args) {
        //创建一个11*11的棋盘,利用二维数组    1为黑棋,2为白棋
        int[][] arr1=new int[11][11];
        arr1[1][2]=1;
        arr1[2][3]=2;
        System.out.println("原始数组:");
        for (int[] arrr1 : arr1) {
            for (int a : arrr1) {
                System.out.print(a+"\t");
            }
            System.out.println();
        }
        System.out.println("==========================");

        //转换为稀疏数组保存

        //1.获取有效值的个数
        /*增强for循环遍历二维数组
        int sum=0;
        for (int[] arrr1 : arr) {
            for (int a : arrr1) {
                if (a!=0) {
                    sum++;
                }
            }
        }
        System.out.println(sum);
         */

        int sum=0;
        for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j <arr1[i].length; j++) {
                if (arr1[i][j]!=0) {
                    sum++;
                }
            }
        }
        System.out.println(sum);
        //2.创建一个稀疏数组(行=有效值+1;列=3)
        int[][] arr2=new int[sum+1][3];
        //表中第一行:几行几列,几个有效值
        arr2[0][0]=11;
        arr2[0][1]=11;
        arr2[0][2]=sum;

        //3.遍历二维数组,将非零的值,按要求记录进稀疏数组
        int count=0;
        for (int i = 0; i <arr1.length; i++) {
            for (int j = 0; j < arr1[i].length; j++) {
                if (arr1[i][j]!=0) {
                    count++;
                    arr2[count][0]=i;//记录行号
                    arr2[count][1]=j;//记录列号
                    arr2[count][2]=arr1[i][j];//记录值
                }
            }
        }
        //输出稀疏数组
        System.out.println("稀疏数组:");
       /* for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j <arr2[i].length; j++) {
                System.out.print(arr2[i][j]+"\t");
            }
            System.out.println();
        }
        */


        for (int[] arr2222 : arr2) {
            for (int a : arr2222) {
                System.out.print(a+"\t");
            }
            System.out.println();

        }


        System.out.println("==========================");
        //还原稀疏数组
        System.out.println("还原数组:");
        //1.创建还原数组
        int[][] arr3=new int[arr2[0][0]][arr2[0][1]];

        //2.还原元素的值
        for (int i = 1; i < arr2.length; i++) {
            arr3[arr2[i][0]][arr2[i][1]]=arr2[i][2];
        }

        //3.打印还原数组
        for (int[] arr333 : arr3) {
            for (int a : arr333) {
                System.out.print(a+"\t");
            }
            System.out.println();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值