Java SE之基础篇(六)——数组

前言

  上篇文章给大家介绍了循环的两种结构——for和while两种循环。主要包括两种循环的语法以及执行的流程,并通过大量的案例加以说明。其次,又给大家介绍了循环应用中的一些细节,比如while循环的拓展形式do…while 循环以及三种循环结构之间的区别与联系,以及循环的结束和几种死循环的格式。最后文章给大家介绍了Random的基本使用以及应用的场景,通过案例加以说明。本文给大家介绍java中一个重要的知识点——数组。由于数组的知识点较少,所以会给大家介绍一些案例。首先给大家介绍数组的概念。

一、数组基本概念

  数组在我们的日常编程中是很常见的,虽然知识点很小,但是应用还是特别的广泛。其实数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。 常见的数组有如下的两种格式:

  数据类型[] 数组名;例如:int[] arr; 、double[] arr;、char[] arr;
  数据类型 数组名[]:例如:int arr[];、double arr[];、char arr[];

  以上就是数组的基本概念以及相应的数组格式。接下来给大家介绍数组的动态初始化。数组的动态初始化就是只给定数组的长度,由系统给出默认初始化值。其具体的格式为:数据类型[] 数组名 = new 数据类型[数组长度]; 例如:int[] arr = new int[3];。根据其具体数组的动态格式,我们给出相应的相关说明:

  • 等号左边:
    • int:数组的数据类型
    • []:代表这是一个数组
    • arr:代表数组的名称
  • 等号右边:
    • new:为数组开辟内存空间
    • int:数组的数据类型
    • []:代表这是一个数组
    • 3:代表数组的长度
        另外给大家介绍的就是数组中的元素之间的遍历。在这里我们给大家引入索引的概念。每一个存储到数组的元素,都会自动的拥有一个编号,从0开始。这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。其具体的访问格式为数组名[索引];接下来,我们通过一个案例对这个数组的索引做一个说明。相关代码实现如下:
public class ArrayDemo {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[3];
        /*
            左边:
                int:说明数组中的元素类型是int类型
                []:说明这是一个数组
                arr:这是数组的名称
            右边:
                new:为数组申请内存空间
                int:说明数组中的元素类型是int类型
                []:说明这是一个数组
                3:数组长度,其实就是数组中的元素个数
         */

        //输出数组名
        System.out.println(arr); //[I@880ec60

        //输出数组中的元素
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}

  该代码相关执行的结果如下:

  接下来,我们给大家介绍一个较为重要的概念——内存。内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。必须放进内存中才能运行,运行完毕后会清空内存。 Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。 目前我们只需要记住两个内存,分别是:栈内存和堆内存。以下是计算机中常用的组件以及相关的作用:

  数组分为单个数组以及多个数组,首先给大家介绍的就是单个数组。因为概念过于简单,因此,我们直接给出案例,更直观的让大家体会单个数组的情形以及使用的方法;

public class ArrayTest01 {
    
    
    public static void main(String[] args) {
    
    
        //定义一个数组
        int[] arr = new int[3];

        //输出数组名及元素
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        //给数组中的元素赋值
        arr[0] = 100;
        arr[2] = 200;

        //再次输出数组名及元素
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}

  具体的执行结果如下:

  接下来,我们给出多个数组的案例,具体实现如下:

public class ArrayTest02 {
    
    
    public static void main(String[] args) {
    
    
        //定义两个数组
        int[] arr = new int[2];
        int[] arr2 = new int[3];

        //分别输出数组名及元素
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);

        System.out.println(arr2);
        System.out.println(arr2[0]);
        System.out.println(arr2[2]);

        //然后分别给数组中的元素赋值
        arr[1] = 100;
        arr2[0] = 200;
        arr2[2] = 300;

        //分别再次输出数组名及元素
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);

        System.out.println(arr2);
        System.out.println(arr2[0]);
        System.out.println(arr2[2]);
    }
}

  具体的执行结果如下:

  接下来,我们给出多个数组指向相同的时候会发生什么呢?我们以一个案例加以说明,具体如下:

public class ArrayTest03 {
    
    
    public static void main(String[] args) {
    
    
        //定义一个数组
        int[] arr = new int[3];
        arr[0] = 100;
        arr[1] = 200;
        arr[2] = 300;
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        //定义第二个数组指向第一个数组
        int[] arr2 = arr;
        arr2[0] = 111;
        arr2[1] = 222;
        arr2[2] = 333;
        //输出两个数组的名及元素
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr2);
        System.out.println(arr2[0]);
    }
}

  具体的执行结果如下:

