Java数组

数组概述

  • 数组定义:

    • 数组是相同类型数据的有序集合。

    • 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。

    • 其中,每一个数据称作一个数组元素,每个数组元素可以通用过一个下标来访问他们。

  • 数组的四个基本特点:

    • 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。

    • 其元素必须是相同类型,不允许出现混合类型。

    • 数组中的元素可以是任何数据类型,包括基本类型和引用类型。

    • 数组变量属于引用类型,数组可以看作是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

数组声明创建

  • 首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:

    dataType[] arrayRefVar;  int[] a;        //首选的方法
    或
    dataType arrayRefVar[];   int a [];       //效果相同,但不是首选方法

  • Java语言使用new操作符来创建数组,语法如下:

    dataType[] arrayRefVar = new dataType[arraySize];    int [] a = new int[3];

  • 数组的元素是通过索引访问的,数组索引从0开始。

  • 获取数组长度:arrays.length。

  • 内存分析

  • 三种初始化:

    • 静态初始化(创建+赋值)

      int[] a = {1,2,3};                          //基本类型
      Man[] mans = {new Man(1,1),new Man(2,2)};   //引用类型

    • 动态初始化(包含默认初始化)

      int[] a = new int[5];
      a[0]=1;
      a[1]=2;                     //没有赋值的元素默认初始化,int类型默认为0,string默认为NULL

    • 数组的默认初始化

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

  • 数组边界:

    • 下标的合法区间:[0,length-1],如果越界就会报错。

      public static void main(String[] args){
          int[] a = new int[2];
          System.out.println(a[2]);
      }

    • ArrayIndexOutOfBoundsException:数组下标越界异常!

