数组的定义、声明、初始化、遍历、冒泡排序

数组

什么是数组?
数组是存放数据长度固定的容器,并且其数据类型也是一致的。

怎么声明数组?

    下面这个就是声明数组的例子
    int[] arr;
    int 数组的数据类型,数组中要存储什么类型的数据
    [] 代表它是一个数组
    arr 数组的名字,自己定义的

数组怎么声明并初始化?


这里有三个方法:

方式一 静态初始化

    数组的数据类型[] 数组名 = new 数组的数据类型[]{元素1,元素2,元素3...};
    例:
    int[] arr0 = new int[]{2,4,6,8};
    这个数组有四个元素  所以它的长度为4

方式二 隐式初始化

    数组的数据类型[] 数组名 = {元素1,元素2,元素3...}
    例:
    double[] arr1 = {2.2,3.3,4.4};

方式三 动态初始化

数组的数据类型[] 数组名 = new 数组的数据类型[长度];
    数组名[下标] = 值;
    [长度]:数组的长度,可以存放多少个元素
    这里明确一个概念,数组的下标是从0开始计算的
    例:
    int[] arr2 = new int[3];//[3]代表这个数组可以存放3个元素
    arr[0] = 2;//[0]代表数组的第1个数据  将2存进去到数组第1个位置
    arr[1] = 4;//[1]代表数组的第2个数据    将4存进去到数组第2个位置
    arr[2] = 6;//[2]代表数组的第3个数据  将6存进去到数组第3个位置

学会初始化和声明数组了,那么,要怎么样才可以输出数组呢?

我们访问数组一般都是通过下标(索引)来查找的

比如:   

int[] arr = {3,6,9,12,15};
    //我们用下标来找12,12的下标是多少呢,我们数组的下标都是自动从0开始的编号,
    //所以12的下标为3  我们输出看看对不对
    int res = arr[3];//这里用了一个变量接收了一下  是可以直接输出的
    System.out.println(res);//输出12 

下标 

说到这里,你可能会问,下标是什么?
那么,就要记住了,下标简单来说是一个从0开始的编号,像上面这一段代码,3开始到15,下标依次编号为0、1、2、3、4
输出的时候,int res = arr[3];这里[]里面的下标为3,也就是对应数组中的“12”,所以会输出12

求数组长度

这里数组长度并不长,那如果有一个数组中,有n个数值,我们不知道有多少个呢?那我们怎么样可以知道这个数组有多长?
这里就会用到一个length语法
length怎么用呢?看一下就知道了:

   

//怎么知道数组的长度是多少,我们这里有一个长度属性length
    //使用 数组名.length就可以了 数组最大下标为 数组名.length-1
    int[] arr = {21,33,44,55,66,77};
    int len = arr.length;
    System.out.println(len);//结果为6 正是数组的长度

没错,在数组名后加一个.length就可以了,length就是他的长度,也就是数组里面有多少个数字

如何遍历数组?

什么是遍历?


所谓遍历 (Traversal),是指沿着某条搜索 路线 ,依次对树(或图)中每个节点均做一次访问。
也就是说,数组的遍历就是对数组中的每一个数进行一个输出

我们之前学过循环了,现在用它来遍历数组

    int[] arr = {12,34,65,76,89,99};
    for(int i=0;i<arr.length;i++){
    //数组的下标从0开始的我们将i设为0,arr.length数组的长度
        System.out.println(arr[i]);//正确输出
    }

这里,我们用for循环,来遍历数组,输出数组arr中所有的数

这里,我们可以看到,i<arr.length,也就是说,i<数组arr的长度,不会超出数组最大值,总不能数组中6个数,你却要他输出7个数吧!
因为数组下标,也就是数组中每个数的编号,是从0开始的,所有我们的循环里面i必须为0
输出时,System.out.println(arr[i])中,i会从0依次叠加到数组的最大下标,输出数组的所有数值

这里,提出一个问题:

怎么获取数组中最大的值? 

