数组
JVM的内存模型
JVM内存划分,人为的根据不同内存空间的存储特点以及存储的数据,主要理解方法区、栈和堆。
1.方法区:存放已被加载的类信息,比如全局变量
2.栈:当方法被执行时会创建一个栈帧,用来存放局部变量等信息
3.堆:存放数组和所有的对象实例
4.GC(垃圾回收站):当JVM资源不够用时,会自动回收无用的对象(没有被引用的数组、对象等等)。
数组的定义
数组:把同类型的多个常量值有序的存储起来。
//语法:数据类型[] 数组名;
int[] ages;
数组的静态初始化
知道了数组的具体元素建议使用静态初始化
// 数组的静态初始化
ages = new int[]{1,2,3,4,5};
数组的动态初始化
只知道数组的长度(元素个数),不知道具体元素是什么建议使用动态初始化
// 数组的动态初始化
ages = new int[4];
一维数组的操作
1.基本操作
// 数组定义并静态初始化
int[] nums = new int[]{1,2,3,4,5,6,7,8,9}; //可以简写为: int[] nums = {1,2,3,4,5,6,7,8,9};
// 数组定义并动态初始化
String[] names = new String[5]; //只声明长度,不列出具体元素,所有元素均默认为0
// 获取数组的长度 语法: 数组名.length
System.out.println(nums.length); //打印nums数组的长度
// 获取数组元素值
System.out.println("获取并打印nums数组索引为0的元素" + nums[0]); //根据索引获取数组元素
// 设置元素值 语法: 数组名[索引] = 常量;
nums[0] = 9; //将9赋值给数组的第一位(索引为0)
// 遍历数组,也就是把数组中的所有元素取出来
for (int i = 0; i < nums.length; i++) { //使用for循环,根据索引递增逐个打印
System.out.println(nums[i]);
}
// 使用for-each遍历数组,for循环的增强,可以减少代码量,在不用获取数组索引的需求中使用
for (int ele : nums) { //定义ele变量接收数组的值,类型要与数组类型相同
System.out.println(ele);
}
2.报错分析
使用数组报错的情况一般为:
(1).ArrayIndexOutOfBoundsException:索引越界,使用的索引超过了数组的长度
(2).NullPointerException:空指针错误,使用的数组未初始化或者为空(没有分配内存空间)
// 数组的索引越界报错
int[] ages = {1,2,3,4,5};
System.out.println(ages[6]); // 数组长度为5,索引最大为4,"ages[6]"索引就会越界,运行就会报错
// 数组空指针报错
String[] names = null;
System.out.println(names.length); //数组为空,操作数组就会报空指针错误
二维数组
一般常用的是一维数组,二维数组用的不多,仅作了解参考:
// 二维数组的定义,语法: 数据类型[][] 数组名;
int[][] nums;
// 静态初始化,二维数组的元素是一个一个的一维数组
nums = new int[][]{{1,2},{3,4,5},{6,7,8,9}};
// 动态初始化
nums = new int[3][2]; // 该数组由3个拥有2个元素的一维数组构成,并且所有元素默认是0
// 定义并初始化
String[][] names = {{"小白","小黄"},{"小红"}}; //静态初始化,二维数组不支持初始化后再赋值
int[][] ages = new int[2][3]; //动态初始化
// 获取数组长度
System.out.println(nums.length); //获取打印的结果是3,表示该二维数组由3个一维数组组成
// 获取数组元素值
System.out.println(nums[1][1]); //表示获取nums数组中第二个一维数组的第2个元素的值
// for循环遍历数组
for (int i = 0; i < nums.length; i++) { //嵌套循环遍历
int[] a = nums[i]; //定义一维数组接收二维数组遍历出来的一维数组
for (int j = 0; j < a.length; j++) { //遍历每个接收到的一维数组
System.out.println(a[j]); //打印每个一维数组中的元素
}
}
// for-each遍历数组
for (int[] ele : nums) { //定义一维数组接收遍历的元素
for (int b : ele) { //遍历得到的一维数组
System.out.println(b);
}
}
练习
1.定义一个元素为String类型数组,按照格式逆序打印该数组的元素,例如数组内容为:{“A”,”B”,”C”,”D”},打印效果为:[D,C,B,A]
String[] names = {"A","B","C","D"};
String str = "["; // 定义拼接字符串变量
for (int i = names.length-1; i >= 0; i--) { // 反序遍历,从索引最大的开始往后倒
if (i == 0) { // 判断索引是否都0了(也就是判断是不是到了数组第一个元素了)
str += names[i] + "]"; // 如果是拼接结束的"]"
} else {
str += names[i] + ", "; // 否则拼接", ",继续循环
}
}
System.out.println(str); // 打印拼接后的字符串变量
2.定义一个 int 类型的二维数组:{{1,2,0,4,0},{0,3,5}},统计数组元素值是 0 的元素个数。
int[][] nums = {{1,2,0,4,0},{0,3,5}};
int count = 0; // 定义计数变量,用来计数出现0的次数
for (int[] ele : nums) { // 使用for-each遍历数组,定义一维数组接收二维数组的元素
for (int num : ele) {
if (num == 0) { // 判断数组中元素0出现的次数
count++; // 出现一次则count加1
}
}
}
System.out.println("数组中元素0的个数是:" + count);
3.定义一个整型数组arr={1,13,45,5,0,0,16,6,0,25,4,17,6,7,0,15},将数组中的0去掉后返回一个新数组newArray。(本题源码在最上面,StatisicsDemo3.java)
int[] arr = {1,13,45,5,0,0,16,6,0,25,4,17,6,7,0,15};
int count = 0; // 定义一个计数变量,如果数组中元素不为0则加1
for (int ele : arr) { // 遍历数组
if (ele != 0) {
count++; // 找出一共有多少个不为0的元素
}
}
int[] newArray = new int[count]; // 定义并动态初始化新数组,长度为原数组去掉0后的元素数
int j = 0; // 定义一个索引变量,从0开始累加,用来将原数组不为0的元素写入新数组
for (int ele : arr) {
if (ele != 0) { // 遍历原数组,找出非0的元素赋值给新数组
newArray[j] = ele;
j++ //如果赋值成功则索引加1
}
}
System.out.println(java.util.Arrays.toString(newArray)); //使用jdk自带的包打印新数组,观察是否达到预期效果