Java笔记——进阶Java——Java数组

目录

一、数组的概念与使用

1、概念

2、定义

3、使用

二、数组的遍历与默认值

1、遍历

2、默认值

三、数组的高级应用

1、扩容

2、插入

3、排序

四、拓展与练习

1、小拓展

2、机试题


一、数组的概念与使用

1、概念

数组是一个有序的元素序列,是用于储存多个相同类型数据的集合。

为什么用数组

在某些情况下,虽然可以使用单个变量来存储信息,但是如果需要存储的信息较多(例如存储 50 名学生的成绩),这时再依次创建变量声明并赋值就显得非常麻烦。

随着处理的信息量越来越大,工作也就越来越烦琐,这时可以使用数组或集合来存储信息。通过使用数组,可以在很大程度上缩短和简化程序代码,从而提高应用程序的效率。

那什么是数组呢

数组是一种最简单的复合数据类型,它是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和不同的下标来确定数组中唯一的元素。

在下图中,放香烟的盒子是不是就是放香烟的,放水彩笔的盒子就是放水彩笔的,你不能说在水彩笔的盒子里放香烟是吧;在数组中就是同一个数组中存放的值必须是同一种类型的,再比如放香烟的盒子一开始只能放五条香烟,你能放下第6个吗,盒子就那么大;所以在数组中也是一样,数组一但确定长度大小就不可改变,存放的值不可大于数组创建时的长度。

数组特性

 1)、一致性:数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。(和变量一样,整数类型数组存的值必须是整数类型的,String类型必须是String类型的...)

2)、有序性:数组是一个连续的存储空间,数组中的元素是有序的。

3)、不可变性:数组一旦初始化,则长度(数组中元素的个数)不可变。

2、定义

语法1:(先声明,后指定空间长度)

数据类型[] 数组名;

数组名 = new(中文意思:新的) 数据类型[长度];

语法2:(声明一个数组并指定空间长度)

数据类型[] 数组名 = new 数据类型[长度];

语法3:(声明一个数组并赋值,值的个数就相当于长度)

数据类型[] 数组名 = new 数据类型[]{值1,值2,值3,...};

语法4:(声明一个数组并赋值,这个更简单)

数据类型[] 数组名 = {值1,值2,值3,...};

这么多的声明方式都可以,只要符合你的需求即可

3、使用

上面洋洋洒洒的说了好几种声明方式,但是到现在还不知道怎么使用数组呢。我们想要使用数组,首先要知道在内存中它是以什么样的形式存储的。

小总结

1)、数组中的每个数据格被称为数组元素

2)、对每个元素赋值或取值的操作被称为:元素访问

3)、访问元素时,需要用到下标(下标从0开始,依次加1,自动生成)

        我们可以这样想,将一节火车车厢看成一个数组,车厢中的位置就对应每个数组元素,车厢中的座位号就对应数组的下标

当我们想找到自己的座位,是不是要先确定是否是此车厢,再在此车厢中找我们的座位号,就可以确定我们在哪坐着。

在数组中的元素也是这样的,如下图

注意:数组元素下标是从0开始叠加的,数组元素下标最大值永远是数组长度减一,比如定义一个长度为5的数组,那么它的最大下标就是4,如果访问元素下标超出或等于数组长度时,则会报错。

二、数组的遍历与默认值

1、遍历

遍历:从头到位,逐一对数组的每个元素进行访问

我们先通过普通方式尝试给一个double类型的数组赋上5个学生的成绩并且打印出来

如上图所示,我们发现这种方式并没有比直接声明变量来的简单,并且这几步操作都存在重复形,唯一变得值就是在访问数组元素时的下标变换;既然存在重复操作,并且其下标变化也是递增,那么我们可不可以使用循环来操作呢?如下图

那么这时候又有问题了,在上图中我们可以确定数组长度是5,但是在很多时候,我们其实并不确定数组长度,那怎么办呢?

在java中数组中提供了一个名为length(中文意思:长度)的属性,可以通过数组名点这个属性直接获取到该数组的长度,如下图所示

既然这样我们是不是可以结合之前学到的从控制台录入信息,让之前那段代码更灵活一些呢。

2、默认值

数组在声明并分配空间时,即使不赋值也可以遍历输出数组信息。

下面来看看各种数据类型的默认值都是什么(注意:引用类型的数组其默认值都是null(中文意思:空的))

注意:在判断char数组与String数组是否为空时是不一样的,如下图

总的来说,数组具有以下特点:

1)、数值数组元素的默认值为 0,字符数组元素为空,而引用元素的默认值为 null。

2)、数组的索引从 0 开始,如果数组有 n 个元素,那么数组的索引是从 0 到(n-1)。

3)、数组元素可以是任何类型,包括数组类型。

三、数组的高级应用

1、扩容

注意:在创建数组时,必须规定数组长度,不管你是直接定义长度还是直接赋值后得到值的个数,一旦创建其长度不可改变。(这里的改变指的是在程序运行中不可改变)

