前言
数组是多个相同类型按一定顺序排列的集合,并使用一个名字来命名,并通过编号的方式对这些数据进行统一管理
常见概念:数组名,下标(索引), 元素 , 数组长度
概述
-
数组本身是引用数据类型,而数组中的元素可以是任意数据类型,包括基本数据类型和引用数据类型。
-
创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址
-
数组的长度一旦确定,便不能修改
-
可以通过下标(索引)来查找指定位置的元素
数组的分类
按照维度:一维数组,二维数组,三维数组。。。。
按照元素的类型:基本数据类型数组,引用数据类型元素的数组(即对象数组)
一维数组
正确的初始化:
int[] array; // 声明
array=new int[]{1,2,3,4,5}; // 静态初始化,即初始化和赋值同时进行
String[] str=new String[5]; // 动态初始化,即初始化和赋值过程分开进行
错误的写法:
int[] a=new int[5]{1,2,3,4,5};
int[] b=new int[];
int[5] c=new int[5];
数组的动态赋值
String str = new STring[5]; // 初始化一个数组
// 给数组赋值,数组下标是从0开始
str[0]="张三";
str[1]="里斯"
。。。。。// 长度不能超过数组定义的长度,eg:本例中数组长度为5,所以最大数组下标为4.
获取数组长度
【数组名】.length
数组的默认初始化值
-
整型:0
-
浮点型:0.0
-
char型:0 (注意此处零是这样的 ‘0’ 它不等于0,是个字符型)
-
Boolean型:false
-
引用数据类型: null
二维数组
对于二维数组,可以看作是一维数组array1又增加了一个一维数组array2的元素而存在,从数组底层的运行机制来看,并没有多维数组
初始化
正确写法:
int[][] array=new int[][]{{1,2,3},{1,2},{1}}; // 静态初始化
int[][] a=new int[3][3];
int[][] b=new int[3][];
int[] c[]=new int[][]{{1,2,3},{1,2},{1}};
错误写法
int[][] a=new int[][3];
int[][] b=new int[][];
int[][] c=new int[3][3]{{1,2,3},{1,2,3},{1,2,3}};
长度
【数组名】.length 获取的行有多少行。要想获取每一行有多少个元素则可以用 【数组名】[行下标].length
默认值
int[][] a=new int[3][3];
System.out.printf(a[0]) // 此项输出的是地址值 栈(地址值)与堆(对象)
System.out.printf(a[0][0]) // 输出0
特殊的:
int[][] a=new [3][];
System.out.printf(a[1]) // 输出为null
System.out.printf(a[1][0]) // 报错,空指针异常
解释上述第一个输出为什么是null?
因为没有定义内层元素的长度,存放在堆中的只有3个空的一维数组,而数组属于引用数据类型,所以为null