Javaj基础——数组

1 一维数组

1.1 概念

  数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的 方式对这些数据进行统一管理。

  • 变量:在内存开辟一块空间。
  • 数组:也是变量,在内存中开辟一串连续的空间。数组长度一旦确定,就不能修改。

数组的常见概念

  • 数组名
  • 下标(或索引)
  • 元素
  • 数组的长度

1.2 基本用法

1. 格式

  • 格式 1. 数据类型[] 数组名,属于只创建了数组引用名, 并未在内存创建数组空间
  • 格式 2. 数据类型[] 数组名称 = new 数据类型[数组长度];
  • 格式 3. 数据类型[] 数组名称 = {数组内容 1,数组内容 2,数组内容 3...数组内容 n};
  • 格式 4. 数据类型[] 数组名称 = new 数据类型[]{内容 1,内容 2,内容 3...内容 n}

2. 代码

public static void main(String[] args) {
        // 1、声明数组
        //1.1 先声明,后开辟空间:数据类型[] 数组名称;
        int[] arr1;//声明
        arr1 = new int[4];//开辟空间:数组名称=new 数据类型[数组长度]; 数组的长度一旦确定,不可以改变
        //1.2 声明数组的同时开辟空间
        double[] arr2 = new double[5];
        System.out.println(arr1);
        System.out.println(arr2);
        //1.3 声明数组
        String[] arr3;//只是声明,没有在内存中开辟数组空间
        //System.out.println(arr3);
        //1.4 声明数组的同时赋值 数据类型[] 数组名称=new 数据类型[]{数组值1,数组值2,数组值3,数组值4......数组值n};
        //此时数组的长度由赋值的个数决定
        int[] arr4 = new int[]{1, 2, 3, 4, 5};
        System.out.println(arr4);
        //1.5 声明数组的同时赋值 数据类型[] 数组名称={数组值1,数组值2,数组值3,数组值4......数组值n};
        //此时数组的长度由赋值的个数决定
        double[] arr5 = {1.5, 3.6, 5.8, 4.0};
    }

1.3 内存结构

JMM、JVM的内存结构

第四行代码内存状态

 第5行代码内存状态

 

 1.4 数组实战

1. 读取数组

取出数组中的值:数组名称[下标索引]

public static void main(String[] args) {
        //1、声明数组并开辟空间
        int[] arr1 = new int[4];
        //2、给数组赋值:数组名称[下标索引]=值;下标索引从0开始,最大比数组长度小1
        //数组长度:数组名称.length获取
        //原始赋值方式:
        /*
         * arr1[0]=2;
         * arr1[1]=4;
         * arr1[2]=6;
         * arr1[3]=8;
         */
        //推荐使用循环的方式数组
        for (int i = 0; i < arr1.length; i++) {
            arr1[i] = i + 1;
        }
        //3、使用数组
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
    }

2. 数组的默认值

public static void main(String[] args) {
        //int类型数组元素的默认值是0
        int[] arr1 = new int[4];
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
        //double类型数组元素的默认值是0.0
        double[] arr2 = new double[4];
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]);
        }
        //String类型数组元素的默认值是null
        String[] names = new String[5];
        for (int i = 0; i < names.length; i++) {
            System.out.println(names[i]);
        }
        //char类型数组元素的默认值是0
        char[] genders = new char[5];
        for (int i = 0; i < genders.length; i++) {
            System.out.println((int)genders[i]);
        }
        //boolean类型数组元素的默认值是false
        System.out.println("over");
    }

3. 求极值问题

public static void main(String[] args) {
        //找出指定数组{12,43,-45,567,13}中的最大值和最小值
        int[] arr = {12, 43, -45, 567, 13};
        //定义极值:一定数组元素,一般把第一个元素作为最大值的初始值
        int max = arr[0];//12
        int min = arr[0];
        //循环比对
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
            if (arr[i] < min) {
                min = arr[i];
            }
        }
        System.out.println("最大值是:" + max);
        System.out.println("最小值是:" + min);
    }