那如果有时候的确需要扩容呢,必须要增加一下长度呢?

思路就是创建一个大于原数组长度的新数组,然后将原数组中的值复制到新数组中,最后在去使用新的数组,在此过程中原数组的长度并没有发生改变。

第一种实现方式,自己手写for循环进行复制扩容

第二种实现方式,Java中是有提供此类方法的

格式(此方法无需导包)

System.arraycopy(原数组,原数组起始下标,新数组,新数组起始下标,原数组长度);

第三种实现方式,比较简单(因为此方法是在util包下的Arrays类中所以需要导包)

格式:

先导包:import java.util.Arrays;

Arrays.copyOf(原数组,新数组长度)

在实际应用中根据自己的需求来选择自己到底使用那个,各有各的好处

2、插入

很多情况下数组的值都不是直接定义好的,我们需要去给数组插入一个值

比如我现在定义了一个长度为5的存储学生姓名的数组,但是我一开始并不知道要录谁,我想等学生来了再录怎么办呢?

虽然成功的将新来的学生,王五录入到了系统,但是它却将后续为null的位置全部占了,显然这不是我们想要的。我们是否还能记得之前提到的break关键字呢,并且我只想显示已经录入系统的学生,不想将空值展示出来。

我们来将代码稍微修改一下,改成可以接收控制台录入的方式,并且让其可以循环录入,直到数组值赋满为止。

可是我想指定一个插入位置并且将其余值向后移,怎么办呢?

根据上图我们知道要想使数组进行后移,就需要数组中的有效元素个数,其次还要有一个需要插入下标的位置。

我们将其改成从控制台录入的方式操作

注意:插入的下标不能大于有效个数比如:我有效个数为3,那你插入的下标就不能是4,这和数组大小无关,是违反了数组的有序规定,此操作是无法执行的。

可是我们常说程序要有很高的灵活度与可扩展型,一个班级本来只有五个学生,可是后来我要扩大学生,我要存10个、20个甚至更多怎么办呢,结合之前学过的数组扩容来实现一下吧。

上图中不是改变了数组长度,而是将新数组的地址赋给了scores,而旧数组还在,只是将原变量中指向旧数组的地址,改成了指向新数组的地址。

3、排序

实现了插入,可是录入的成绩有高有低,如果我想对数组中的成绩进行升序或降序操作怎么办呢

有多种方式(其实都大同小异)

第一种:冒泡排序

规则:将数组中相邻的两个值做比较满足条件则交换,不满足进行下一次相邻比较,其先在右侧确定一个值。

如上图所示,当进行冒泡降序时,会将下标0的值与下标1的值比较,下标1如果大于下标0则将下标1的值给下标0,下标0的值给下标1,然后在比较下标1和下标2的值,如果下标2的值小于下标1的值则不做换位处理,在对下标2和下标3做判断...........当判断完成后,是不是整个数组会将最小值放在右边呢,然后再对数组进行第二次循环判断,这时候会将倒数第二位的值确定下来,依次类推,我们就可以根据这样的规律来编写代码。

第二种选择排序:

规则:和选冒泡排序不同,选择排序是取一个固定下标值来和所有的值进行比较,其会在数组左边先确定一个值。

如上图所示:每轮取一个固定值去和所有的值比较,会在其位置上得到一个准确的值,根据这样的规律编写如下代码。

第三种,Java提供了一个方法,非常简单

先导包import java.util.Arrays;

在调用sort(需要排序的数组)方法

不过有时候我就是想要降序呢,还有办法的,实现一次数组倒置即可

四、拓展与练习

1、小拓展

其实数组中还存在一种二维数组概念以及多维数组概念

即:一维数组中的一维数组;数组中的元素,还是数组

比如当我们要去查一个表格中的单元格时,需要两个下标,一个为行,一个为列,二维数组相当于一个多行多列的表格

定义:

数据类型[][] 数组名 = new 数据类型 [长度] [长度];

存取值方式:

数组名[数组下标][元素下标] = 具体值;

具体操作方式

其实二维数组刚好和双重循环对应上了,可以更简便的取值,赋值;

2、机试题

1)、现某个班级有10名学生,需录入相关成绩信息并计算该班级成绩的平均分及其最高分数与最小分数相差多少,最后进行降序排序。

2)、现某班级有5名学生,来个一个插班生,在不换数组名和不覆盖别人时,将该值插入数组中指定下标位置。

3)、对一组”jkals”,”pwlqx”,”hmnqr”,”gvfbz”,”pwtyi”字符串进行排序,要求每串字符本身都要排序如”cdba”,排序后为”abcd”,并且需要其每个字符串的首字母也需要进行排序如”cds”,”axc”排序后的结果为”acx”,”cds”。

提供两个方法

1)、char[] 数组名 = String类型数组名.toCharArray(),可将字符串类型数组转换成单个字符类型;

2)、字符串类型数组名 = new String(传入char类型数组名),可将字符类型转换成字符串类型 );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值