数组(array)是一种用于存储多个相同类型数据的存储模型
1、数组的定义格式
2、数组的初始化
2.1 动态初始化
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
使用动态初始化时,系统会根据数据类型为数组分配初始值
整数(byte、short、int、long):0
浮点数(float、double): 0.0
布尔(boolean): false
字符(char): 空字符
引用数据类型(String): null
2.2 静态初始化
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
范例: int [ ] arr = new int[ ] { 1 , 2 , 3 } ;
注:无论是静态初始化还是动态初始化,数组在初始化结束的时候数组的长度就已经确定了
3、数组的索引
索引是数组中数据的编号方式,作用是用于访问数组的数据使用,数组名 [索引]等同于变量名,是一个特殊的变量名。
索引的特征:
4、数组的内存分配
Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
4.1 栈内存和堆内存的区别
其中栈内存用来存储局部变量,会在数据使用完毕后就消失
堆内存用来存储new出来的东西,每一个new出来的东西都有地址,通过地址使用堆内存的数据
例如:int[] arr = new int[3]
int [] arr 存在于堆内存, new int [ 3] 存在于栈内存。 在堆内存中每一个 new 出来的对象都有一个唯一的地址值
4.2 内存分配
堆内存在每一个new出来的东西都会有一个地址
例1:
String[] strs = new String[5];
strs[2] = “Tom”;
strs = new String[3];
String[] strs = new String[5];
strs[2] = “Tom”;
strs = new String[3];
这个时候输出的字符串数组将是{null,null,null}
例2:
int[] arr1 = new int[3];
int[] arr2 = arr1;
arr1[0]=1;
System.out.println(arr2[0]);
在此代码中是把arr1的地址赋值给了arr2,两个数组同时指向同一个堆内存的地址,所以当arr1[0]的值改变时,arr2[0]的值也会改变,所以输出结果为1。
5、常见问题
索引越界:访问了数组中不存在的索引对应的元素,造成索引越界问题
空指针异常:l访问的数组已经不再指向堆内存的数据,造成空指针异常
6、数组的遍历
通过循环语句进行遍历数组
数组有length属性,可以获取数组的长度。
例:通过for循环遍历数组,对数组进行赋值
Scanner scanner = new Scanner(System.in);
int[] arr = new int[3];
for (int i=0;i<arr.length;i++){
arr[i] = scanner.nextInt();
}