java语言中的数组是一种引用数据类型,其父类为Object
数组实际上是一个容器,可以同时容纳多个元素,数组是数据的集合
数组可以存储基本数据类型以及引用数据类型,因为其作为引用数据类型,因此存储在堆栈
如果数组中存储java对象,实际上是存储引用,不直接存储对象
数组一旦定义,数组结构不可变
数组的分类包括:一维数组,二维数组,多维数组
一维数字常用,二维及其以上较少
所有数组对象都有length属性,用来获取数据中元素个数,a.length
Java中的数组类型统一,如int类型的数组只能存储int类型的数据,person类型的数组只能存储person类型
数据在存储元素时,空间地址是连续的,规则的,有规则挨着排列
数组是最简单的元素结构,所有的数组都是拿第一个小方框的地址作为数组的内存地址(首元素地址作为内存地址)
数组每个元素都带有下表,第一个元素的下标是0,最后一个元素的下标是length-1,下标非常重要
我们对数组的元素进行存取的时候,都需要用下标
优点:查找/查询某个下标上的元素时,效率极高,可以说是查询效率最高的数据结构
原因:每个元素类型相同,占用空间大小相同,每一个元素在内存地址是连续的;
知道第一个元素地址,又知道下标,就很容易通过数学表达式计算出来(算出一个地址,是直接定位的
缺点:由于为了保证数组中每个元素内存地址连续,所以随机增删元素的时候,效率较低,因为随机增删会导致后面的元素统一向前或者 向后移动;数组不能存储大数据量,很难在内存空间中找到一块特别大的连续内存
注意:数组对最后一个元素增删,并不影响效率
声明与定义:
语法结构:
int[] array1;
String[] array2;
如何初始化一个数组
语法结构:
1.静态初始化
int[] array1 = { 100, 20, 20, 500};
Object[] arrayw = {new Object() ,new Object(), new Object()};
2.动态初始化
**int[] array1 = new int[5];** //初始化5个元素的int类型数组,每个元素默认值为0
int array2[] = new int[6]; //这是C++的编写方式,不建议用这一种
String[] array2 = new String[6];
Object[] objs = new Object[1]; //Object对象初始化后,对象的内存地址为null
确定数组中存储哪些数据,用静态初始化,不知道则用动态初始化,并后期赋值,注意下标别越界
数组的读取
System.out.println("第一个元素为" + a[0]);
System.out.println("最后一个元素为" + a[a.length - 1]);
a[0] = 100;
for(int i = 0; i < a.length ;i++){
System.out.println("数组中下标为" + i + "的数据为" + a[i]);
}
Animal a1 = new Animal();
Animal a2 = new Animal();
Animal[] a ={a1, a2};
for (int i = 0 ;i < a.length ;i++ ){
a[i].move();
}
class Animal{
public void move(){
System.out.println("动物在移动");
}
}
当一个方法的参数是数组的时候
public static void printArray(int[] array){
for(i = 0; i<array.length; i++){
System.out.println(i);
}
}
public static void main(String[] args){
int[] a = {1, 2, 3};
printArray(a);
printArray(new int[]{1, 2, 3}); //静态传参
public static void main(String[] args)
JVM调用main方法的时候,会自动传一个String数组过来,这个数组长度为0,说明args不是个null
这个数组什么时候会有值呢?这个数组是留给客户的,客户在控制台上输入参数,这个参数会自动转换为"String[ ] args"
在运行时,自动把类名后面的数据以空格方式隔开,再将其传到String[ ] args中
那么这个String[ ] args有什么用?
比如,现在有个一个系统,假设这个系统必须输入用户名和密码才能用
public static void main(String[] args){
if(args.length != 2){
System.out.println("请输入正确的用户名和密码格式,用空格隔开");
return;
}
//假设密码是admin,密码是123时为正确,则输入
if("admin".equals(args[0]) &&"123" .equals(args[1])){ //可以避免空指针异常,即使用户和密码时null的话
System.out.println("密码正确,欢迎回来");
} else{
System.out.println("密码错误");
return;
}
}
Java中数组扩容的要求是:
先建立一个大容量的数组,将小容量的数组中一个一个元素拷贝到大容量数组中
所以数组的扩容效率较低,在以后的开发中,尽可能少进行数组的拷贝,最好预估准确
如何进行拷贝?
System.arrayCopy( 5个参数)
5个参数
System.arraycopy(src, srcPos, dest, destPos, length);
其运用为:
int[] src = {1, 2, 3};
int[] dest = new int[20];
System.arraycopy(src, 1, dest, 3, 2); //1表示取src下标为1作为copy起点,3表示取dest下标为3作为copy起点,2表示copy长度