一 . 数组
数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致.
创建数组:
- 数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度]
- 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3…}
- 数据类型[] 数组名 = {元素1,元素2,元素3…}
数组有定长特性,长度一旦指定,不可更改
数组的长度:
每个数组都具有长度,而且是固定的.Java中赋予了数组的一个属性,可以获取到数组的长度,语句为:数组名.length.属性length的执行结果是数组的长度,结果为int类型.
访问数组:
每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素.数组的最大索引值为数组名.length-1.
- 数组名[索引]=数值,为数组中的元素赋值
- 变量=数组名[索引],获取出数组中的元素
二 . 数组原理内存图
Java虚拟机(JVM)的内存划分
区域名称 | 作用 |
---|---|
寄存器 | 给CPU使用,与开发无关 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和开发无关 |
方法区 | 存储可以运行的class文件 |
堆内存 | 存储对象或者数组,new来创建的,都存储在堆内存 |
方法栈 | 方法运行时使用的内存 |
数组在内存中的存储
一个数组
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr);//[I@5f150435
}
执行此方法执行,发现输出的结果是[I@5f150435,这个是数组在内存中的地址,在文章上面我们提到new出来的内容,都是在堆内存中存储的,而方法中的变量arr保存的就是数组的地址.
要获取数组中的元素,需要借助数组的索引,比如输出arr[0],就会输出arr保存的内存地址中数组中0索引上的元素
两个数组
两个不同的数组会指向不同的地址
public static void main(String[] args) {
int[] arr = new int[3];
int[] arr2 = new int[2];
System.out.println(arr);
System.out.println(arr2);
}
两个变量指向一个数组
public static void main(String[] args) {
// 定义数组,存储3个元素
int[] arr = new int[3];
//数组索引进行赋值
arr[0] = 5;
arr[1] = 6;
arr[2] = 7;
//输出3个索引上的元素值
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//定义数组变量arr2,将arr的地址赋值给arr2
int[] arr2 = arr;
arr2[1] = 9;
System.out.println(arr[1]);
}
三 . 遍历数组
将数组中的每个元素分别获取出来,就是遍历
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
四 . 数组反装
数组中的元素颠倒顺序,以原始数组为1,2,3,4,5,反转后的数组为5,4,3,2,1举例.
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
/*
循环中定义变量min=0最小索引
max=arr.length-1最大索引
min++,max--
*/
for (int min = 0, max = arr.length - 1; min <= max; min++, max--) {
//利用第三方变量完成数组中的元素交换
int temp = arr[min];
arr[min] = arr[max];
arr[max] = temp;
}
// 反转后,遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
五 . 数组异常(常见)
越界异常
public static void main(String[] args) {
int[] arr = {1,2,3};
System.out.println(arr[3]);
}
创建数组,赋值3个元素,数组的索引就是0,1,2,没有3索引,因此我们不能访问数组中不存在的索引,程序运行后,将会抛出 ArrayIndexOutOfBoundsException 数组越界异常.
空指针异常
public static void main(String[] args) {
int[] arr = {1,2,3};
arr = null;
System.out.println(arr[0]);
}
arr = null,即变量arr不会在保存数组的内存地址,也不允许再操作数组,因此运行的时候会抛出NullPointerException 空指针异常.
怎么把数组中指定的数据拷贝到另一个数组中
java.lang.System
类中提供了相关的静态方法
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
:将数组中指定的数据拷贝到另一个数组中
参数含义:
参数序号 | 参数名称 | 参数类型 | 参数含义 |
---|---|---|---|
1 | src | Object | 源数组 |
2 | srcPos | int | 源数组索引起始位置 |
3 | dest | Object | 目标数组 |
4 | destPos | int | 目标数组索引起始位置 |
5 | length | int | 复制元素个数 |
public class SystemDemo {
public static void main(String[] args) {
long l = System.currentTimeMillis();//1583716922952
System.out.println(l);
int[] arr = {1, 2, 3, 4};
int[] arr2 = {7, 8, 9, 12, 23};
System.arraycopy(arr,1,arr2,0,2);
/*
代码运行后:
两个数组中的元素发生了变化
arr数组元素[1,2,3,4]
arr2数组元素[2, 3, 9, 12, 23] */
for (int i =0;i<=arr2.length-1;i++) {
System.out.println(arr2[i]);
}
}
}