Java数组
在Java中,有大量的方式可以持有对象。而数组是一种效率最高的存储和随机访问对象引用序列的方式。数组是一个简单的线性序列,这使得元素访问非常快速。但在其生命周期中数组对象的大小被固定且不可改变。
数组有三种初始化方法,下面看代码:
1 | public class Main { |
反编译之后发现编译器做了如下处理:
1 | int[] i1 = new int[]{1, 2, 3}; |
可以看到表面上我们用到了三种初始化方法,实际上Java编译器背地里将第一种方法转成了第二种方法。但是第一种方法只能用在定义数组的时候初始化,而第二种和第三种方法就没有这个限制了。
数组可以分为基本类型数组和引用数组,他们的唯一区别就是基本类型数组开辟的内存空间是直接存的值,而引用数组存的是对象的引用。
我们分析上面三种初始化方法,无论是静态指定数组长度的第三种方法,还是动态推测数组长度的一二种方法。都会显式或隐式的使用关键字new,我们都知道关键字new用于内存分配,也就是说数组的数据存在堆区,栈区存放的是数组的引用。
下面我们来讲一下二维数组,理解了上面的话二维数组就是小意思了。二维数组可以理解成一维数组的每个元素都是数组。二维数组就相当于构建了一个一维数组,堆区的每个元素存放的是元素数组的引用,而数组数据则放在堆区的另外一块内存中。
多维数组的情况跟二维数组就比较类似了,无非就是数组元素是数组引用,内层数组元素又是引用,等等等等,以此类推。
在Java中,很多容器的底层都是用数组实现的,数组因为是长度不可改变的,所以在开发中需要写更多的代码来适应各种情况,那么各种容器就是对一些常用的操作进行封装,对开发速度有显著提升。