数组的入门
概念
- 数组属于引用数据类型,其父类是Object
- 数组可以容纳多个元素。(数组是一个数据的集合)
- 数组可以存储
基本
和引用
数据类型 - 数组是引用类型,所以存储再堆内存中
- 数组不能直接存储Java对象,但是可以存储其
引用
(内存地址)
分类
- 一维数组
- 二维数组
- 多维数组
二维数组本质就是每个元素是一个一维数组
特点
- 所有的数组都有
length
属性,用来获取数组中元素的个数。 - 数组中的元素要求类型统一
- 数组中元素的内存地址是连续的(内存地址是有规律的爱着排列)
- 数组是一种简单的数据结构
- 首元素的内存地址作为整个数组对象的内存地址
- 数组中每个元素都有下标,下标从0开始以1递增,最后一个元素的下标是
length - 1
- 数组中的元素在存或取时都是通过下标来进行
优点
通过下标检索效率极高,可以说是查询效率最高的数据结构
原因:内存地址连续、元素数据类型一致、占用大小一致、可以通过偏移量
直接计算出来
因为是通过数学表达式计算出的元素的内存地址,那么10个元素和1w个元素的数组在检索时效率是一样的
缺点
- 为了保证数组中元素地址连续,在随机增删时,后面的元素要统一向前或向后位移
- 不能存储大数据量(因为很难在内存空间上找到一块很大而且连续的内存空间)
注意: 对于最后一个元素的增删效率没有影响
补充
数组的扩容
由于数组一旦确定,长度是不可变的
如果原数组存满,那么会建立一个新的更大的元素,并将原来的数组中元素拷贝到新的数组中。
所以数组拷贝的效率很低,尽量不要让数组扩容
System.arraycopy
源码:
//第一个是 源数组,第二个是开始位置,第三个是目标数组,第四个目标数组位置,第五个是拷贝长度
public static native void arraycopy(Object src,int srcPos,Object dest,int destPos,int length);
初始化
以int
类型数组举例
- 静态初始化
int[] array = {100,2100,513,12};
- 动态初始化
//此处的5表示数组中元素的个数
//初始的五个元素都是int类型的默认值:0
int[] array = new int[5];
访问时通过数组对象[下标]
的方式访问例如array[1]
表示访问下标为1的元素
遍历数组:(采用for循环遍历)
for(int i = 0; i < array.length; i++){
System.out.println(a[i]);
}
//同样的方式可以实现倒序遍历
另外可以和多态联合使用如:
Animal Cat Bird 三个类
Cat和Bird extends Animal
可以创建Animal数组,存储其子类
Animal[] animals = {new Cat(),new Bird()};
如果要遍历子类中特有的方式时,可以在for
循环中加上instanceof
判断符
if(animals[i] instanceof Cat){
Cat cat = (Cat)animals[i];
}
标签:10,下标,入门,int,元素,Cat,数组,JavaSE,内存地址
From: https://blog.csdn.net/Annaday/article/details/137548967