数组
- 数组概念:数组是存储相同类型值的固定长度的容器。
数组的定义
数组是一种数据结构,用来存储相同类型的值,并且可以通过下标来对数组中的值进行访问,接下来介绍几种常见的定义数组的方式。
-
数组元素类型[] 数组变量名 = new 数组类型[长度];
数组元素类型代表存储在数组中的元素的数据类型,包括之前的基本数据类型和引用数据类型,[]代表的是数组,new是关键字,长度表示这个数组有多大,因为数组是固定大小的,如果不输入长度,就会报错。长度一旦确定,就不能再进行更改。有些时候我们也可以写成 数组元素类型 数组变量名[]这种形式。
例如: int[] array = new int[5];
在这里我们定义了一个长度为5的int数组,我们只能存储5个int类型的值。
-
数组元素类型[] 数组变量名 = new 数组类型[] {元素1,元素2…}
这种定义数组的方式和上面类似,但是上面只是定义了一个数组,没有提供初始值,而这种方式不仅创建了一个数组同时还提供了初始值。在这里,我们没有直接指定长度,长度是根据后面的元素个数来定的。
同时,java还提供了一种简写形式, int[] array = {元素1,元素2,元素3…};
数组的访问
数组一旦创建,就可以通过一个下标(也可称之为索引)来进行访问,但是要注意的是,数组的索引是从0开始的,即array[0] 代表数组的第一个元素,
public static void main(String[] args) {
int[] a = new int[]{1,2,3,4,5};
System.out.println(a[2]);
}
当创建一个数字数组时,所有的元素都默认为0,而对于boolean数组,元素会初始化为false,而对于对象数组的元素则初始化为null值。除了可以通过索引值来对数组净心血管访问,也可以修改数组元素。
a[2] = 3;//将数组中第三个元素的值修改为3
我们刚刚说过,数组索引是从0开始的,所以如果定义一个长度为5的数组,我们最多只能访问到4,如果访问a[5]将会出现数组索引越界异常。
public static void main(String[] args) {
int[] a = new int[]{1,2,3,4,5};
System.out.println(a[5]);
}
要想获得数组的元素个数据,也可以通过length方法,
public static void main(String[] args) {
int[] a = new int[]{1,2,3,4,5};
System.out.println("数组的长度是" + a.length);
}
接下来,我们讨论一下数组的存储
public static void main(String[] args) {
int[] a = new int[]{1,2,3,4};
System.out.println(a);
}
我们直接打印数组,得到的一串奇怪的数字,这个是数组在内存中的地址,凡是new 出来的,都在堆内存中存储,在这里我们简单了解一下jvm虚拟机对内存的划分(借用一下别人的图)
区域名称 | 作用 |
---|---|
寄存器 | 给cpu使用的,和开发无关 |
本地方法栈 | jvm在使用操作系统功能的时候使用,和开发无关 |
方法区 | 存储可以运行的class文件 |
堆内存 | 存储对象或者数组,凡是通过new创建的,都存储在堆内存中 |
方法栈 | 方法运行时使用的内存,比如main方法,在方法栈中执行 |
我们在变量中存储的是数组的地址,通过地址,就可以在堆内存中找到对应的数组。
public static void main(String[] args) {
int[] a = new int[]{1,2,3,4};
int[] b = a;
System.out.println("数组a的地址:" + a);
System.out.println("数组b的地址: " + b);
}
我们发现打印的两个地址相同,说明通过赋值给的是当前数组的地址。
关于数组一些方法,就不在这里一一说明了,可以通过查api文档获取。还有一个就是数组的遍历,通过循环来将数组中的每个元素的值取出来,(也可以通过Arrays的toString()方法,它会返回一个包含数组元素的字符串)
public static void main(String[] args) {
int[] a = new int[]{1,2,3,4};
for(int i = 0; i < a.length; i++){
System.out.print(a[i] + ",");
}
System.out.println();
System.out.println(Arrays.toString(a));
}