Array
Array是引用类型, 它是存储长度固定的结构, 存储的元素必须同类型
?? 长度在创建时被固定,之后再也不能更改
each item in an array is called an element, accessed by its numerical index(index从0开始)
数组的声明
数组的声明包含两个部分: 数组的类型和数组的名字
数组的类型写作type[]
, type
是数组元素的类型, []
表示该数组类型变量指向一个数组对象
? 数组长度在声明时不指定
数组声明并不真正的在内存中创建一个数组对象,只是告知编译器此处有一个变量将指向数组类型
? 多维数组遵从上述声明定义, 实质上Java中并没有多维数组的概念。多维数组只是元素类型是数组的数组而已
public void declareArray() {
int[] anArray;
/* 多维数组声明,数组元素类型是int[] */
int[][] arrayOfArray;
}
数组的实例化和访问
实例化一个数组对象, 需要使用new
操作符. 实例化时可显式的指定数组的长度,也可让编译器推断出长度(只能在声明的同时使用)
数组对象通过索引访问它存储的元素, 数组对象的长度通过属性length
可以获取
public void initializeArray() {
anArray = new int[10]; // 显式的指定长度
arrayOfArray = new int[10][4]; // 由外到内指定各维度数组对象的长度,10行4列
anArray = { 1, 2 }; // 错误: 推断长度只能在声明时使用
int[] anArr = {1, 2}; // 推断长度
}
数组操作
对于常见的数组操作,如复制、排序、查询元素等,Java提供了一个工具类java.util.Arrays
import java.util.Arrays;
import java.util.stream.Stream;
public void manipulateArray() {
String[] arraySource = {"A", "B", "C", "D"};
/* 复制 "B" "C" */
String[] arrayTo = Arrays.copyOfRange(arraySource, 1, 3);
/* 排序 - 数组元素是引用类型的,可以提供一个Comparator*/
Arrays.sort(arraySource, (o1, o2)->{ return o1.compareTo(o2); });
/* 查询 */
int indexOfValue = Arrays.binarySearch(arraySource, "B");
/* 判断相等 */
boolean addressEquals = Arrays.equals(arraySource, arrayTo); // 判断两个数组变量, 是否指向同一个地址
boolean elementsEquals = Arrays.equals(arraySource, 1, 3, arrayTo, 1, 3); // 指定区间内的数组元素是否一一相等
/* 转换为字符串 */
String arrayStr = Arrays.toString(arraySource);
/* 转换为流 - 流具备非常好的性质 */
Stream strStream = Arrays.stream(arraySource);
strStream.map(elem -> elem + "|").forEach(System.out::print);
}
System.arraycopy()
提供了快速复制操作,将一个数组的元素复制到另一个元素上
public void copyArray() {
String[] arrayFrom = {"A", "B", "C", "D"};
String[] arrayTo = new String[2];
System.arraycopy(arrayFrom, 1, arrayTo, 0, 2);
}