• 数据结构-数组


    Java 数组

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。

    Java 语言中提供的数组是用来存储固定大小的同类型元素。

    数组

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

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

    • 每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们

    特点:

    • 长度不可变
    • 元素类型一致
    • 可以声明任意类型的数组
    • 数组变量属于引用类型,数组也可看成对象,元素视为成员变量
    • 对象存放在JVM的堆中->数组是对象->数组对象本身放在堆中!

    无论数组是基本类型还是引用类型,都存在堆中!

    声明数组变量

    dataType[] arrayRefVar;   // java开发手册推荐
    
    dataType arrayRefVar[];  // 兼容C/C++语法
    

    创建数组

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

    arrayRefVar = new dataType[arraySize];
    

    上面的语法语句做了两件事:

    一、使用 dataType[arraySize] 创建了一个数组。

    二、把新创建的数组的引用赋值给变量 arrayRefVar。

    数组变量的声明,和创建数组可以用一条语句完成,如下所示:

    dataType[] arrayRefVar = new dataType[arraySize];
    dataType[] arrayRefVar = {value0, value1, ..., valuek};
    

    数组的元素是通过索引访问的。数组索引从 0 开始,所以索引值从 0 到 arrayRefVar.length-1。

    数组边界

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

    java.lang.ArrayIndexOutOfBoundsException 数组下标越界异常!

    数组的内存

    image-20200509105839929

    image-20200509134126327

    三种初始化状态

    静态初始化

    创建 + 赋值

    int[] a = {1,2,3,4,5,6,7,8,9};
    

    动态初始化

    包含默认初始化

    int[] b = new int[10];
    b[0] = 1;
    // 后面未赋值的元素初始化成int的默认值0
    

    数组的默认初始化

    数组是引用类型,相当于类的实例变量,因此一经分配空间,

    其中的每个元素也被按照实例变量同样的方式被隐式初始化。

    数组的使用

    • 普通的For循环
    • For-Each 循环
    • 数组作方法入参
    • 数组作返回值
    public class ArrayDemo2 {
        public static void main(String[] args) {
            int[] arrays = {1, 2, 3, 4, 5, 6};
            // For-Each 循环
            for (int array : arrays) {
                System.out.print(array+" ");
            }
    
            System.out.println("
    ------------");
            // 普通的For循环
            int[] array2 = reverse(arrays);
            for (int i = 0; i < array2.length; i++) {
                System.out.print(array2[i]+" ");
            }
        }
    
        // 数组作方法入参
        public static int[] reverse(int a[]){
            int length = a.length;
            int[] result = new int[length];
            for (int i = 0; i < length; i++) {
                result[i] = a[length-i-1];
            }
            return result; // 数组作返回值
        }
    }
    

    多维数组

    多维数组可以看成数组内嵌套数组。(套娃)

    image-20200509160736837

    比如二维数组就是一个特殊的一维数组,它的每一个元素都是一个一维数组。

    int a[][] = new int[2][3] // 声明创建一个两行三列的二维数组
    

    稀疏数组

    image-20200509165522148

    image-20200509165605652

    import java.util.Arrays;
    
    /**
     * 稀疏数组->用小数组储存大数组
     * 比如棋盘
     */
    public class SparseArray {
        public static void main(String[] args) {
            // 1.首先创建一个二维数组10*10  ->  0:空 1:黑 2:白
            int[][] chessboard = new int[10][10];
            chessboard[1][2] = 1;
            chessboard[2][3] = 2;
    
            System.out.println("原始棋盘:");
            for (int[] ints : chessboard) {
                System.out.println(Arrays.toString(ints));
            }
    
    
            int[][] result = toSparse(chessboard);
            System.out.println("稀疏数组:");
            for (int[] ints : result) {
                System.out.println(Arrays.toString(ints));
            }
    
            int[][]  chessboard2 = toChess(result);
            System.out.println("恢复棋盘:");
            for (int[] ints : chessboard2) {
                System.out.println(Arrays.toString(ints));
            }
    
        }
    
        public static int[][]  toSparse(int[][] ints) {
            // 首先统计有效个数
            int count = 0;
            for (int[] anInt : ints) {
                for (int i : anInt) {
                    if (i != 0) {
                        count++;
                    }
                }
            }
    
            // 创建稀疏数组
            int[][] result = new int[count + 1][3];
    
            result[0][0] = ints.length;
            result[0][1] = ints[0].length;
            result[0][2] = count;
    
            int k = 1;
            // 遍历棋盘 储存坐标和值
            for (int i = 0; i < ints.length; i++) {
                for (int j = 0; j < ints[i].length; j++) {
                    if (ints[i][j] != 0) {
                        result[k][0] = i;
                        result[k][1] = j;
                        result[k][2] = ints[i][j];
                        k++;
                    }
                }
            }
            return result;
        }
    
        public static int[][] toChess(int[][] ints) {
            // 棋盘大小
            int len = ints[0][0];
            int heigh = ints[0][1];
            int[][] result = new int[len][heigh];
    
            for (int i = 1;i<ints.length;i++) {
                int x = ints[i][0];
                int y = ints[i][1];
                int value = ints[i][2];
                result[x][y] = value;
            }
            return  result;
        }
    }
    
    

    小结

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

    数组也是对象,数组元素相当于对象的成员变量

    数组的长度确定固定,不可变。越界报错ArrayIndexOutOfBounds

  • 相关阅读:
    Poly2Tri介绍[转]
    Threejs 开发3D地图实践总结【转】
    cesium and three.js【转】
    Three.js中如何显示帧速【转】
    Cesium学习笔记(七):Demo学习(自由控制飞行的飞机)[转]
    cesium原理篇(三)--地形(1)【转】
    cesium原理篇(二)--网格划分【转】
    Cesium原理篇:3D Tiles(1)渲染调度【转】
    shell脚本监控阿里云专线网络状态,若不通通过触发阿里云的进程监控报警
    jstat命令总结
  • 原文地址:https://www.cnblogs.com/1101-/p/13220142.html
Copyright © 2020-2023  润新知