Java学习树--4数组的学习
阅读原文时间:2021年06月08日阅读:1

数组的声明

    int[] a;
    short[][] as;
    short s,aas[][]; //但通常将[][]放在变量之前
    Object[] ao,aos;
    Collection<?>[] u; //声明具体元素类型未知的数组

数组的创建

数组在创建之前,不能使用,数组的创建有两种,一种是直接使用创建表达式,指定数组的长度,另一个方式是直接对数组进行初始化。在数组创建后,能使用数组的final length变量访问数组的长度。

Exception ae[] = new Exception[3];
Object aao[][] = new Exception[2][3];
int[] factorial = { 1, 1, 2, 6, 24, 120, 720, 5040 };
char ac[] = { ‘n‘, ‘o‘, ‘t‘, ‘ ‘, ‘a‘, ‘ ‘,‘S‘, ‘t‘, ‘r‘, ‘i‘, ‘n‘, ‘g‘ };
String[] aas = { "array", "of", "String", };
ae.length //创建的数组能访问.length属性 

数组的访问

int [] a={1,2,3}
a[0]=2;
a[2]=2;
for(int x:a){System.out.Println(x); } //2 2 2

如果数组的访问出界,会抛出ArrayIndexOutOfBoundsException。

数组的存储异常

ArrayStoreException,数组的创建类型和存储类型不一致引发的异常。

class Point { int x, y; }
class ColoredPoint extends Point { int color; }
class Test {
public static void main(String[] args) {
ColoredPoint[] cpa = new ColoredPoint[10];
Point[] pa = cpa;
System.out.println(pa[1] == null);
try {
pa[0] = new Point(); //实际声明类型是子类型引用
} catch (ArrayStoreException e) {
System.out.println(e);
}
}
}
//This program produces the output:
//true
//java.lang.ArrayStoreException: Point

数组的复制

数组的复制最常规的方法之一,当然就是直接使用for循环。

对于一维数组可以使用 clone()方法,次方法复制的数组是深拷贝

 int[] a={1,2};
        int[] b=a.clone();
        System.out.println(a==b); //fasle
        b[1]++;
        System.out.println(b[1]); //3
        System.out.println(a[1]); //2

System.arraycopy(src,srcPos,dest,destPos,length);
src:原数组
srcPos:从原数组的起始位置+
dest:目标数组
destPos:目标数组开始的的位置
length:要Copy的数组长度

Arrays.copyOf(original, newLength);//返回一个新的数组 coriginal:原数组 newLength:新数组的长度 注意:1. 新数组的长度   如果写的比原数组的长度小,那就只复制到哪里   如果写的比原数组的长度长,没复制的地方,会是默认值

注意以上的方法都是一维数组的复制方式,也只适用一维数组,其他维数组的复制方式是拆分成为一维数组在进行复制。
数组的拼接也可以借助数组的复制实现

数组的辅助类Arrays

常需要用到的方法

Arrays.copyOf() Arrays.copyOfRange([]origin,from,to) 这两个静态方法实现了全部的基本数据类型数组的复制,后者是数组的范围复制

Arrays.binarySearch([]array,key) Arrays.binarySearch([]array,from,to,key) 使用了二分查找算法实现数组内元素的查找和范围查询,这个方法实现了泛型T,借助比较器也能使用查询方法。

Arrays.compare([]a,[]b) 比较两个数组语序上是否相等,如果返回0,表面数组相等,返回1,代表数组a大

Arrays.equals([]a,[]b) Arrays.equals(a, b) == (Arrays.compare(a, b) == 0);Arrays.equals(a, b) 返回真,那么Arrays.hashCode(a) == Arrays.hashCode(b).

Arrays.fill([]a,key) 用key填充数组,也有范围填充重载

Arrays.sort([]a) 数组排序,也可以进行范围内的数组排序

Arrays.mismatch([]a,[]b) 比较两个数组语序上的差异,如果数组相等返回-1,返回两个数组开始不同的第一个索引。索引的范围是0到最小数组的长度,这个方法可以计算两个数组的相同前缀,前缀长度就是返回值