数组介绍:
1、Java语言中的数组是一种引用数据类型。不属于基本数据类型。数组的父类是Object。
2、数组当中可以存储“基本数据类型”的数据,也可以存储“引用数据类型”的数据。
3、数组因为是引用类型,所以数组对象是堆内存当中。(数组是存储在堆当中的)
4、数组当中如果存储的是“java对象”的话,实际上存储的是对象的“引用(内存地址)”,数组中不能直接存储java对象。
5、数组一旦创建,在java中规定,长度不可变。(数组长度不可变)
6、所有的数组对象都有length属性(java自带的),用来获取数组中元素的个数。
7、所有的数组都是拿“第一个小方框的内存地址”作为整个数组对象的内存地址。(数组中首元素的内存地址作为整个数组对象的内存地址。)
8、数组这种数据结构的优点和缺点是什么?
优点:查询/查找/检索某个下标上的元素时效率极高。可以说是查询效率最高的一个数据结构。
为什么检索效率高?
第一:每一个元素的内存地址在空间存储上是连续的。
第二:每一个元素类型相同,所以占用空间大小一样。
第三:知道第一个元素内存地址,知道每一个元素占用空间的大小,又知道下标,所以通过一个数学表达式就可以计算出某个下标上元素的内存地址。直接通过内存地址定位元素,所以数组的检索效率是最高的。
缺点:
第一:由于为了保证数组中每个元素的内存地址连续,所以在数组上随机删除或者增加元素的时候,效率较低,因为随机增删元素会涉及到后面元素统一向前或者向后位移的操作。
第二:数组不能存储大数据量,因为很难在内存空间上找到一块特别大的连续的内存空间。
注意:对于数组中最后一个元素的增删,是没有效率影响的。
数组语法:
怎么声明/定义一个一维数组?
int[] array1;
double[] array2;
boolean[] array3;
String[] array4;
Object[] array5;
怎么初始化一个一维数组呢?
包括两种方式:静态初始化一维数组,动态初始化一维数组。
静态初始化语法格式:
int[] array = {100, 2100, 300, 55};
动态初始化语法格式:
int[] array = new int[5];
这里的5表示数组的元素个数。初始化一个5个长度的int类型数组,每个元素默认值0
用length去获得数组的长度(元素的个数)
int[] a = {1, 100, 10, 20, 55, 689};
System.out.println("数组中元素的个数" + a.length);//6
关于每个类型的默认值:
数据类型 | 默认值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
double | 0.0 |
boolean | false |
char | \u0000 |
引用数据类型 | null |
当一个方法参数的类型是一个数组时:
当一个方法上,参数的类型是一个数组的时候。
在传参时直接将数组名字传进去即可:
public static void main(String args[]){
int[] x = {1,2,3,4};
printArray(x);
}
public static void printArray(int[] array){
for(int i = 0; i < array.length; i++){
System.out.println(array[i]);
}
}
main方法上面的“String[] args”解释:
JVM调用main方法的时候,会自动传一个String数组过来。
首先我们来看看这个数组的长度是多少:
System.out.println("JVM给传递过来的String数组参数,它这个数组的长度是?" + args.length);
得到的结果是0
通过测试得出:args不是null。
这个数组什么时候里面会有值呢?
其实这个数组是留给用户的,用户可以在控制台上输入参数,这个参数自动会被转换为“String[] args”
如何在IDEA中去输入这个参数呢?如下图:
可以看到,我们在这里输入了abc,那么此时的args数组长度就为1且args[0]就是abc了。
一维数组的扩容和拷贝
在java开发中,数组长度一旦确定不可变,那么数组满了怎么办?
数组满了,需要扩容。
java中对数组的扩容是:
先新建一个大容量的数组,然后将小容量数组中的数据一个一个拷贝到大数组当中。
JAVA为我们提供了一个arraycopy的方法来对数组进行拷贝。
System.arraycopy(5个参数);
具体是哪五个参数?如下是arraycopy的源代码
public static native void arraycopy(Object src, int srcPos,Object dest, int destPos,int length);
第一个src是拷贝源(从这个数组中拷贝)
第二个srcPos是拷贝源中的起点(从下标为几的位置开始拷贝)
第三个dest是拷贝目标(拷贝到这个目标数组上)
第四个destPos是拷贝目标中的起点(从下标为几的地方开始接受拷贝)
第五个length是拷贝的长度(从拷贝源src的srcPos开始向后拷贝length长度的内容)
如下代码完成了对一个数组的拷贝:
// 拷贝源(从这个数组中拷贝)
int[] src = {1, 11, 22, 3, 4};
// 拷贝目标(拷贝到这个目标数组上)
int[] dest = new int[20]; // 动态初始化一个长度为20的数组,每一个元素默认值0
System.arraycopy(src, 0, dest, 0, src.length);
这就完成了吧src数组中的全部内容拷贝到dest中