1.5 练习

  从键盘读入学生成绩,找出最高分,并输出学生成绩等级。

  • 成绩>=最高分-10 等级为’A’
  • 成绩>=最高分-20 等级为’B’
  • 成绩>=最高分-30 等级为’C’
  • 其余 等级为’D’

  提示:先读入学生人数,根据人数创建int数组,存放学生成绩

 public static void main(String[] args) {
        //1.使用Scanner,读取学生个数
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入学生人数:");
        int number = scanner.nextInt();
        //2.创建数组,存储学生成绩:动态初始化
        int[] scores = new int[number];
        //3.给数组中的元素赋值
        System.out.println("请输入" + number + "个学生成绩:");
        int maxScore = 0;
        for (int i = 0; i < scores.length; i++) {
            scores[i] = scanner.nextInt();
            //4.获取数组中的元素的最大值:最高分
            if (maxScore < scores[i]) {
                maxScore = scores[i];
            }
        }
        //5.根据每个学生成绩与最高分的差值,得到每个学生的等级,并输出等级和成绩
        char level;
        for (int i = 0; i < scores.length; i++) {
            if (maxScore - scores[i] <= 10) {
                level = 'A';
            } else if (maxScore - scores[i] <= 20) {
                level = 'B';
            } else if (maxScore - scores[i] <= 30) {
                level = 'C';
            } else {
                level = 'D';
            }
            System.out.println("student " + i +
                    " score is " + scores[i] + ",grade is " + level);
        }

    }

2 二维数组

2.1 概念

  对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存 在。其实,从数组底层的运行机制来看,其实没有多维数组

1. 语法格式

格式1:

int[][] arr = new int[3][2]
  • 定义了名称为arr的二维数组
  • 二维数组中有3个一维数组
  • 每一个一维数组中有2个元素
  • 一维数组的名称分别为arr[0], arr[1], arr[2]
  • 给第一个一维数组1脚标位赋值为78写法是: arr[0][1] = 78

格式2:

int[][] arr = new int[3][];
  • 二维数组中有3个一维数组个一维数组都是。
  • 每默认初始化值null (注意:区别于格式1)
  • 可以对这个三个一维数组分别进行初始化 arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];

注: int[][] arr = new int[][3] 非法

格式3:

int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}};
  • 定义一个名称为arr的二维数组,二维数组中有三个一维数组
  • 每一个一维数组中具体元素也都已初始化 第一个一维数组 arr[0] = {3,8,2};
  • 第二个一维数组 arr[1] = {2,7};
  • 第三个一维数组 arr[2] = {9,0,1,6};
  • 第三个一维数组的长度表示方式:arr[2].length;

2.2 二维数组的使用

1. 方式1:

int[][] arr1 = new int[3][2];        
arr1[0][1] = 3;

 2. 方式2:

//方式2

        int[][] arr2 = new int[3][];
        arr2[0] = new int[3];
        arr2[1] = new int[4];
        arr2[0][1] = 3;

 3. 方式3:

public static void main(String[] args) {
        //方式3
        int[][] arr2 = new int[][]{{3,8,2},{2,7}, {9,0,1,6}};
        //取值
        for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j < arr2[i].length; j++) {
                System.out.println(arr2[i][j]);
           }
            System.out.println("------------------");
       }
   }

 2.3 内存结构

 

 

2.4 练习

  • 基本都跟循环打交道;一维数组数组一重循环;2维数组数组2重循环;
  • 基本离不开坐标问题;一维数组一个下标索引;二维数组一定就是两个坐标(横纵坐标)
public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        //1、计算3个班级所有学生的平均分:每个班级有n个人,要求先输出各个班级的自己的平均分

        double[][] score = new double[3][];//列数省略,需要自己去开辟空间

        for (int i = 0; i < score.length; i++) {
            double sum = 0;
            System.out.print("请输入第" + (i + 1) + "个班级的学生人数:");
            int num = input.nextInt();
            score[i] = new double[num];//不开空间默认null,会报出NullPointerException异常

            //System.out.println(score[i]);

            for (int j = 0; j < num; j++) {
                System.out.print("请输入第" + (j + 1) + "个同学的成绩:");
                score[i][j] = input.nextDouble();
                sum += score[i][j];
            }
            System.out.println("第"+ (i + 1) +"个班级的平均分是:" + sum / num);
        }


    }

