本文简要介绍Java中数组的创建以及初始化,以及数组的一些使用。
文章目录
一、数组概述
数组对于每一门编程语言都是一个重要的存在,Java中提供的数组是用来存储固定大小的同类型元素的。
特点:
- 所有元素类型相同。
- 数组内存储元素的空间是连续的。
- 每个数组内的元素都有自己的编号。
1、数组的创建
语法格式:类型[] 数组名= new 类型[元素个数]
示例:
int[] arr1 = new int[5]; // 创建一个可以容纳5个int类型元素的数组
double[] arr2 = new double[10]; // 创建一个可以容纳10个double类型元素的数组
String[] arr3 = new double[15]; // 创建一个可以容纳15个字符串元素的数组
2、数组的初始化
数组的初始化方法包括动态初始化和静态初始化。
2.1 动态初始化
创建数组时,直接给出数组中元素的个数。
例如:int[] arr = new int[5];
2.2 静态初始化
创建数组时不直接给出元素的个数,而是给出数组内的具体内容。编译器会根据元素个数来确定数组的长度
例如:
int[] arr1 = new int[]{1,2,3,4,5};
double[] arr2 = new double[]{1.0, 2.0, 3.0, 4.0, 5.0};
String[] arr3 = new String[]{"Hello", "World", "!"};
// 简写
int[] arr4 = {1,2,3,4,5};
// 也可以分成两条语句书写
int[] arr5;
arr5 = new int[10];
int[] arr6;
arr6 = new int[]{1,2,3,4,5};
注:
- 初始化时的数组中的元素为基类类型,默认值则为基类类型的默认值。如:
int[] arr = new int[5]
的默认值为0; - 如果存储的为引用类型则为
null
基本类型 | 默认值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0 |
char | ‘\u0000’ |
boolean | fasle |
引用类型 | null |
3、数组类型为引用类型
内存是一段连续的存储空间,为了更好的使用内存,JVM对所使用的内存按照功能进行了不同的划分:
- 方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法编译出的的字节码就是保存在这个区域。
- 堆(Heap): JVM所管理的最大内存区域。使用 new 创建的对象都是在堆上保存,堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销毁。
- 虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。
- 本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似。只不过保存的内容是Native方法的局部变量。在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的。
- 程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址。
3.1 基本类型和引用类型的区别
- 基本类型创建的变量为基本变量,该变量存放的是其所对应的值。
- 引用类型创建的变量,一般称为对象的引用,其所存放的是对象所在空间的地址。
示例:
public static void myArray() {
int a = 10;
int b = 20;
int[] arr = new int[]{1,2,3,4,5};
}
a,b,arr
都是方法内部的变量,因此空间都在myArray
方法对应的栈帧中分配。
数组是通过地址操作对象的。
二、数组的使用
想要访问数组的内的元素,通过下标来进行访问,每一个下标对应一个元素,数组的第一个位置下标为0。数组的元素存放在连续的空间内,因此支持随机访问,通过下标随机访问数组中任意元素。
int[] arr = new int[]{1,2,3,4,5};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println(arr[4]);
// 使用数组时一定注意不要越界访问,数组下标为[0,N),不包括N。
1、数组的遍历
int[] arr = new int[]{1, 2, 3, 4, 5};
for(int i = 0; i < 5; i++){
System.out.println(arr[i]);
}
可通过arr.length
来获取arr
数组的长度
int[] arr = new int[]{1, 2, 3, 4, 5};
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
也可使用for-each
的for
循环来实现相同的功能
int[] arr = {1, 2, 3};
for (int x : arr) {
System.out.println(x);
}
2、数组作为函数的返回值
public static int[] reverse(int[] list) {
int[] result = new int[list.length];
for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {
result[j] = list[i];
}
return result;
}
3、数组作为函数的参数
//修改arr[0]的值
public static void main(String[] args) {
int[] arr = {1, 2, 3};
myArray(arr);
System.out.println("arr[0] = " + arr[0]);
}
public static void myArray(int[] a) {
a[0] = 10;
System.out.println("a[0] = " + a[0]);
}
在myArray方法内部修改数组内容,方法外的数组内容也就发生了变化。因为数组是引用类型,所以可以修改到内部存放的内容。
4、数组的拷贝
import java.util.Arrays;
public static void func(){
// 浅拷贝:newArr和arr引用的是同一个数组
// 因此newArr修改空间中内容之后,arr也可以看到修改的结果
int[] arr = {1,2,3,4,5,6};
int[] newArr = arr;
newArr[0] = 10;
System.out.println("newArr: " + Arrays.toString(arr));
// 深拷贝:copyOf方法在进行数组拷贝时,创建了一个新的数组
// arr和newArr引用的不是同一个数组
arr[0] = 1;
newArr = Arrays.copyOf(arr, arr.length);
System.out.println("newArr: " + Arrays.toString(newArr));
// 因为arr修改其引用数组中内容时,对newArr没有任何影响
arr[0] = 10;
System.out.println("arr: " + Arrays.toString(arr));
System.out.println("newArr: " + Arrays.toString(newArr));
// 拷贝某个范围.
int[] newArr2 = Arrays.copyOfRange(arr, 2, 4);
System.out.println("newArr2: " + Arrays.toString(newArr2));
}
- 浅拷贝: 引用的是同一个数组,同一个地址空间。
int[] arr = {1,2,3,4,5,6};
int[] newArr = arr;
- 深拷贝: 创建了一个新的数组,引用的不是同一个地址。
int[] arr = {1,2,3,4,5,6};
newArr = Arrays.copyOf(arr, arr.length);
5、多维数组
多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。
基本语法格式:数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };
示例:String str[][] = new String[3][4];
二维数组 str
可以看成一个3行4列的数组。
int[][] arr = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
for (int row = 0; row < arr.length; row++) {
for (int col = 0; col < arr[row].length; col++) {
System.out.printf("%d\t", arr[row][col]);
}
System.out.println("");
}
多维数组的引用:arr[0][1]