数组使用

  • For-Each循环

    for (int array : arrays) {
        System.out.println(array);   //可以省去下标
    }

  • 数组做方法入参

    eg:

    public class ArrayExercise {
        public static void main(String[] args) {
            int[] arrays ={1,2,4,5,7,9,13,11,10,6,19,12,3,5,2,8};
            traverse(arrays);
            arraySort(arrays);
            calculate(arrays);
            finder(arrays);
        }
        //数组遍历并打印
        public static void traverse(int[] arrays) {
            System.out.println("数组遍历结果为:");
            for (int i = 0; i <arrays.length; i++) {
                System.out.print(arrays[i]+"\t");
            }
            System.out.println();
            System.out.println("=======================================");
        }
        //数组排序(大到小)
        public static void arraySort(int[] arrays){
            System.out.println("数组排序(大到小)结果为:");
            int t = 0;
            for (int i = 0; i < arrays.length ; i++) {
                for (int j = 0; j < arrays.length-1; j++) {
                    if (arrays[i]>arrays[j]){
                        t = arrays[i];
                        arrays[i] = arrays[j];
                        arrays[j] = t;
                    }
                }
            }
            for (int i = 0; i < arrays.length; i++) {
                System.out.print(arrays[i]+"\t");
            }
            System.out.println();
            System.out.println("=======================================");
        }
        //计算数组的和
        public static void calculate(int[] arrays){
            int sum =0;
            for (int i = 0; i < arrays.length; i++) {
                sum+=arrays[i];
            }
            System.out.println("数组的和为:"+sum);
            System.out.println("=======================================");
        }
        //查找最大元素
        public static void finder(int[] arrays){
            int MAX = arrays[0];
            for (int i = 0; i < arrays.length; i++) {
                if (arrays[i]>MAX){
                    MAX = arrays[i];
                }
            }
            System.out.println("最大元素是:"+MAX);
            System.out.println("=======================================");
        }

  • 数组做返回值

    eg:

        public static void main(String[] args) {
            int[] arrays ={1,2,4,5,7,9,13,11,10,6,19,12,3,5,2,8,4};
            int[] reverse = reverse(arrays);
            reverse(arrays);
            for (int i = 0; i < reverse.length; i++) {
                System.out.print(reverse[i]+"\t");
            }
        }   
    //反转数组 数组做返回值
        public static int[] reverse(int[] arrays){
            int t = 0;
            int[] result = new int[arrays.length];
    ​
                for (int j = 0; j < arrays.length/2; j++) {
                    t = arrays[j];
                    arrays[j] = arrays[arrays.length-1-j];
                    arrays[arrays.length-1-j] = t;
                }
            for (int i = 0; i < result.length; i++) {
                result[i]=arrays[i];
            }
            return result;
        }

多维数组

  • 多维数组可以看作是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。

  • 二维数组:

    int[][] arrays = new int[2][5];   //两行五列
    arrays={{1,2,4,2,1},{2,3,4,6,2}};  //赋值
                                    //1 2 4 2 1        a[0]
                                    //2 3 4 6 2        a[1]
    printArray(arrays[0]);    //结果为1 2 4 2 1
    printArray(arrays[0][3]); //结果为2

Arrays类

  • 数组的工具类java.util.Arrays。

  • 由于数组对象本身并没有什么方法可以提供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本操作。

  • 查看JDK帮助文档。

  • Arrays类中的方法都是static修饰的静态方法,在使用的时候可以使用类名进行调用,而“不用”使用对象来调用。(注意:是“不用”而不是“不能”)。

  • 具有以下常用功能

    • 给数组赋值:通过fill方法。

    • 对数组排序:通过sort方法,按升序。

    • 比较数组:通过equals方法比较数组中元素值是否相等。

    • 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。

      int[] a = {12,32,4322,123,432,65,9765};
      ​
      //直接打印数组a 结果:[I@1b6d3586 打印的是数组对象
      System.out.println(a);
      ​
      //通过Arrays工具类toString方法打印数组元素 结果为:[12, 32, 4322, 123, 432, 65, 9765]
      System.out.println(Arrays.toString(a));
      ​
      //通过Arrays工具类sort方法排序数组 结果为:[12, 32, 65, 123, 432, 4322, 9765]
      Arrays.sort(a);
      System.out.println(Arrays.toString(a));
      ​
      //通过Arrays工具类fill方法给数组2到4元素填充赋值 1  结果为[12, 32, 1, 1, 432, 4322, 9765]
      Arrays.fill(a,2,4,1); //数组2到4填充值为1  去掉2,4则全部填充为1
      System.out.println(Arrays.toString(a));

稀疏数组(sparse array)

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

  • 稀疏数组的处理方式是:

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

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

  • 如下图:左边是原始数组,右边是稀疏数组。

  • 需求:编写五子棋游戏中,有存盘退出和续上盘的功能

分析问题:因为二维数组的很多值默认为0,因此记录了许多没有意义的数据。

  • 代码实现:

    public class SparseArray {
        public static void main(String[] args) {
            int[][] arrrays = new int[11][11]; //11行11列
            arrrays[1][2] = 1;
            arrrays[2][3] = 2;
            System.out.println("输出原始数组:");//输出原始数组
            for (int[] ints:arrrays) {
                for (int anInt:ints) {
                    System.out.print(anInt+"\t");
                }
                System.out.println();
            }
            //获取有效值的个数
            int EffValue = 0;
            for (int i = 0; i < arrrays.length; i++) {
                for (int j = 0; j < arrrays.length; j++) {
                    if(arrrays[i][j]!=0){
                        EffValue++;
                    }
                }
            }
            System.out.println("=========================================");
            System.out.println("有效值的个数为:"+EffValue);
            //创建稀疏数组
            //因为稀疏数组0列记录行,1列记录列,2列记录有效值 所以可以确定稀疏数组有3列;第0行记录有几行,有几列,有多少不同值,第1行及以后记录在哪一行哪一列和值是多少,所以行数应该是值数+1.
            int[][] sparseArrays = new int[EffValue+1][3];
            //给稀疏数组第0行赋值
            sparseArrays[0][0] = 11;
            sparseArrays[0][1] = 11;
            sparseArrays[0][2] = EffValue;
            //遍历原始数组,将有效的值放入稀疏数组
            int count = 0;
            for (int i = 0; i < arrrays.length ; i++) {
                for (int j = 0; j < arrrays.length ; j++) {
                    if(arrrays[i][j]!=0){
                        count++;
                        sparseArrays[count][0] = i;
                        sparseArrays[count][1] = j;
                        sparseArrays[count][2] = arrrays[i][j];
                    }
                }
            }
            System.out.println("=========================================");
            //输出稀疏数组
            System.out.println("输出稀疏数组:");
            for (int[] ints:sparseArrays) {
                for (int anInt:ints) {
                    System.out.print(anInt+"\t");
                }
                System.out.println();
            }
            System.out.println("=========================================");
    ​
    //        取出稀疏数组里的有效值并存放在数组中
    //        System.out.println("输出有效值数组:");
    //        int [] EffArrays =new int[sparseArrays[0][2]];
    //        for (int i = 0; i <sparseArrays[0][2] ; i++) {
    //            EffArrays[i] = sparseArrays[i+1][2];
    //        }
    //        //输出有效值数组
    //        for (int i = 0; i < EffArrays.length; i++) {
    //            System.out.print(EffArrays[i]+"\t");
    //        }
    //        System.out.println();
    //        System.out.println("=========================================");
    ​
            //将稀疏数组转换为原始形式的数组
            //创建更新后的数组
            int[][] updata = new int[sparseArrays[0][0]][sparseArrays[0][1]];
            //将有效值先赋给更新数组
            for (int i = 1; i <= sparseArrays[0][2]; i++) {
                updata[sparseArrays[i][0]][sparseArrays[i][1]] = sparseArrays[i][2];
            }
            //输出更新后的数组
            System.out.println("输出更新后的数组:");
            for (int i = 0; i < updata.length ; i++) {
                for (int j = 0; j < updata.length; j++) {
                    System.out.print(updata[i][j]+"\t");
                }
                System.out.println();
            }
        }
    }

    运行结果为:

    输出原始数组:

    0 0 0 0 0 0 0 0 0 0 0

    0 0 1 0 0 0 0 0 0 0 0

    0 0 0 2 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

    =========================================

    有效值的个数为:2

    =========================================

    输出稀疏数组:

    11  11   2

    1     2    1

    2     3    2

    =========================================

    输出更新后的数组:

    0 0 0 0 0 0 0 0 0 0 0

    0 0 1 0 0 0 0 0 0 0 0

    0 0 0 2 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 0 0 0 0 0 0

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

echo wsn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值