在计算机语言中数组是非常重要的集合类型,大部分计算机语言中数组具有如下三个基本特性:
- 一致性:数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。
- 有序性:数组中的元素是有序的,通过下标访问。
- 不可变性:数组一旦初始化,则长度(数组中预分配的元素个数)不可变。
一维数组: 声明数组,创建数组空间,初始化三步.
格式1: 元素类型[] 数组名(推荐采用) ;
格式2: 元素类型 数组名[] ;
数组元素的类型可以是基本类型,也可以是类或接口。
数组初始化
声明完成就要对数组进行初始化,数组初始化的过程就是为数组每一个元素分配内存空间,并为每一个元素提供初始值。初始化之后数组的长度就确定下来不能再变化了。
数组初始化可以分为静态初始化和动态初始化。
静态初始化
静态初始化就是将数组的元素放到大括号中,元素之间用逗号(,)分隔。
使用场景: 在已知数组的每一个元素内容情况下使用的,这样一次到位。
示例代码如下:
建议此种完整的形式
String[] nameArray = new String[] {"张三", "李四", "王五"};
// 简写形式 String[] nameArray = {"张三", "李四", "王五"};
注意:如果在返回的时候使用简写形式,会编译不通过, return {"张三","李四","王五"}
。这种情况系只能写全称。
动态初始化
动态初始化使用 new 运算符分配指定长度,系统会自动分配初始值。语法如下:new 元素数据类型[数组长度] ;
new 分配数组内存空间后,和类的成员变量的规则保持一致, 不同类型都会有默认值,如下图。
数据类型默认值
数组长度虽然可以动态确定,但定了之后就不可以变。数组有一个length属性,但只能读,不能改。还有一个小细节,不能在给定初始值的同时给定长度,即如下格式是不允许的:
// 简写形式 String[] nameArray = new String[3] {"张三", "李四", "王五"};
以这么理解,因为初始值已经决定了长度,再给个长度,如果还不一致,计算机将无所适从。
对 length 的理解:由于 length 的类型为 int 类型,理论上可以表示的最大长度是 int 类型的最大值。但是这样做在运行行可能会抛出 OOM 异常。实际上一般也用不到长度这么长的数组。
length 的长度要求是非负数。所以长度至少为 0. 而长度为 0 的数组称为空数组在实际生产中也有其特殊用途。
多维数组
二维数组声明
当数组中每个元素又可以带有多个下标时,这种数组就是“多维数组”。
Java中声明二维数组需要有两个中括号,具体有三种语法如下:
元素数据类型[][] 数组变量名; 元素数据类型 数组变量名[][]; 元素数据类型[] 数组变量名[];
二维数组的初始化
二维数组的初始化也可以分为静态初始化和动态初始化。
静态初始化
int[][] intArray = new int[][] { { 1, 2, 3 }, { 11, 12, 13 }, { 21, 22, 23 }};
提示 严格意义上说 Java 中并不存在真正意义上的多维数组,只是一维数组,不过数组中的元素也是数组,以此类推三维数组就是数组的数组的数组了,例如{ { {1, 2}, {3} }, { {21}, {22, 23} } }表示一个三维数组。
动态初始化
语法: new 元素数据类型[高维数组长度] [低维数组长度]
;
不规则数组
由于 Java 多维数组是数组的数组,因此会衍生出一种不规则数组
动态初始化不规则数组比较麻烦,不能使用 new int[4][3]语句,而是需要先初始化较高维数组,然后再分别逐个初始化低维数组。代码如下:
int xxxArray[][] = new int[4][]; //先初始化高维数组为 4 //逐一初始化低维数组 xxxArray[0] = new int[2]; xxxArray[1] = new int[1]; xxxArray[2] = new int[3]; xxxArray[3] = new int[3];
数组的内存结构
数组类型和基本类型是有明显不同的,一个基本类型变量,内存中只会有一块对应的内存空间。但数组有两块:一块用于存储数组内容本身,另一块用于存储内容的位置。
数组的内存结构
数组中常见的 Exception:
- 访问到不存在的角标: ArrayIndexOutOfBoundsException
foreach 关键字
jdk1.5 新增的关键字, 可用于数组, 集合类型的遍历. 隐藏了下标, 数组遍历强烈建议使用. 除非是需要下标值.
foreach - iterate over an array or Iterable
for (类型 变量: 数组) {}
工具类Arrays 的使用
数组拷贝由 java.lang.System 的静态方法
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
// 数组打印
Arrays.toString(array);
和 Arrays.deepToString
// 升序排列
Arrays.sort(array);
数组的赋值
Arrays.copyOf
Arrays.copyOfRange
数组元素的折半查找
binarySearch(Object[] a, Object key)
小案例
public static void main(String[] args) { int[] array = { 1, 5, 3 }; int[] bArray = { 11, 55, 33 }; // 数组拷贝 System.arraycopy(array, 1, bArray, 1, 1); System.out.println(Arrays.toString(bArray)); // 数组打印 System.out.println(Arrays.toString(array)); // 升序排列 Arrays.sort(array); System.out.println(Arrays.toString(array)); }
命令行参数
Java 的 main 方法中有一个字符串数组,这里可以往 String[] args 里面塞值
或者通过 java Demo hello world
进行塞值操作。
参考
- 丁振凡编著,《Java 语言程序设计(第2版)》华东交大版,2014.9