数组是一种数据结构,用来存储同一类型值的集合。通过一个整型下标可以访问数组中的每一个值。
在声明数组变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量的名字。例如:
int[] a;
这条语句只是声明了变量a,并没有将a初始化为一个真正的数组,使用new运算符创建数组。
int[] a = new int[10];
创建一个数字数组时,所有元素都初始化为0,boolean数组的元素初始化为false,对象数组的元素初始化为null。
使用数组的length属性获取数组中的元素个数。例如:array.length。
注意:数组的下标从0开始。另外,在java中允许数组长度为0。
数组一旦创建,就不能再改变它的大小了。
1 for each循环
java有一种很强的循环结构,可以用来依次处理数组中的每一个元素(其他类型的元素集合亦可)而不必为指定下标值而分心。其格式为:
for(variable : collection) {
statement //语句块
}
collection这一集合表达式必须是一个数组或者实现了Iterable接口的类对象(比如ArrayList)
2 数组初始化以及匿名数组
java提供了一种创建数组对象并同时赋予初始值的简化书写形式。例如:
int[] a = {1,2,3,4};
创建匿名数组:
new int[]{1,2,3,4}
这种表示法将创建一个新的数组并利用括号中提供的值进行初始化,数组的大小就是初始值的个数。使用这种语法形式可以在不创建变量的情况下重新初始化一个数组。
3 数组拷贝
在java中,允许将一个数组变量拷贝给另一个数组变量。这时,两个变量将引用同一个数组。
int[] a = {1,2,3,4};
int[] b = a;
b[1] = 5; //这时候a[1]也等于5
使用Arraysll类的copyOf()方法可以将一个数组的所有值拷贝到新的数组中去。
static int[] copyOf(int[] original, int newLength)
original指原数组,newLength指新的数组长度。如果新数组长度小于原数组则只拷贝最前面的数据元素。相反,则剩余的部分会进行初始化。例如:
int[] c = Arrays.copyOf(a,a.length+5);
这个方法通常用来增加数组的大小
4 数组排序
对数值型数组排序可以使用Arrays类中的sort方法。例如:
int[] a = {1,7,4,5,6,3};
Arrays.sort(a);
这个方法使用了优化的快速排序算法。快速排序算法对大多数集合来说都是效率比较高的。
5. Arrays类常用API说明
-
static String toString(type[] a)
返回包含a中数据元素的字符串,这些数据元素放在括号内,并用逗号分隔.
参数:a 类型为 int、long、short、char、byte、boolean、float或double的数组
-
static String deepToString(Object[] a)
返回多维数组元素的字符串形式
-
static type[] copyOf(type[] original, int newLength)
-
static T[] copyOfRange(T[] original, int from, int to)
返回与original类型相同的一个数组,其长度为length或者to-from,数组元素为original的值。
参数:
original 原始数组
newLength 新数组长度
from 起始下标
to 终止下标
-
static void sort(type[] a)
-
sort(type[] a, int fromIndex, int toIndex)
采用优化后的快速排序算法对数组进行排序
参数:
a 类型为int、long、short、char、byte、boolean、float或double的数组
fromIndex 起始下标
toIndex 终止下标
-
static void parallelSort(type[] a)
同sort(),但是采用的是并行排序,当数据量够大时拥有更好的性能 -
static type binarySearch(type[] a, type key)
-
static int binarySearch(type[] a, int fromIndex, int toIndex,type key)
采用二分搜索算法查找值key。如果查找成功则返回相应的下标值;否则返回一个负数值r。-r-1是为保持a有序key应插入的位置。
参数:
a 类型为int、long、short、char、byte、boolean、float或double的数组
fromIndex 起始下标
toIndex 结束下标
key 同a的数据元素类型相同的值。
-
static void fill(type[] a, type val)
将数组的所有元素值设置为val。
参数:
a 类型为int、long、short、char、byte、boolean、float或double的数组
val 与a数据元素类型相同的一个值
-
static boolean equals(type[] a1, type[] a2)
如果两个数组大小相同并且下标对应的元素相同则返回true。
参数: a1和a2 类型为int、long、short、char、byte、boolean、float或double的数组
-
static boolean deepEquals(Object[] a1, Object[] a2)
判断两个多维数组是否相等。数组元素为基本数据类型时,依次比较值;数组元素为引用数据类型时,依次调用元素的 equals() 方法进行比较。即如果两个多维数组被认为是相等的,则两个多维数组中应包含相同顺序的相同元素。
-
static List asList(T… a)
将数组转为集合
参数:a 任意类型的数组
注意:该方法返回的是 Arrays 内部静态类 ArrayList,而不是我们平常使用的ArrayList,,该静态类ArrayList没有覆盖父类的add(), remove()等方法,所以如果直接调用,会报UnsupportedOperationException 异常
-
static int hashCode(type a[])
返回数组的哈希值
参数:a 类型为int、long、short、char、byte、boolean、float或double的数组
-
static int deepHashCode(Object a[])
返回多维数组的哈希值
参数:a 类型为int、long、short、char、byte、boolean、float或double的数组
-
static Stream stream(T[] array)
返回数组的流 (Stream)
-
static void setAll(T[] array, IntFunction<? extends T> generator)
设置指定数组的所有元素,并使用提供的生成器函数计算每个元素。
-
static void parallelSetAll(T[] array, IntFunction<? extends T> generator)
让数组中的所有元素,并行地使用方法提供的生成器函数来计算每个元素 (一元操作),当数据规模较大时,会有更好的性能。
6 多维数组
多维数组可以使用多个下标访问数组元素,它适用于表示表格或者更加复杂的排列形式。
java实际上上没有多维数组,只有一维数组,多维数组实际上是“数组的数组”。
java中声明一个二维数组比较简单,比如:
int[][] a = new int[4][4];
一般java中多维数组用到二维数组比较多。三维四维等很少见。