二、数组静态初始化

  数组的静态初始化也是一个很重要的知识点。首先我们需要了解的是什么是数组的静态初始化。即在创建数组时,直接将元素确定。其具体的格式为数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};当然也可以简写,我们一般通常将其格式写为:数据类型[] 数组名 = {元素1,元素2,...};我们通过一个案例加以说明,从而让大家更好的了解数组初始化的过程,具体实现如下:

public class ArrayDemo1 {
    
    
    public static void main(String[] args) {
    
    
        //定义数组
        int[] arr = {
    
    1, 2, 3};

        //输出数组名
        System.out.println(arr);

        //输出数组中的元素
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}

  具体的执行结果如下:

  以上就是数组静态初始化的过程;接下来给大家介绍在数组的操作中常见的两个小问题,也是我们在日常的编程中经常遇到的小问题之一——索引越界异常【也就是我们经常说的数组越界——ArrayIndexOutOfBoundsException】以及空指针异常【NullPointerException】。首先我们给大家介绍数组越界的问题。我们首先给大家一个数组越界的案例,让大家清楚在着呢吗情况下会报这个异常错误,具体代码如下:

public class ArrayBoundRange {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[3];
        System.out.println(arr[3]);
    }
}

  具体执行结果如下:

  我们从上图可知,确实程序报数组索引越界的问题。说明我们访问了数组中不存在的索引对应的元素,造成索引越界问题。我们分析代码,看看为什么会出现数组索引越界的问题;我们定义了数组长度为3,索引范围是0~2,但是我们却访问了一个3的索引。程序运行后,将会抛出ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。针对这种数组索引越界的问题,解决方案其实比较简单的,只需要我们将错误的索引修改为正确的索引范围即可
  同理,我们接下来介绍空指针异常的情况。空指针异常顾名思义即:访问的数组已经不再指向堆内存的数据,造成空指针异常。一般情况下:null:空值,引用数据类型的默认值,表示不指向任何有效对象。接下来,我们同样给出一个空指针异常的程序,分析为什么会出现这种情况,具体的代码实现如下:

public class ArrayNullPointerException {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[3];

        //把null赋值给数组
        arr = null;
        System.out.println(arr[0]);
    }
}

  具体执行结果如下:

  上图就是程序报空指针异常的情况。我们分析程序可知:arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出 NullPointerException 空指针异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。因此在遇到这个问题的时候也不必要惊慌,都是小错,只需要将给数组一个真正的堆内存空间引用即可!
  以上就是给大家介绍的在应用数组的时候常见的两种异常——数组越界以及空指针异常,并且给出了相应的解决方案。希望大家以后遇到这种异常的时候知道如何去解决问题,不至于过于紧张,相信大家以后在写代码的过程中一定会遇到这个问题,遇到问题了我们就idea中的debug模式进行调试,从而解决问题即可,没有必要过于恐慌。只有不断的出现问题解决问题,我们的编码能力才会有很大的提升。因此,对于初学者,不要因为有问题就很害怕,出问题是好事,每当你出一个问题,说明你又马上要成长了,当年解决问题的时候,你会觉得成就感十足。因此,大家不要担心出bug,应该喜欢上bug。现在网络资源特别发达,java又是很成熟的,你出现的问题别人一定出现过,因此,遇到问题了去网上找答案,大部分的问题可以找到相应的解决方案。
  接下来,给大家介绍数组中的另一个比较重要的知识点,也是在我们日常生活编码中经常用到的,那就是数组的的遍历。

三、数组的遍历

  数组遍历:就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。当我们将数据存储在数组中,我们一般是通过数组遍历来查看其数组元素的详细内容;我们直接给出案例,让大家有一个更加直观的体会,具体代码如下:

