Java创建数组、赋值的四种方式,声明+创建+初始化 详解
@
一、创建数组的四种方式
以int数据类型为例
@Test
public void testNewArray() {
//创建数组
//法一
int[] arr1 = new int[]{1,2,3,4,5};
System.out.println(arr1.length + " " + arr1[2]); //5 3
//Arrays.toString(Object[]) 将数组的元素生成字符串,数组的各个元素使用方括号括着 [ ]
System.out.println(Arrays.toString(arr1)); //[1, 2, 3, 4, 5]
//法二 声明、分配空间并赋值
int[] arr2 = {1,2,3,4};
System.out.println(arr2.length + " " + arr2[2]); //4 3
//法三 声明数组时指定元素个数,然后赋值。此时所有的元素值均为0
int[] arr3 = new int[4];
System.out.println(arr3.length + " " + arr3[3]); //4 0
//法四 声明数组名、开辟空间、赋值
int[] arr4;
arr4 = new int[]{0,1,2,3};
System.out.println(arr4.length + " " + arr4[2]); //4 2
//创建多维数组
int[][] doubleArr1 = {{1,2,3},{4,5,6},{7,8,9}};
int m = 3, n = 4, q = 5;
int[][] doubleArr2 = new int[m][n]; //其中n可以省略
int[][][] tArr = new int[m][n][q]; //其中n、q可以省略
}
注意:
- new 数据类型[]{},其中花括号可以省去,但要在[ ]中填写数组的个数;
- 创建多维数组时 new后面第一个方括号中的元素数量不能省略
二、详解
1、一维数组的声明方式:
type[] arrayName; 或 type arrayName[];
推荐使用第一种格式,因为第一种格式具有更好的可读性,表示type[]是一种引用类型(数组)而不是type类型。建议不要使用第二种方式
int[] intArr;
注:Java语言中声明数组时不能指定其长度(数组中元素的个数),这是因为数组是一种引用类型的变量,因此使用它定义一个变量时,仅仅表示定义了一个引用变量(也就是定一个了一个指针),这个引用变量还未指向任何有效的内存,所以定义数组时不能指定数组的长度。而且由于定义数组仅仅只是定一个引用变量,并未指向任何有效的内存空间,所以还没有内存空间来存储数组元素,因此这个数组也不能使用,只有在数组进行初始化后才可以使用。
2、一维数组的创建
Java中使用关键字new创建数组对象,格式为:数组名 = new 数组元素的类型 [数组元素的个数]
// 创建数组,如果在创建的同时不初始化数组则必须指定其大小
intArr = new int[5];
// 创建数组时,不指定数组大小则必须在创建的同时初始化数组
intArray1 = new int[]{0,1,2};
- 一旦使用new关键字为数组分配了内存空间,每个内存空间存储的内容就是数组元素的值,也就是数组元素就有了初始值,即使这个内存空间存储的内容是空,这个空也是一个值null。也就是说不可能只分配内容空间而不赋初始值,即使自己在创建数组对象(分配内容空间)时没有指定初始值,系统也会自动为其分配
- 基础数据类型的包装类,其默认的初始化值均为null,因为基础数据类型的包装类创建的数组属于引用数组(对象数组),对象数组默认的初始化值都是null。
3、一维数组的初始化
数组的初始化分为静态初始化、动态初始化和默认初始化:
- 静态初始化是数组在初始化时由程序员显式指定每个数组元素的初始值而数组长度由系统决定。
- 动态初始化是数组在初始化时只指定数组长度,由系统为数组元素分配初始值。
//a、数组静态初始化的语法格式:
arrayName = new type[]{element1,element2,element3...};
// 或者使用简化的语法格式:
arrayName = {element1,element2,element3...}
//b、数组动态初始化的语法格式:
arrayName = new type[length];
附:静态初始化时不能指定元素个数,而动态初始化时则必须指定元素个数。静态初始化时数组能够知道元素的个数所以不需要指定,而动态初始化时数组元素个数未知 因此必须指定。
// 静态初始化
int intArray2 [] = new int []{20,21,22};
// 静态初始化简化方式
int intArray3 [] = {30,31,32};
// 动态初始化
int [] intArray4 = new int [3];
// 错误写法:静态初始化不能指定元素个数
// int intErrorArray5[] = new int[3]{50,51,52};
// 错误写法:动态初始化必须指定元素个数
// int intErrorArray6[] = new int[];
注:一维数组这一块记住两点,数组声明的时候是不能指定大小的,也就是说等号左边的中括号中不能包含数字。另外一旦使用new关键字那么肯定在内存中为数组分配了空间,则必然数组有默认值。数组是对象数据类型
注:不要静态初始化和动态初始化同时使用,也就是说不要再进行数组初始化时,既指定数组长度,也为每个数组元素分配初始值。
4、数组进行动态初始化时系统分配初始值的规则
- 数组元素类型是基本类型中的整数类型(byte、short、int、long),则数组元素的初始化默认值是0
- 数组元素类型是基本类型中的浮点类型(float、double),则数组元素的值是0.0
- 数组元素类型是基本类型中的字符类型(char),则数组元素的值是'\u0000'
- 数组元素类型是基本类型中的布尔类型(boolean),则数组元素的值是false
- 数组元素类型是基本类型中的引用类型(类、接口、数组),则数组元素的值是null
详情见https://blog.csdn.net/qq_44700578/article/details/136323990
三、数组存储的弊端
- 一旦初始化,其长度就不可修改,长度不够用、开辟很大的长度会导致空间浪费
- 数组中提供的方法非常有限。添加、删除、插入等操作 效率很低【为了保证元素的内存地址连续,添加或删除元素时,涉及到前移或者后移】
- 扩容麻烦,只能新建一个更大的数组,将元素一个一个移进去,效率低
- 获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用
- 数组存储数据的特点:有序、可重复。对于无序、不可重复的需求,不能满足
为解决以上问题、灵活运用,提出Java容器的概念
参考https://blog.csdn.net/u014199097/article/details/50551731