3 数组中常见算法

3.1 二分查找

  数组的复制、反转、查找(线性查找、二分法查找)

public static void main(String[] args) {

        String[] arr = new String[]{"JJ", "DD", "MM", "BB", "GG", "AA"};

        //数组的复制(区别于数组变量的赋值:arr1 = arr)
        String[] arr1 = new String[arr.length];
        for (int i = 0; i < arr1.length; i++) {
            arr1[i] = arr[i];
        }

        //数组的反转
        // for(int i = 0,j = arr.length - 1;i < j;i++,j--){
        // String temp = arr[i];
        // arr[i] = arr[j];
        // arr[j] = temp;
        // }

        //遍历
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
        System.out.println();

  

//查找(或搜索)
        //线性查找:
        String dest = "BB";
        dest = "CC";
        boolean isFlag = true;
        for (int i = 0; i < arr.length; i++) {
            if (dest.equals(arr[i])) {
                System.out.println("找到了指定的元素,位置为:" + i);
                isFlag = false;
                break;
            }
        }
        if (isFlag) {
            System.out.println("很遗憾,没有找到的啦!");
        }

        //二分法查找:(熟悉)
        //前提:所要查找的数组必须有序。
        int[] arr2 = new int[]{-98, -34, 2, 34, 54, 66, 79, 105, 210, 333};
        int dest1 = -34;
        dest1 = 35;
        int head = 0;//初始的首索引
        int end = arr2.length - 1;//初始的末索引
        boolean isFlag1 = true;
        while (head <= end) {
            int middle = (head + end) / 2;
            if (dest1 == arr2[middle]) {
                System.out.println("找到了指定的元素,位置为:" + middle);
                isFlag1 = false;
                break;
            } else if (arr2[middle] > dest1) {
                end = middle - 1;
            } else {//arr2[middle] < dest1

                head = middle + 1;
            }
        }

        if (isFlag1) {
            System.out.println("很遗憾,没有找到的啦!");
        }
  }

 3.2 排序算法

衡量排序算法的优劣:

  • 时间复杂度:分析关键字的比较次数和记录的移动次数
  • 空间复杂度:分析排序算法中需要多少辅助内存
  • 稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算 法是稳定的。

3.3 冒泡排序

  重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

 public static void main(String[] args) {

            int[] arr = new int[]{43,32,76,-98,0,64,33,-21,32,99};

            //冒泡排序
            for (int i = 0; i < arr.length - 1; i++) {
                for (int j = 0; j < arr.length - 1 -i; j++) {
                    if (arr[j] > arr[j + 1]){
                        int temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }

            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + "\t");
            }

        }

3.4 Arrys工具类

public static void main(String[] args) {
        //1.boolean equals(int[] a,int[] b):判断两个数组是否相等。
        int[] arr1 = new int[]{1, 2, 3, 4};
        int[] arr2 = new int[]{1, 2, 3, 4};
        boolean isEquals = Arrays.equals(arr1, arr2);
        System.out.println(isEquals);

        //2.String toString(int[] a):输出数组信息。
        System.out.println(Arrays.toString(arr1));

        //3.void fill(int[] a,int val):将指定值填充到数组之中。
        Arrays.fill(arr1, 10);
        System.out.println(Arrays.toString(arr1));

        //4.void sort(int[] a):对数组进行排序。
        Arrays.sort(arr2);
        System.out.println(Arrays.toString(arr2));

        //5.int binarySearch(int[] a,int key)
        int[] arr3 = new int[]{-98, -34, 2, 34, 54, 66, 79, 105, 210, 333};
        int index = Arrays.binarySearch(arr3, 210);
        if (index >= 0) {
            System.out.println(index);
        } else {
            System.out.println("未找到");
        }
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值