数组的定义
- 数组用于将相同类型的数据存储在连续的存储单元中;
- 可以通过指定数组的名称和长度来声明数组;
- 一旦声明数组的大小,就不能再修改;
- 数组元素通过数组名和索引来访问,索引从0开始;
数组可以是一维,也可以是多维。
在java中声明数组有如下方式(以整型数组为例):
//仅声明数组的引用,但没有分配内存空间
int[] arr;
//声明数组的同时,根据指定长度分配内存,但是数组中没有值
int[] arr= new int[10];
//声明数组并分配内存,同时将其初始化
int[] arr2= new int[]{1,2,3,4,5};
//或者是
int[] arr2={1,2,3,4,5};
声明数组示例:
public class ArrayDemo{
public static void main(String[] args){
//声明整型数组的引用
int[] arr;
//为数组引用在堆中分配内存
arr = new int[10];
//使用循环为数组元素赋值
for(int i=0;i<arr.length;i++){
arr[i]=i;
}
//将数组元素逐个输出到控制台
System.out.println(Arrays.toString(arr));
}
}
关于数组长度
- 在java中,程序员可以不再关注数组的长度,数组自带的length属性将负责保管数组的长度
- java对数组下标越界情况强加约束
- 如果视图访问不在有效索引以内的元素,将会引发运行错误。(异常:数组下标越界)
比如:
int[] arr = new int[4];
System.out.println(arr[4]);
控制台抛出的运行时异常,如下图:
数组的赋值
- 在java中,语法上允许数组直接赋值给另一个数组,但实际得到的效果是两个数组引用指向同一块内存。
int[] arr1 = new int[]{2,4,6,8,10};
int[] arr2 = arr1;
System.out.println("arr1的地址是:"+arr1+" arr2的地址是:"+arr2);
结果如图:
用图来说明的话,如下:
数组的复制
1.数组变量存储对数组的引用,复制该变量将产生同一数组的第二个引用。
//指向的是同一个地址
int[] a = new int[3];
int[] b = a;
2.真正复制一个数组需要用到clone方法。
//指向的是不同的地址
int[] a = new int[3];
int[] b = a.clone();
3.使用System.arraycopy()进行数组的复制
方法的参数说明:
System.arraycopy(from,fromstart,to,tostart,count);
- from:源数组
- fromstart:从源数组的那个位置开始复制,数组下标是从0开始的
- to:目标数组
- tostart:目标数组开始的位置
- count:复制的长度
案例:
将a数组复制到b数组中
int[] a={1,2,3,4};
int[] b=new int[3];
System.arraycopy(a, 0, b, 0, b.length);
定义多维数组
1.比如定义一个在第几行就有几列的多维数组,代码如下:
//申请一个二维数组,三行,列不确定
int[][] arr= new int[3][];
for(int i=0;i<arr.length;i++){
//定义第一行一列,第二行两列,第三行三列
arr[i]=new int[i+1];
}
2.比如定义一个3行4列的多维数组,代码如下:
//申请一个二维数组,三行,四列
int[][] arr= new int[3][4];
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[i].length;j++){
//给第一行第一列赋值11,第一行第二列赋值12,以此类推
arr[i][j]=(i+1)*10+j+1;
}
}
//循环输出结果
for(int[] num1:arr){
for(int num2:num1){
System.out.print(num2+" ");
}
System.out.println();
}
/*
结果如下:
11 12 13 14
21 22 23 24
31 32 33 34
*/