数组
JVM的内存模型
程序计数器:保存当前线程执行的函数
本地方法栈:虚拟机使用的native方法
方法区:加载类中的信息
栈帧:用于存储方法的局部变量、操作栈、动态链接、方法出口等信息
Java虚拟机栈:简称栈,每次调用方法的时候会创建一个栈帧,用于存放当前的局部变量,当程序运行结束时,栈帧会被销毁
Java堆:简称堆,被所有的线程共享,在虚拟机启动时创建。所有的数组与对象都会在堆里分配
GC(Garbage Collection 垃圾回收器):JVM内存不够的时候会自动清理堆中无用的对象(主要清空不使用的资源)
数组的定义
数组:数组就是一组相同类型的数据有序的组织起来
元素:素组中的常量
索引:表示元素存放的位置(从0开始)
数组定义的语法:
素组元素类型[] 素组名;
数组的初始化
初始化后长度就固定了,不能再改,除非重新初始化,也就是说素组是定长的
静态初始化:
语法:
数组元素类型[] 数组名称 = new 素组元素类型[]{元素1,元素1,元素1....}
数组元素类型[] 数组名称 = {元素1,元素1.....}
例子:
int[] ages = new int[]{18,20,21,25};
System.out.println(java.util.Arrays.toString(ages));
动态初始化:
语法:
数组元素类型[] 数组名称 = new 素组元素类型[元素个数];
例子:
int[] arr = new int[5];
for(int i = 0 ; i < arr.length ; i++){
arr[i] = i;
}
动态初始化后的默认值:
数据类型 | 默认初始话默认值 |
---|---|
byte/short/int/long | 0 |
float/double | 0.0 |
char | 一个空字符(空格),是"\u0000" |
boolean | false |
引用类型 | null,表示么有任何信息 |
静态初始化与动态初始化的区别
静态初始化:初始化的时候指定了数组的内容
动态初始化:初始化的时候指定数组的长度
数组的操作
注意:所有的数组都由0开始;最大的索引长度是length-1
增强for循环:foreach,称之为语法糖
for(素组元素类型 变量 : 数组){
//循环体
}
变量:接收每次遍历出来的结果
for与foreach对比
foreach比较方便开发,但是程序的运行效率没有普通的for循环高,因为foreach有转换的过程
//foreach转换前
int[] arr = { 1, 2, 3, 4, 5, 6 };
for(int i : arr){
System.out.println(i);
}
//foreach转换后
int[] arrayOfInt1 = { 1, 2, 3, 4, 5, 6 };
int[] arrayOfInt2 = arrayOfInt1;
int i = arrayOfInt2.length;
for (int j = 0; j < i; ++j) {
int k = arrayOfInt2[j];
System.out.println(arrayOfInt1);
}
二维数组
二维数组就是每一个元素就是一个一元数组
//静态初始化
数组元素类型[][] 数组名 = new 数组元素类型[][]{数组1,数组2,数组3...};
//动态初始化
数组元素类型[][] 数组名 = new 数组元素类型[x][y];
//x是行 y是列(行内数组的列)
二维数组的使用
int[][] arr = new int[3][3];
//....赋值省略
for(int i = 0 ; i < arr.length ; i++){
for(int j = 0 ; j < arr[i].length ; j++){
System.out.println(arr[i][j]);
}
}
数组中常见错误
ArrayIndexOutOfBoundsException:素组索引越界
报错原因:访问素组范围以内的元素,就会出现此报错
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 索引数
NullPointerException:空指针异常
报错原因:访问一个空引用的成员,就会出现此报错
Exception in thread "main" java.lang.NullPointerException