【注意1】数组大小在初始化的时候需要确定,且不能修改。
【注意2】数组既可以存储基本数据类型,也可以存储引用数据类型。
数组不是基本数据类型,而是引用数据类型,引用数据类型就需要在对上开辟存储空间后,才能通过引用变量来获取。
创建数组实际会创建两个存储空间:
1、数组名称,也就是数组的引用变量,该变量存储在栈上。
2、数组本身,也就是数组元素所占的存储空间,该空间在堆上。
初始化一个数组包含两步:
1、声明数组:定义引用变量并存在栈上。
2、数组初始化:在堆上开辟空间存储数组元素。
一、数组定义及初始化
数组初始化方式分为静态初始化和动态初始化
1、静态初始化:指定数组中每个元素的值
简单写法:int[] numbers = {1,7,2,0,9};
完整写法:int[] numbers = new int[]{1,7,2,0,9}
2、动态初始化:只确定数组的大小,由系统来指定数组中每个元素的默认值
每个元素的默认值会根据数组类型赋默认值:
int[] numbers =new int[5];(因为每个元素有默认值,此时已经在堆上分配了存储空间,可以通过foreach方法打印每个值)。
Integer num = new Integer[5];(引用数据类型的默认值为null,还没有初始化,也就没在堆上分配存储空间,用foreach打印每个值会报错)
打印结果如下:
3、也可以先声明数组,然后再初始化,例如
打印结果为7个0。
二、引用传递
输出结果如下:可以看出通过num引用修改第一个元素,newNum第一个元素也变了,两个数组引用实际指向的是同一个值。
关于java的内存分配将单独写一篇
三、数组属性和常用方法
数组大小在初始化时已经确定,且不能被修改。如果需要定义可变长的一组数可以用集合(map,set,list等),会有一篇单独将数组及集合的区别与联系。
int[] num = new int[5];
1、length 属性: num.length,获取数组长度,下标从0到length-1。
2、数组遍历:
2.1)for循
输出结果如下:
四、可变参数列表
适用场景:参数类型已知,参数个数不确定,编译器将可变参数当作数组处理
写法:参数类型… 参数列表名称,如下:
int… args
String… args
java把可变参数args当作数组处理,可以通过foreach遍历
1、可变长度
打印结果如下:
可以看出可变参数个数可以为0和多个
2、 注意事项:
1、因参数个数不定,可变参数列表需要放到最后一个参数,否则如果之后有个同类型的参数,程序不知道是可变参数列表的还是独立参数
2、只能有一个可变参数
参考文档:
https://blog.csdn.net/lemon_fight/article/details/83033513