先给出个思路:
先定义一个变量保存数组索引为0的元素,然后再使用循环遍历数组,在循环中将遍历到的元素和先前定义的变量比大小,如果大于变量,那就将变量交换为当前元素,直到循环结束,就可以找出最大值了

思路看不懂也没什么关系,跟着文章来

    public static void main(String[] args) {
            int[] arr = {3,5,6,8,9,7};
            int max = arr[0];//定义变量,将数组下标为0的元素存入
            for(int i=1;i<arr.length;i++){//因为下标为0的元素存入到变量中了,所以从下标1开始循环
                if(max < arr[i]){//判断当前遍历到的元素是否大于变量max
                    max = arr[i];//如果大于变量max ,那就将当前遍历到的元素替换掉变量原先的值
                }//如果不大于,继续循环
            }
            System.out.println(max);//最后输出结果  结果为:9
        }
    //最大值会求了  那最小值也同样的道理,还有求数组的总和都是一样的思路,大家自己去试一下

这里有一个循环,目的是什么呢?
这里我们可以看到,我们定义了一个空的最大值“max”
目的呢,就是利用循环,让数组中的每一个数值与最大值max(现在还是个空值)比较,利用if选择,在挨个进行比较时,当max这个数,小于数组中的数时,我们就将它与max交换,因为我们要保证max是数组中最大的那个数
挨个比较之后,就会输出max这个最大值了!

下面我们看一下经典的冒泡排序

什么是冒泡排序?

就是使用循环将数组中的元素按从大到小或从小到大排序好

这里,我也给个思路:
这里需要使用到两个for循环,外边的循环每循环一次就可以找到一个最大值
里边的循环每循环一次就产生一次对比,在内层循环中在判断前一个元素是否比后一个元素小,是的话互换位置,最后输出

这个可能会有一点难度,做好准备!

别着急,先看代码

  public static void main(String[] args) {
        int[] arr = {3,11,6,20,9,7};
        //外层循环每循环一次确定一个最大的元素
        for(int i=0;i<arr.length;i++){
            //内层循环每循环一次产生一次对比
            for(int j=0;j<arr.length-1;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");
        }
    }

看到这个长度,哎,肯定不简单哪,不过,我们先来分析分析
我们先来看看第一个循环,也就是外层循环,外层循环每进行一次啊,内层循环就进行一次比较,总共可以进行i<arr.length次比较
这里可能会有点迷糊,不用管他,慢慢摸索就可以
看看第二个循环,这个循环就是最关键的循环,利用if,使数组中前一个数值与后一个数组进行比较,如果,前一个元素比后一个数小,就将他们互换,记住是互换
于是就会出现一个结果,有一个最小的数值被调换到了最后

这里我们看看一张图

我将第一个循环注释掉了
这里我们发现,单纯第二个循环,只能将一个最小数值调换到最后
那么这里就体现了第一个循环(也就是外部循环)的作用,外部循环会让第二个循环,也就是内部循环再次执行
再次内部循环后
于是第二小的数值被调换到倒数第二个位置


外部循环i<arr.length次后,才可以利用内部循环全部将数组中的数从大到小依次排好
最后,利用循环,遍历数组并且输出
去掉外部循环的注释,我们运行一下看看!

这里从大到小排序成功了
那么,从小到大排序同理,相反的算法

不懂的话,慢慢摸索吧!

数组异常与错误

    *数组角标越界异常java.lang.ArrayIndexOutOfBoundsException:
        出现原因:访问了数组中不存在的角标值!
        解决方案:更改角标在范围之内. 
    *空指针异常java.lang.NullPointerException
        **出现原因:代码结构不严谨(某个对象已经为空)
        **解决方案:需要给该对象进行非空判断!


 面试题 

    *数组中有没有length属性,字符串中有没有length属性,集合中有没有length属性:
        **数组中有length属性
        **字符串中没有length属性:String类中有:length();
        **集合中没有length属性:集合中:size();

文章到此结束,不懂可以评论哦!
 

Guess you like

Origin blog.csdn.net/qq_60750453/article/details/120592439