Java数组基础之高效存储数据
Posted Hdparm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java数组基础之高效存储数据相关的知识,希望对你有一定的参考价值。
前言关于数组类: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、多个相同类型数据如何高效存储呢?
既然相同类型数据可以形成一个组,叫数组,那么数组怎么存呢?一定有办法能够高效方便的存储,这就涉及到为数组元素分配空间:
代码实战:
一旦定义数组,就代表我们划分一块空间,一块空间就不会让他空着,这也叫静态初始化,会使用初始化一些简单的东西。方括号内划分数量称为元素个数,读作有几个元素。
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得到数组的下一个元素。
以上是关于Java数组基础之高效存储数据的主要内容,如果未能解决你的问题,请参考以下文章