作用
存放一组同数据类型的数据
数组的声明
数据类型[] 数组名
数组的创建
- 动态创建
- 数组名 = new 数据类型[数组长度]
- 数组名 = new 数据类型[ ]{值1,值2 ,值3···}
- 静态创建
- 数据类型[ ] 数组名 = {值1,值2,值3····}
一个程序运行,系统会为其开辟一片运行的空间:进程
可变参数
1 | public static void bianLi(int[] nums){ |
数组常见问题
数组下标越界异常
举例:
1 | public static void main(String[] args) { |
控制台输出的异常信息为:
1 | Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: |
数组空指针异常
对象数组同基本类型数组相同
1 | Test_10 [] students;Test_10 students [];int [] array;int array []; |
此时创建的数组,并没有分配到内存空间
内存的分配有两种,一种是静态分配,另一种时动态分配
1 | students [0] = new Test_10("aaaa", 1);students [1] = new Test_10("bbbb", 2);students [2] = new Test_10("cccc", 3);students [3] = new Test_10("dddd", 4);students [4] = new Test_10("eeee", 5); |
这样一个个添加未免效率太低了,并且大多时候,我们并不确定需要有多少记录去存储,如果每次都要改,也太麻烦了
因此想到基本类型数组那样去赋值,但是那样写编译器总是抛出空引用(空指针)异常
空指针异常:空指针就是空引用,java空指针异常就是引用本身为空,却调用了方法,这个时候就会出现空指针异常。可以理解,成员变量和方法是属于对象的(除去静态),在对象中才存在相对应的成员变量和方法,然后通过对象去调用这些成员变量和方法。对于空指针来说,它不指向任何对象,也就没有所谓的成员变量和方法,这个时候用它去调用某些属性和方法,自然就会出现空指针异常了。
1 | Scanner sc = new Scanner(System.in);Test_10 [] students = new Test_10[5];for(int i = 0; i < 5; i++) { String name = sc.next(); int num = sc.nextInt(); students[i] = new Test_10(name,num);} |
每次赋值之前,都通过构造器创建对象,因此避免了空指针的出现
增强for循环
1 | for(遍历出的数据类型 变量名 :要遍历的数组或集合){ |