数组的个人理解笔记

数组的基本概念

在前面的课程当中,我们在计算机的内存里面声明了很多变量,每个变量都要告知它的数据类型,然后给它起一个变量名。

假如,我要输入和统计全班同学的成绩,那么就要声明53个变量;全校呢?今年高考呢?这个时候你连起名字都成为了一件繁琐且辛苦的工作量。

而计算机本身的特点就是处理批量数据的,所以它一定有更简单的方式。这种方式叫做集合

集合这个概念就是把批量数据集中合并在一起,然后起一个统一的名字,进行统一的操作。

当然,这些批量数据放在一起,就存在一个如何排列的问题。如果有同学在大学当中学过相关专业,就应该知道有一门专门课程叫做“数据结构”。

数组 是 集合当中的一种,且是最简单也是最原始的一种。它是由大部分编程语言天生在语法当中自带的,无需做任何额外的设计。

数组的排列有如下3个特点:

1、只能是同一数据类型的元素放在一起;
2、数组元素是在连续内存地址空间中依次存放的;
3、数组空间一旦确定,不能改变。

当然,这3个特点,也是数组的3个缺点。这也就是为什么,到了分班以后我们学习第3门课程中的《集合框架》,那里我们将看到各种各样的先人封装好的集合类型,它们分别在底层实现了各种数据结构。但,这是后话。

总之, 大家可以把数组这种数据类型看成是一个容器,然后在它里面存放多个元素。这些元素无需单独命名,使用数组的统一命名就可以操作访问。这些元素是同一数据类型的,且连续空间存放,空间大小确定之后不可变

数组的语法

1、数组在本质上是一种数据类型,而且是属于引用数据类型;

数组类型的书写方式是:
元素类型[]
所以:
int[] — 表明这是一个int数组,里面的每个元素是int类型的;

char[] — char数组,里面每个元素是一个char类型

2、数组变量的声明。
在Java中所有变量声明的语法是统一的规则:数据类型 变量名;

int a;
double d;
String str;
int[] array;
char[] cArray;

历史遗留语法:
在Java产生之初,为了吸引C程序员转型Java,它在数组的声明语法中保留了C语言的书写方式。它是: 元素数据类型 变量[];

int array[];
double d[];
String str[];

这种写法目前已经很少在Java程序员当中看到了,但是如果你这样写也是对的。

3、数组初始化语法
3-1、初始化的时候只分配数组空间大小;
语法:
数组变量 = new 元素类型[元素个数];

3-2、初始化的时候直接罗列元素;

数组变量 = {元素1,元素2,元素3…};

4、数组的内存实现
数组本身是引用数据类型,所以数组元素不是放在数组变量中的,而是放在另一个连续空间中,然后把该空间的引用存放在数组变量当中的。

真正的数组连续空间(我们把它叫做数组对象),这个空间中的值根据你使用的不同的初始化语法,是有差异的。
1、如果使用的是new的语法,那么它会根据你指定的长度和元素类型划分空间大小,然后每个元素自动进行初始化。初始化的规则是:
基本数据类型元素初始化为0;
引用数据类型元素初始化为null。
2、如果使用的{}指定值的方式,那么数组的大小就是你在括号当中指定了几个元素,顺序保持不变,然后在给每个元素赋上你指定的值。

数组元素的使用语法

由于整个数组只有一个名字,所以如果要访问这个数组里面的某一个元素,那么我们需要告知,我们要用哪个数组,以及是该数组中的第几个元素。
而第几个元素有一个专业称呼,叫做“下标”。那么数组中每个元素的下标是这个数组一生成以后就自动生成且固定的。它的顺序是按元素排列的顺序,从0开始,依次类推,那么最大下标就应该是这个数组的长度-1。

那么,访问的语法:
数组名[下标]

所以在这种情况下,我们就可以利用数组名+下标的方式访问里面的每一个元素了。

注意:
1、下标是从0开始的;
2、下标是到数组长度-1结束的;
3、如果你给出的下标不满足这个条件,那么编译不会报错,而是运行报错!!!

