Java数组的动态初始化和常见问题解析
作者:洛上言
一、为什么有数组动态初始化呢?
如果一开始就知道数组里的数据,就可以使用静态初始化去完成。
但是如果一开始就不知道要添加什么数据,那此时大括号中写什么呢?
int[] arr = {1, 2, 3, 4, 5}; int[] arr = {????}
是不是感觉写什么都不太合适。所以动态初始化和静态初始化的应用场景是不一样的。
二、动态初始化
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
格式:
数据类型[] 数组名 = new 数据类型[数组长度];
示例:
下述代码表示arr数组里只能存3个int类型的整数。
int[] arr = new int[3];
三、代码示例
需求:
定义一个数组,用来存班级中50个学生的姓名。
姓名未知,等学生报道之后,再进行添加。
package com.itheima.arraydemo; public class ArrayDemo4 { public static void main(String[] args) { //格式: //数据类型[] 数组名 = new 数据类型[数组的长度]; //在创建的时候,由我们自己指定数组的长度,由虚拟机给出默认的初始化值 String[] arr = new String[50]; //添加学生 arr[0] = "zhangsan"; arr[1] = "lisi"; //获取 System.out.println(arr[0]);//zhangsan System.out.println(arr[1]);//lisi System.out.println(arr[2]);//打印出来的是默认初始化值null } }
四、数组默认初始化值的规律
- 整数类型:默认初始化值0
- 小数类型:默认初始化值0.0
- 字符类型:默认初始化值’\u0000’ 空格
- 布尔类型:默认初始化值 false
- 引用数据类型:默认初始化值 null,String就是一个引用数据类型
int[] arr2 = new int[3]; System.out.println(arr2[0]);//0 System.out.println(arr2[1]);//0 System.out.println(arr2[2]);//0
五、数组动态初始化和静态初始化的区别
1、动态初始化:手动指定数组长度,由系统给出默认初始化值。
只明确元素个数,不明确具体数值,推荐使用动态初始化
例如:使用数组容器来存储键盘录入的5个整数。
int[] arr = {????}; // 不明确数组中应该存储哪些 int[] arr = new int[5]; // 就使用动态初始化
2、静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组的长度。
需求中已经明确了要操作的具体数据,直接静态初始化即可。
例如:将全班的学生成绩存入数组中:11,22 ,33
int[] arr = {11, 22, 33};
六、数组常见问题:越界
当访问了数组中不存在的索引,就会引发索引越界异常
package com.itheima.arraydemo; public class ArrayDemo5 { public static void main(String[] args) { //1.定义一个数组 int[] arr = {1,2,3,4,5}; //长度:5 //最小索引:0 //最大索引:4(数组的长度 - 1) //如果访问的数字不在这个范围(0 ~ 4)就会报索引越界异常 System.out.println(arr[2]); //小结: //索引越界异常 //原因:访问了不存在的索引 //避免:只要知道索引的范围就行了 //最小索引:0 //最大索引:(数组的长度 - 1) } }
下图的红色就表示代码出现了问题,通常我们也会说代码报错了。
阅读报错的信息:Exception:异常,异常在main里。java.lang.ArrayIndexOutOfBoundsException
是异常的名字,叫做:索引越界异常。后面就会紧接着异常出现的解释:
Index 10 out of bounds for length 5
索引10已经超过了长度为5的数组。
at:表示 在
。com.itheima.arraydemo
是包名,ArrayDemo5
是类名。
main
是方法名。ArrayDemo5.java:10
表示异常出现的位置,这里就表示在第10行出现了问题。
点一下,它就会自动跳转到第10行。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。