前言关于数组类:java.util.Arrays类包含用于排序和搜索数组、比较数组以及填充数组元素的各种静态方法。这些方法对于所有基本数据类型都是重载的。
Java提供了一种数据结构——数组,它存储相同类型元素的固定大小的顺序集合。数组是用来存储数据集合的,但是将数组看作是同类型变量的集合通常更有用。 不是声明单独的变量,比如数字0,数字1,...、和number99,声明一个数组变量,如numbers,并使用numbers[0]、numbers[1]和...,数字[99]代表单个变量。
0x01数组的基本定义
数组是多个相同类型数据的组合。
声明数组的规则化,或者叫声明数组的规则:一共做了两件事情。
- 使用对象的数据类型[Size]创建一个数组;
- 将创建的数组的引用赋给变量。
写出几个有趣的练习题,可以自己改编。
如果我们想同时使用很多个相同类型的数组呢?因为每个数组中数据类型是相同的,所以为了方便,就可以做如下定义:
这样就可以把方括号放在前面,也是他的作用。
0x02、多个相同类型数据如何高效存储呢?
既然相同类型数据可以形成一个组,叫数组,那么数组怎么存呢?一定有办法能够高效方便的存储,这就涉及到为数组元素分配空间:
代码实战:
一旦定义数组,就代表我们划分一块空间,一块空间就不会让他空着,这也叫静态初始化,会使用初始化一些简单的东西。方括号内划分数量称为元素个数,读作有几个元素。
如上分别看基本数据类型和引用数据类型(类是引用数据类型)怎么存储呢?
存储关于基本数据类型:
读作先声明了一个整形数组,划分3个空间,下标为从0~2,3个元素都被初始化为0。
然后分配第一个下标元素的值为3,
然后分配第二个下标元素的值为6,
然后分配第三个下标元素的值为7,分配空间完毕。
存储关于引用数据类型:
读作先声明了一个整形数组,划分3个空间,下标为从0~2,3个元素都被初始化为null。
然后分配第一个下标元素的值为第一个对象实例(MyDate(24,5,1933));
然后分配第二个下标元素的值为第二个对象实例(MyDate(31,5,1433));
然后分配第三个下标元素的值为第三个对象实例(MyDate(30,5,1453)),这样所有的实例都有地方放了啊。
0x03、不写实例的数组是错误的
因为数组只是存储了一个地址,所以是一个引用类型,还是需要实例存在才可以对数组做操作。
不可直接对数组不实例化,但是却声明元素长度指定空间大小
1.不合法写法
因为a需要存储地址,但是因为没有地址可以存储,所以是错误的。
2.合法写法:
因为a只是一个引用,所以这样才是正确的。
0x04、快速赋值
如果我们想快速赋值,不用中间对象来替换,该怎么办呢?直接使用如下:
这样还可以有多少元素自动指定多少空间,规则化的东西,使用大括号来放在赋值后面,即等号右面。
再引用数据类型数组中也是这么写的:
0x05 静态初始化存储什么?
引用是地址,所以用null;
布尔是正误,所以用false;
其他是数字,所以用0。
总共有三种,因为都是不指定,所以都是叫静态初始化。
0x06、高效使用java特殊的数组操作语句:
读作循环数组a中的每一个元素。好处是不用担心下标的起始值和终止值,并且会自动便利数组中所有元素。
相当于既使用了length属性,又使用了下标的等效语句,如下:
上面也称为只读式遍历,不能修改。
0x07、如何快速复制部分数组元素
从下标位置为0的地方开始,复制到从目的数组第0个地方开始,复制source.Length个元素,当然可以修改,加一少一都可以。
快速比较复制数组速度
System.arraycopy() | 效率最高 |
Arrays.copyOf() | 效率次于第二种方法 |
Object.clone() | 效率次于第二种和第三种 |
for循环 | 效率最低 |
后记:Java中的[ ]运算符被预定义为检查数组边界,而且因为不是指针,不能使用指针运算,所以不能通过a加
1得到数组的下一个元素。