JavaSE基础(六)——数组的使用

JavaSE基础(六)——数组的使用

前言

本篇笔记记录数组的相关使用方法以及一些小技巧,可能逻辑性强一些,大家尝试理解,如果这部分理解不了的话,后面的开发就算了吧,哈哈哈。

本篇笔记结论一定要看!!!

数组的使用

循环遍历使用

数组一般使用循环遍历来使用,如下:

int[] arrs = new int[10];
for(int i = 0; i < arrs.length; i ++){
    arrs[i] = i + 1;
}
for(int i = 0; i < arrs.length; i ++){
    System.out.println(arrs[i]);
}
  • 在使用循环遍历数组的时候,要注意数组的长度,避免下标越界异常;

  • 循环的时候,我们可以查找数组的最值操作,具体如下:

int[] arrs = {1,3,4,6,3,2,5,2,3,7,3};
// 设定最大值为数组的第一个元素
int max = arrs[0];
for(int i = 1; i < arrs.length; i ++){
    // 让当前最大值与数组中的元素循环比较,如果发现比现有值大的元素就更改最值;
    if(max < arrs[i]){
        max = arrs[i];
    }
}
// 同样设定最小值为数组的第一个元素
int min = arrs[0];
for(int i = 1; i < arrs.length; i ++){
    // 让当前最大值与数组中的元素循环比较,如果发现比现有值小的元素就更改最值;
    if(min > arrs[i]){
        min = arrs[i];
    }
}
  • 同样我们可以使用for循环的加强形式来操作:
int[] arrs = {1,3,4,6,3,2,5,2,3,7,3};
int max = arrs[0];
for(int arr : arrs){
    if(max > arr){
        max = arr;
    }
}

增强型for循环在使用的时候相当于迭代遍历数组,实际使用时的好处是没有数组下标的干扰,内部已经帮我们对于数组长度等越界判定做好的操作,对于程序员来说,只需要书写对于数组的操作代码即可。而且在执行的时候速度要比普通的for循环更快(增强型for循环,以后会称作官方的forEach)的底层是由由迭代器组成的,至于迭代器是什么会在集合的笔记中进行说明。

数组作为参数

数组作为参数和正常传参是同种情况,不要认为数组内部包含很多元素就觉得麻烦,我们把数组作为一个数据类型来操作即可:

    public static int max(int[] arrs){
        int max = arrs[0];
        for (int arr:arrs
             ) {
            if (max < arr){
                max = arr;
            }
        }
        return max;
    }

    public static void main(String[] args) {
        int[] arrs = {1,5,3,6,4,6,6,3,2,4,5};
        int max = max(arrs);
        System.out.println(max);
    }

多维数组

我们之前一直操作的数组是一维数组,也就是说数据排列在逻辑上是线性的;二维数组相当于在逻辑上吧存储空间做成了一个面,我们通过两个坐标来确定元素位置;多维数组就是增加坐标轴,一般来说多维数组考试中最多为四维,实际应用上可能并没有设计高维数组(数学除外哈)。请看下图:
在这里插入图片描述

在这里插入图片描述

  • 其实从一维到三维数组我们都可以用以前学过的知识来表现出逻辑结构,更高维度的需要用到微积分的概念(数学角度)或空间维度(物理学角度)来分析,在此不过多赘述(其实我也说不明白,哈哈哈);
  • 另外,上面俩图全手绘的,累死我了,各位多多少少给个赞吧,谢谢。
二维数组

二维数组的定义如下:

int[][] arrs = new int[2][2];
// 可以理解为第一个中括号定义了行,第二个中括号定义了列

同样在循环便利的时候就不太一样了,因为在逻辑上我们需要两个坐标来确定数据元素的位置,所以我们先从第一行的第一个元素来遍历,当第一行遍历结束后我们开始遍历第二行,具体如下:

for (int i = 0; i < 2; i ++){
    for (int j = 0; j < 2; j ++){
        // 只是单纯的赋值,这个算式不用管
        arrs[i][j] = i + j + 1;
    }
}

上述程序在运行的时候,我们先从第一行,即行号为0的第一个元素开始遍历,把第一个元素遍历结束后开始遍历第二行,代码懒得解释,自己看一看吧。

其实大家也可以这么理解,就是我们把二维数组给拆分一下,外层数组中存放多个数组(数组中可以存放任何相同数据类型),那么外数组内部的多个子数组便是我们之前学习的一维数组,如图:

在这里插入图片描述

冒泡排序

冒泡排序对于初学者(尤其是刚刚接触这门课的同学)十分不友好,冒泡排序其实就是一个泡泡在水中最终能上浮到哪个位置的算法,具体表现为for循环嵌套以及替换操作.

冒泡排序在排序过程中,比较两个相邻元素的大小,按照我们制定的大小规则来置换两个相邻的元素的位置,直到比较出最大或最小的元素,然后进行下一轮比较。第二轮比较会少执行一次比较操作,因为第一次已经排列出一个最值。

接下来先看代码:

public static void sort(int[] arrs){
    // 置换的临时容器
    int tem = 0;
    // 外层循环判断我们需要比较多少轮,arrs.length-1的作用是防止数组下标越界
    for(int i = 0; i < arrs.length-1; i ++){
        // 内层循环判断大小,交换位置,判定条件中还要 -i 的原因是:每轮判定结束后都会得出一个位置固定的值,这样就会减少一次比较次数
        for(int j = 0; j < arrs.length-i; j ++){
            if(arrs[j + 1] > arrs[j]){
                tem = arrs[j + 1];
                arrs[j + 1] = arrs[j];
                arrs[j] = tem;                
            }
        }
    }
}

首先说明冒泡排序临时置换变量的含义:

之前说过,在Java中我们操作的变量名实际上都是变量的引用,就像C语言指针一样,我们在对变量名指向的实际数据进行算数操作的时候的确是更改了当前数据,但是在直接覆盖赋值的时候相当于让变量名指向了另一个地址空间,这样会导致原数据丢失,所以需要一个临时容器来存放置换的数据。

上面的说法不理解的话我们换一个我在大学时想到的解释说明:

数据就像水一样,杯子就是存放数据的地址空间,离开杯子谁就会撒在地上。现在我们有两个杯子,一个是装有红酒的咖啡杯;另一个是装有咖啡的高脚杯。我们发现水杯和饮品不配套,所以要置换回来,可是液体必须有容器盛放,这个时候我们就可以找一个空杯子,把要其中也被液体倒在空杯子里,这样就留出一个可以装液体的杯子,接下来的操作大家就都会了。

PS:其实当时我和老师解释的是,把其中一杯水含在嘴里,然后把另一杯水倒进空杯子,最后把嘴里的吐在最后一个空杯子中,哈哈哈,有点恶心。

总结

在本篇笔记中,仅记录了数组的使用,然后记录了八大基本排序算法的一种。冒泡排序对于初学者来说真的不会很友好,大家加油吧。

再次强调,数组是一个逻辑概念,它内部可以存放任何相同类型的数据;

虽然有二维数组以及多维数组,我也在上面有图片表示了他们的逻辑结构(注意是逻辑结构),数组实际在计算机中的存储依旧是线性的,不可能开辟一个平面或者立体空间来存放数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值