数组
JVM的内存模型
JVm内存划分
- 程序计数器:当前线程执行的字节码的行号指示器
- 本地方法栈:native方法服务(为虚拟机使用)
- 方法区:线程共享的存储区域,有方法加载,就会该方法的类,字节码等就会存在方法区中
- java虚拟机栈:方法被执行时会创建一个栈帧用于存储方法的局部变量,方法出口,动态链接等
- java堆:每次使用new关键字,都会在堆中开辟内存空间,所有对象实例以及数组都在堆中分配
GC:垃圾回收器:JVM自动垃圾回收机制,自动清理无用的对象,释放内存空间
数组的定义
把具有相同类型的多个数据有序的组织起来的一种集合形式,简单来说数组相当于一个容器,就是可以存放多个数值,并且有序,类型要相同.
有序的根据:根据数组的索引值来找到对应第二数组元素
定义语法
数组元素类型[] 变量名;
注意:数组是有索引值的,从0开始.
int[] array;
数组的初始化
数组在定义后,需要初始化才能使用.初始化就在在堆内存中给数组分配内存空间,并赋予值.完成初始化后,数组的长度是固定的.
数组的静态初始化
如果知道元素是什么,那么可以选择静态初始化
1.
数组元素类型[] 数组名 = new 数组元素类型[]{元素1,元素2...};
int[] arr1 = new int[]{1,2,3,4};
2.简写
数据元素类型[] 数组名 = {元素1,元素2....};
int[] arr2 = {1,2,3,4};
数组的动态初始化
如果不知道数组元素有什么,知道长度可以使用动态初始化,也可以自己定义数组长度
数组元素类型[] 数组名 = new 数组元素类型[数组长度length];
int[] array3 = new int[5]; //定义动态数组,长度为5
动态初始化后有默认初始值,不同数据类型的初始值
数据类型 | 默认初始化值 |
---|---|
byte,short,int,long | 0 |
float,double | 0.0 |
char | 空格 ’ ’ |
boolean | false |
引用数据类型 | null,表示不引用任何对象 |
例子:
int[] arr = new int[4];
System.out.println(arr.length);
arr =new int[5];
System.out.println(arr.length);
内存图分析:
数组的基本操作
- 获取数组长度:
int size = 数组名.length;
- 获取元素值
数组元素类型 变量名 = 数组名[index];
- 设置元素值
数组名[index] = 值;
- 最大索引长度 :length-1
两种循环模式
i=0,i<length ; 循环次数:length次
i=1,i<=length ; 循环次数:length次
- 常见异常
- NullPointerException:空指针异常
int[] arr2 = {3,5,6,7};
arr2 = null;
System.out.println(arr1.length); //空指针异常
2.ArrayIndexOutOfBoundsException 索引越界
int[] arr = {1,2,5,6};
System.out.println(arr[5]); //索引越界
- 遍历
//for循环遍历
int[] arr1 = {1,2,5,6};
for (int i = 0; i <=arr1.length-1 ; i++) {
System.out.println(arr1[i]);
}
//for-each 增强for循环遍历
int[] arr2 = {1,3,5,7};
for(int each:arr2){
System.out.println(each);
}
//获取一个个元素:
int arr1 = arr[0];
//修改索引对应的值 :
arr1[0] =16;
二维数组
二维数组,就是数组中的每一个元素是另一个一维数组。
二维数组的操作
语法:
静态初始化
数组元素类型[ ] [ ] 数组名 = new 数组元素类型[ ] [ ]{数组1,数组2,数组3,…};
int[] arr1 = {1,2,3};
int[] arr2 = {4,5,6,7};
int[] arr3 = {56,7,7,9,53,6};
int[][] array = new int[][]{arr1,arr2,arr3};
动态初始化
数组元素类型[ ] [ ] 数组名 = new 数组元素类型[ x] [ y]
//x表示二维数组中有几个一维数组
//y表示每一个一维数组中有几个元素
int[][] arr = new int[3][4];
遍历二维数组
for循环:
/动态初始化
//声明了一个三行的二维数组,没有声明列(一维数组)
int[][] array = new int[3][];
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3,4};
int[] arr3 = {1,2,3,4,5};
array[0] = arr1;
array[1] = arr2;
array[2] = arr3;
for (int i = 0; i <array.length ; i++) {
for (int j = 0; j <array[i].length ; j++) {
System.out.print(array[i][j]+" ");
}
System.out.println();
}
for-each,增强for循环
//声明了一个二维数组(存了3个一位数组),一维数组也同时声明了,每个一维数组能存4个int类型
int[][] array = new int[3][4];
//赋值
array[0][0] = 10;
array[0][1] = 16;
array[0][2] = 20;
array[0][3] = 30;
for(int[] arr:array){
System.out.println(arr);
for(int e:arr){
System.out.print(e +" ");
}
System.out.println();
}
思维导图