前言关于数组类:java.util.Arrays类包含用于排序和搜索数组、比较数组以及填充数组元素的各种静态方法。这些方法对于所有基本数据类型都是重载的。

Java提供了一种数据结构——数组,它存储相同类型元素的固定大小的顺序集合。数组是用来存储数据集合的,但是将数组看作是同类型变量的集合通常更有用。 不是声明单独的变量,比如数字0,数字1,...、和number99,声明一个数组变量,如numbers,并使用numbers[0]、numbers[1]和...,数字[99]代表单个变量。

0x01数组的基本定义

数组是多个相同类型数据的组合。

声明数组的规则化,或者叫声明数组的规则:一共做了两件事情。

  • 使用对象的数据类型[Size]创建一个数组;
  • 将创建的数组的引用赋给变量。
基本数据类型+方括号+空格+变量名+分号
类名+方括号+空格+变量名+分号
|
|
|
基本数据类型+方括号+空格+变量名=new+空格+基本数据类型[长度指定]+分号
类名+方括号+空格+变量名+分号=new+空格+引用数据类型[长度指定]+分号

写出几个有趣的练习题,可以自己改编。

int[] a;
double []b;
Mydate []c;

如果我们想同时使用很多个相同类型的数组呢?因为每个数组中数据类型是相同的,所以为了方便,就可以做如下定义:

int[] a,b,c,d;

这样就可以把方括号放在前面,也是他的作用。

0x02、多个相同类型数据如何高效存储呢?

既然相同类型数据可以形成一个组,叫数组,那么数组怎么存呢?一定有办法能够高效方便的存储,这就涉及到为数组元素分配空间:

Java数组基础之高效存储数据_#Java基础#

代码实战:

一旦定义数组,就代表我们划分一块空间,一块空间就不会让他空着,这也叫静态初始化,会使用初始化一些简单的东西。方括号内划分数量称为元素个数,读作有几个元素。

int[] a=new int[3];
a[0]=3;
a[1]=6;
a[2]=7;

MyDate[] dates=new MyDate[3];
datas[0]=new MyDate(24,5,1933);
datas[1]=new MyDate(31,5,1433);
datas[2]=new MyDate(30,5,1453);

如上分别看基本数据类型和引用数据类型(类是引用数据类型)怎么存储呢?

存储关于基本数据类型:

读作先声明了一个整形数组,划分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.不合法写法

int a[8];

因为a需要存储地址,但是因为没有地址可以存储,所以是错误的。

2.合法写法:

int[] a=new int[8];

因为a只是一个引用,所以这样才是正确的。

0x04、快速赋值

如果我们想快速赋值,不用中间对象来替换,该怎么办呢?直接使用如下:

int[] a= {3,5,6};

int[] a= new int[]{2,46,5};

这样还可以有多少元素自动指定多少空间,规则化的东西,使用大括号来放在赋值后面,即等号右面。

再引用数据类型数组中也是这么写的:

MyDate[] dates={
new MyDate(4,2,4331),
new MyDate(4,2,1331),
new MyDate(4,2,3331),
}

0x05 静态初始化存储什么?

引用是地址,所以用null;

布尔是正误,所以用false;

其他是数字,所以用0。

总共有三种,因为都是不指定,所以都是叫静态初始化。

int[] a=new int[1888];
//a[1887]=0

0x06、高效使用java特殊的数组操作语句:

读作循环数组a中的每一个元素。好处是不用担心下标的起始值和终止值,并且会自动便利数组中所有元素。

for(int element : a)
System.out.println(element):

相当于既使用了length属性,又使用了下标的等效语句,如下:

int[] ages=new int[10];
for (int i=0;i<ages.length;i++)
{
System.out.println(ages[i]);
}

上面也称为只读式遍历,不能修改。

0x07、如何快速复制部分数组元素

从下标位置为0的地方开始,复制到从目的数组第0个地方开始,复制source.Length个元素,当然可以修改,加一少一都可以。

int[] source={1,3,5};
|
|
|
int[] destination={1,43,43,432,2,4,2,23,2};
|
|
|
System.arraycopy(source,2,destination,0,source.Length);

快速比较复制数组速度

System.arraycopy()

效率最高

Arrays.copyOf()

效率次于第二种方法

Object.clone()

效率次于第二种和第三种

for循环

效率最低


后记:Java中的[ ]运算符被预定义为检查数组边界,而且因为不是指针,不能使用指针运算,所以不能通过a加

1得到数组的下一个元素。