Java学习总结(16)——一维数组

30. 数组 array

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});	//静态传参

main方法的String数组

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长度
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值