public class ArrayTravel {
    
    
    public static void main(String[] args) {
    
    
        //定义数组
        int[] arr = {
    
    11, 22, 33, 44, 55};
        // 如果不用遍历
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        System.out.println(arr[3]);
        System.out.println(arr[4]);
        System.out.println ("========================");
        //使用通用的遍历格式
        for(int x=0; x<arr.length; x++) {
    
    
            System.out.println(arr[x]);
        }
    }
}

  我们在本代码中通过循环和非循环两种方式遍历输出结果,让大家更直观地体现循环遍历的优越性以及具体使用细节,这里需要我们注意的是:在循环遍历的时候:数组的索引是 0 到 lenght-1 ,可以作为循环的条件出现。具体的执行结果如下:

  至此,数组的知识点全部给大家介绍完毕,最后通过一个相对综合的案例来让大家对数组的相关知识有一个整体的认识:

  需求:最大值获取:从数组的所有元素中找出最大值。
  具体思路
  定义变量,保存数组0索引上的元素
  遍历数组,获取出数组中的每个元素
  将遍历到的元素和保存数组0索引上值的变量进行比较
  如果数组元素的值大于了变量的值,变量记录住新的值
  数组循环遍历结束,变量保存的就是数组中的最大值

  根据上述的思路,我们将其转换成代码,具体实现如下:

public class ArrayMax {
    
    
    public static void main(String[] args) {
    
    
        //定义数组
        int[] arr = {
    
    12, 45, 98, 73, 60};

        //定义一个变量,用于保存最大值
        //取数组中第一个数据作为变量的初始值
        int max = arr[0];

        //与数组中剩余的数据逐个比对,每次比对将最大值保存到变量中
        for(int x=1; x<arr.length; x++) {
    
    
            if(arr[x] > max) {
    
    
                max = arr[x];
            }
        }

        //循环结束后打印变量的值
        System.out.println("max:" + max);

    }
}

  我们在编写代码的时候,将思路又重写了一遍,方便大家理解如何将思路转换成代码的这么一个过程。具体的执行过程如下:

  这就是通过数组遍历实现数组中最大值的实现过程,当然,我们也可以 实现数组的最小值,这个问题就留给大家自己实现,与数组最大值的实现过程是一样的。希望各位读者可以自己动手实现一下,可能你看起来比较简单,但是或许对于初学者来说或许会在编码过程中遇到各种问题。所以,还是希望大家动手实现一下,java乃至计算机本来就是一个动手操作的行业,很多是看是看不会的,必须动手操作才可以的,才能真正掌握一些知识点。

四、知识汇总

  最后,我们将本文介绍的所有知识点通过xmind做一个总结;具体知识点总结如下:

总结

  上篇文章给大家介绍了循环的两种结构——for和while两种循环。主要包括两种循环的语法以及执行的流程,并通过大量的案例加以说明。其次,又给大家介绍了循环应用中的一些细节,比如while循环的拓展形式do…while 循环以及三种循环结构之间的区别与联系,以及循环的结束和几种死循环的格式。最后文章给大家介绍了Random的基本使用以及应用的场景,通过案例加以说明。本文给大家介绍了java中一个重要的知识点——数组。主要包括数组的一些基本概念以及数组的静态初始化,接着又介绍了数组的遍历,并且通过一些案例加以说明。另外又通过两个案例说明数组中常见的两种错误——数组下标越界以及空指针异常,并且分析了出现这两种异常的原因以及解决的具体方案。最后通过一个综合案例给大家体现了数组的综合应用,并且还给大家预留了一个小练习供大家动手练习。为了这个程序的可读性以及健壮性,我们在输入之前都在前面加上一句输出的相关信息,这是为程序的使用者考虑的。我们从现在开始,每写一个程序就要站在用你程序的用户考虑,你得想加入它不懂程序,测试你的这个代码可用性,我们就得给出一些提示信息,这种思维方式对于程序员来说特别的重要,因此需要我们特别的注意,需要我们从现在开始就慢慢培养,这样,我们以后写出来的代码可读性是很高的,才会是一名合格的程序员。这点还请大家多在以后的代码中经常使用!现在的java发展的如火如荼,在开发这块占据着举足轻重的地位。因此,作为计算机行业的一名开发人员,学习java是很有必要的。让我们一起在java的海洋里遨游吧!!!生命不息,奋斗不止,我们每天努力,好好学习,不断提高自己的能力,相信自己一定会学有所获。正如经典所说:“人不负青山,青山定不负人。”让我们一起向未来!加油!!!马上就要春节了,这是春节之前的最后一篇文章了,小编祝大家新春快乐,虎年大吉,代码不出bug!!!心想事成!!!

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324286559&siteId=291194637