为什么在编译期不会报错呢?而是要等到运行期?
编译期做的动作是把我们的源文件(.java)文件翻译成字节码文件(.class)文件。在这个过程当中,程序是没有运行的,也就是说这个时候不会产生数组,也不会到空间中去找这个元素,只是做了一个语法的检查。
由于数组元素的语法是:数组名[下标]。那么它只要检查到这个数组名之前的代码中有声明,然后这个下标确实是一个数字,就够了。所以,如果你书写下标越界了,它是不会检查到的。
但当程序运行起来以后,真正执行到这句代码的时候,它就会通过这个下标到空间中去找这个元素,这个时候才发现找不到,因此这个时候才会报错。
而运行期报错,目前我们看到的效果就是,我们的程序直接被中断执行,然后把报错信息打印在控制台上。

各位,以后这个报错信息会伴随你们整个编程生涯。我们后面也有专门的章节要学习解决运行时异常的手段和技术。

数组的常规操作

1、声明一个数组,然后分配空间大小;

2、往数组里面每个位置放入元素;
你只需要用数组名[下标]的方式即可,你可以认为这就是数组里面某个元素的元素名。

3、从数组里面指定位置取出元素的数据。

4、在数组的所有操作中,最基本的一个操作就是把数组里面的每一个元素单独取出来,操作一次,这个叫做“数组的遍历”。

扩展知识点
直接打印数组变量的效果是 — [I@4617c264
这个字串,是由@符号分隔开的两个信息。
左边是 — 这个变量的数据类型 — [I — 这是说明它是一个int[]
右边是 — 存放在这个变量当中的引用值,只不过它是用16进制给我们展现的
@符号的英文是at这个单词的缩写,at是"在"的意思
连起来 — int[] 在 后面4617c264这个引用位置

0 1 2 3 4 5 6 7 8 9 a b c d e f 10
二进制 10 — 2 110 — 12^2 + 12^1 + 02^0
八进制 10 — 8 170 — 1
8^2 + 78^1 + 08^0
十进制 10 — 10
十六进制 10 — 16 c264 — 1216^3 + 216^2 + 616^1 + 416^0

细节:
数组自带一个常量叫做length,可以直接获取该数组的长度,而最大下标就是这个length值-1。请大家在遍历数组的时候尽量使用这个length来判断下标的结束。

数组的应用

1、存放批量数据,然后进行各种遍历操作;

2、从数组中进行元素的查找
扩展API: 字符串拥有一个叫做toCharArray()的方法,可以把这个字符串的内容转换成一个char[]。

3、数组扩容
比如:在一个已知的数组{1,2,3}中,增加一个元素4。

4、数组缩容
缩容其实与扩容是一样的,只不过是申明一个新的更小的数组。

5、关联数组的对应
比如:请输入5个同学的成绩 以及 姓名,打印出最高分的人的名字。
很明显,这个时候我们只能声明两个数组,一个用来存姓名的String[],一个用来存成绩的int[]。

然后,这两个数组是关联的,我们在设计上关联是靠下标来对应的。

6、数组排序
排序本身是一个纯算法的问题,有各种各样的排序算法。其实先人已经写好了排序的API,在以后的代码运用中,我们往往不会自己去写排序,而是调用就可以了。
但是,作为程序员至少还是要掌握一种排序算法防身。我们在课堂上给大家介绍的是冒泡排序

多维数组

在前面的讲解中,我们看到数组中所有的元素数据都是排列在一起的,用一个下标来区分它们。那么,这样的数组叫做“一维数组”。

多维数组当然就是数组里面的每个元素要用到多个下标才能指定。

用两个下标的叫“二维数组”,三个下标的叫“三维数组”,n个下标的叫“N维数组”。

只要能够搞定从一维数组到二维数组(无论是语法,还是内存)的过渡,那么就可以同样的规则搞定三维,四维,直到N维。同时在我们的日常使用中,你们最多也就是三维。

二维数组

声明语法:
元素类型[][] 数组名;

比如:
int[][] array;

初始化语法1:
数组名 = new 元素类型[行数][列数];

比如:
array = new int[3][3];

初始化语法2:
数组名 = { {1,3,5},{2,4,6} };

我们如何解读这个语法呢?
记住,所有的二维数组在本质上就是一个一维数组,只不过它的每个元素又是一个一维数组。

内存情况:
int[][] array = new int[3][3];


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部