数组的初始化
A:数据类型 [ ] 数组名; 举例:int [] arr;
B:数据类型 数组名 [ ]; 举例:int arr[];
动态数组初始化
数据类型[] 数组名 = new 数据类型 [数组长度];
int[] arr = new int[10];
静态初始化
数据类型[] 数组名 = new 数据类型 []{元素1,元素2,…};
数据类型[] 数组名 = {元素1,元素2,…};
长度以元素个数决定
int[] arr = new int[ ]{1,2,3,4}
int[] arr2 = {5,6,7};
数据类型[] 数组名 = new 数据类型 [数组长度]{元素1,元素2,…最大个数};
长度以数组长度决定,没有赋值的元素默认为0
int[] arr = new int[5]{1,2,3,4}
获取数组中元素值
按照数组下表索引获取
索引从0开始到数组长度减1结束
例如:
int[] arr = new int[][1,3,5,7,9];
System.out.println(arr[0]); //1
System.out.println(arr[1]); //3
System.out.println(arr[3]); //7
System.out.println(arr[4]); //7
System.out.println(arr[5]); //运行时报错,超出数组长度(数组索引越界异常)
java中的内存分配
堆栈的区别:
栈存储的是局部变量,就是定义在方法的变量,使用完毕,立即回收。
堆存储的是new出来的东西,实体对象。每一个对象都有地址值,每一对象的数据都有默认值
如:
byte,short,int,long为0,
float,double为0.0,
char为 ‘\u0000’
boolean 为 false
引用类型 为null
堆内存数据使用完毕后,会在垃圾回收器空闲的时候背回收。
一个数组的内存分布
两个数组指向同一个堆内存的内存图
如果两个数组拿的是同一个堆内存的地址,任何一个数组对堆内存数组进行修改,另一个访问到的也跟着修改
数组操作的两个小问题
- 数组索引越界:数组的下标索引超过了数组长度
- 空指针异常:数组为空时或者已不指向堆内存地址时,访问数组元素时产生
int[] arr = new int[3];
arr = null;
System.out.println(arr[1]);//运行时报错,空指针异常
遍历数组
int[] arr = new int[][1,2,3];
for(int i = 0; i <3; i++){
System.out.println(arr[i]);
}
//输出 1
// 2
// 3
不死神兔案例
需求:一对兔子3个月后开始每个月生一对兔子,刚出生的兔子3个月后开始每个月生一对兔子,假如兔子不死,问20个月之后总共有多少对兔子
分析:第1个月:1对
第2个月:1对
第3个月:2对
第4个月:3对
第5个月:5对
第6个月:8对
…
第3个月开始后一个月等于前两个月数字之和
public static void main(String[] args) {
int[] arr = new int[20]; //定义数组记录每个月的兔子数目
arr[0] = 1;
arr[1] = 1; //前两个月兔子对数初始化
//for循环初始化3月到第20个月的兔子对数
for (int i = 2; i < arr.length; i++) {
arr[i] = arr[i-1] + arr[i-2];
}
System.out.println("第20个月的兔子总数为"+arr[19]);
}