活动地址:优快云21天学习挑战赛
一、关于数组的基本概念
1.什么是数组
数组就是用来存储一批同种类型数据的内存区域(可以理解成容器)。和字符串一样属于引用类型
2.数组的特点
- 数组是相同类型的变量的集合,即其所有元素的类型相同
- 元素有固定的顺序,每个元素都有一个固定的编号,称之为索引(index),从0开始递增,类型为int
- 数组包含的元素个数为最大索引+1,即使用索引n访问到的是第n+1个元素
- 每个元素相当于一个变量,可以单独进行读写
- 数组占用一片连续的内存空间
二、数组的具体操作
1.数组的初始化
(1)静态初始化
静态初始化:即数组在定义时就进行赋值。
完整格式: 数据类型[ ] 数组名=new 数据类型[ ]{元素1,元素2,元素3…};
eg: int[ ] ages = new int[ ]{12,24,36,48,60;
(当然,也可以把中括号写在数组名后面,即 int ages[ ] = … )
简化格式:数据类型[ ] 数组名={元素1,元素2,元素3,…};
(就是省略了new+数据类型)
(2)动态初始化
动态初始化:即定义数组的时候只确定元素的类型和数组的长度,之后再存入具体数据。
完整格式:数据类型[ ] 数组名=new 数据类型[长度];
eg: int[ ] arr = new int[3];
(此时会填充各种类型的默认值,规则如下:)
测试代码:
public class test {
public static void main(String[] args) {
int[] a = new int[3];
System.out.println(a[0]);
}
}
2.数组的遍历
数组有两种遍历方式,一种是for-i 循环常规遍历;另一种是使用for-each进行遍历。如下所示:
//方法一
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
//方法二
for (int i:a) {
System.out.println(i);
}
三、数组的内存分配问题
1.数组存储在堆中
数组与变量不同,变量一般存储在栈中,而数组存储在堆中
但是数组名是存储在栈中的,因为数组是引用类型,所以在对数组进行操作时,数组名起到类似“指针”的作用指向位于堆内存中的数组元素,如下所示:
2.经过一个已有数组赋值的数组是指向同一对象的
测试代码如下:
public class test {
public static void main(String[] args) {
int[] a = {1,2,3};
int[] b = a;
System.out.println("a数组:"+a[0]);
System.out.println("b数组:"+b[0]);
b[0] = 0;
System.out.println("a数组:"+a[0]);
System.out.println("b数组:"+b[0]);
}
}
结果如下:
四、数组的缺点以及替代
1.缺点
- 数组一旦定义好长度,就无法动态更改
- 数组不便于增删元素
- 数组…我暂时就想到这俩缺点
2.替代
针对以上缺点,可以使用 集合 来解决。具体的,可以采用ArrayList<>。其定义如下:
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口。
关于ArrayList,有以下基本操作:
- 增:使用 add() 方法,如 sites.add(“Google”);
- 删:使用 remove() 方法,如 sites.remove(3); // 删除第四个元素
- 改:使用 set() 方法, 如 sites.set(2, “Wiki”); // 第一个参数为索引位置,第二个为要修改的值
- 计算数组大小:使用 size() 方法,如 sites.size()
参考
- 黑马程序员pdf笔记(需要可评论区留言)
- 菜鸟教程 ArrayList介绍