目录
数组的基本操作
遍历数组
遍历数组是一种常见的操作,当我们要使用数组来呈现数据时,需要掌握数组的遍历方法。
使用for循环遍历数组
我们使用.length来获取数组的长度,对于下面这个数组,长度即为5。
int[] arr1={1,5,78,61,255};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
我们还可以使用另一种方式:使用enhanced for循环。声明数组部分一样。在循环开头声明一个和数组元素类型相同的变量item,这个变量用于接收数组元素。然后就可以在循环中写入我们想要实现的功能代码。
int[] arr2={1,5,78,61,255};
for (int item : arr2) {
System.out.println(item);
}
使用ArrayList的forEach方法
这种方式是Java8开始引入的特性,这里仅仅简单介绍,数据结构篇讲到后面我再详细介绍。list是ArrayList的对象,用add方法给数组赋予元素值,并使用forEach方法遍历,这里同样用到了新定义的变量item。
ArrayList<Integer>list=new ArrayList<>();
list.add(1);
list.add(5);
list.add(78);
list.add(61);
list.add(255);
list.forEach(item->{
System.out.println(item);
});
了解不同数据类型数组的默认值
这里我们直接用代码测试结果
public class OneArrayTest02 {
public static void main(String args[]){
//数组元素的默认初始值
//整型数组元素的默认值
int[] arr4=new int[5];
System.out.println(arr4[4]);
short[] arr5=new short[4];
System.out.println(arr5[3]);
//byte和long其实也是一样的
//浮点型数组元素的默认值
float[] arr6=new float[5];
System.out.println(arr6[4]);
double[] arr7=new double[5];
System.out.println(arr7[4]);
//字符型数组元素的默认值
char[] arr8=new char[5];
System.out.println(arr8[4]);
//布尔类型数组元素的默认值
boolean[] arr9=new boolean[5];
System.out.println(arr9[4]);
//引用数据类型数组元素的默认值
String[] arr10=new String[5];
System.out.println(arr10[4]);
}
}
运行结果如下:
这里需要强调一点的是char这种类型,char类型的默认值,从数的角度来看,就是数字0,或者也可以表示为\u0000,在Unicode编码的对应关系中,\u0000就对应的是空。
数组在内存中的划分
首先我们要大致知道JVM整体的架构图,对于我们这里要涉及到的内存区域,我们着重关注虚拟机栈和堆,这两个空间即可。
先看一下这份代码:
public class OneArrayTest03 {
public static void main(String args[]){
int[] arr1=new int[4];
arr1[0]=15;
arr1[1]=87;
System.out.println(arr1);
String[] arr2=new String[3];
arr2[0]="北京";
arr2[1]="深圳";
System.out.println(arr2);
arr2=new String[2];
System.out.println(arr2);
}
}
这里先简单理解,字符串“北京”,“深圳”就是直接放入这块内存区域的,后续讲到字符串常量池,再对这种情况详细讲解。
arr2原本定义的是第一个容量为3的String类型,存有首元素的地址,但是随即我们又用arr2为数组名新建了另一个数组,这时候,arr2在栈中就以新的地址存在,即41629346。凡是new了,就在内存中开辟了一个新的空间了。这时候垃圾收集器就会回收原来的那个首地址为3b07d329的数组。也就是说,存有“北京”的数组,没有指针指向它了,也就会被垃圾收集器回收。
而当main函数执行完所有的代码后,main这一内存区域就会被弹出,同时堆空间里面的所有内容也就会被回收,堆和栈中的所有之前为之开辟的空间全部清空。
这里还要说明一下,目前我们所做的对于数组的操作,以及后面会讲到的集合框架,都是在内存层面的对数据的存储,并不是存在了外设上,比如磁盘。而且我们先主要以一维数组举例,其实真正在开发中,多维数组应用的并不是很多。
再看一份代码
package DataStructures;
public class OneArrayTest04 {
public static void main(String args[]){
int[] arr3=new int[3];
arr3[0]=56;
arr3[1]=70;
arr3[2]=93;
System.out.println(arr3[0]);
System.out.println(arr3);
//把arr3这个数组的首地址赋值给arr4
int[] arr4=arr3;
arr4[1]=9;
System.out.println(arr4[1]);
System.out.println(arr4[2]);
}
}
这里我们用了int[] arr4=arr3;这个操作,首先思考一个,这会实现什么?
首先我们知道,数组名在栈空间内,存有的是首个元素的十六进制地址,而arr3又直接赋值给了arr4,其实意思就是:arr4和arr3两个数组的首地址都是一样的,那么就是它们共同指向了堆空间内的数组空间。
不过这里有个疑问?为什么堆空间内没有两个数组空间呢?首先,既然已经arr4的首地址就是4eec7777,那就肯定是指向的一个唯一固定的内存空间,并且从代码的角度也能看出来,我们这里没有用new,也就不会为这个数组变量为之开辟一个新的内存空间了。
这篇文章用到的IDEA的相关快捷键
arr4.sout+回车键,就是打印语句
fori加回车键就会生成for循环的模板
总结
全文介绍了数组的一些基本操作,如何简单的使用数组,并且从内存的角度,讲解了一下数组的生命周期,首地址到底存在哪?代表什么的问题。内容比较基础,适合于初学者快速掌握。