什么是数组
数组指的是一种容器,可以用来存储同种数据类型的多个值
细节
- 数组容器在存储数据的时候,需要结合隐式转换考虑
- 例如,int类型的数组容器,可以存储byte、short、int,但不能存储比他大的double,也不能存储boolea
- 例如,double类型的数组容器可以存储byte、short、int、long、float、double,但不能存储boolea
数组的定义和初始化
数组的定义
1.格式一
数据类型[] 数组名
2.格式二
数据类型 数组名[]
数组的初始化
即在内存中,为数组容器开辟空间,并将数据 存入容器的中的过程
静态初始化
完整格式:数据类型 数组名[] = new 数据类型[] {元素1,元素2,元素3...};
简化格式:数据类型 数组名[] = {元素1,元素2,元素3...};
动态初始化
初始化时只指定数组长度,由系统为数组分配默认初始值
整数类型:0
小数类型:0.0
字符类型 :'/u0000',即空格
布尔类型:false
引用数据类型:null
格式:数据类型 数组名[] = new 数据类型[数组长度];
二维数组的初始化
初始化
静态初始化
格式:数据类型[][] 数组名 = new 数据类型[][]{ {元素1,元素2,...},{元素1,元素2,...}};
简化格式:数据类型[][] 数组名 ={ {元素1,元素2,...},{元素1,元素2,...}};
动态初始化
格式:数据类型[][] 数组名 = new 数据类型[m][n];
数组的地址
System.out.println(arr1); // [I@1b6d3586
含义
[:表示是一个数组
I:表示数组的数据类型是int
@:表示一个间隔符号
1b6d3586:数组真正的地址(十六进制)
数组的元素访问
格式
数组名[索引]
数组遍历
细节:java中可以直接获得数组的长度属性,调用方法:数组名.length
数组常见问题
索引越界异常
数组的内存图
Java内存分配
JDK7以前
- 栈:方法运行时使用的内存,比如main方法运行,进入方法栈中执行
- 堆:存储对象或者数组,new出来的,都存储在堆内存
- 方法区:存储可以运行的class文件
- 本地方法区:JVM在使用操作系统功能的时候使用
- 寄存器:给CPU使用
JDK8开始
取消方法区,新增元空间,把原来方法区的多种功能进行拆分,有的功能放到了堆中,有的功能放到了元空间中
二位数组的内存图
二维数组可以理解为一维数组,但是其元素也是一个一维数组。如上图所示,arr表示此二维数组的地址,arr[0]表示此二位数组的第一个元素的地址,即底下第一个一维数组的地址。arr[0][1]才表示第一个元素的第2个值。
特殊情况
1.
定义二维数组的时候,只给定元素的个数,但是一维数组的数据个数不给定,自己定义。注意,此时第一个一维数组有两个元素,第二个一维数组有三个元素,但是此二维数组不能用2行3列来理解和遍历,会出现内存越界,因为第一个一位数组只有两个元素。
2.
自己定义每个一维数组的元素个数,但是依然不能以代码
for (int i = 0; i < 2; i++) { for (int i1 = 0; i1 < 3; i1++) { System.out.println(arr[i][i1]); } }
来遍历,因为第一个一位数组只有2个元素。
细节
Java中的二维数组不能单纯的用几行几列来理解了,只有用一维数组里面的元素也是一维数组来就理解,并且如果一维数组的元素不一样,不能按照固定的几行几列来遍历,只能按照每个一维数组的元素的个数来遍历,除非该二维数组的每个一维数组的元素个数都一样。