多维数组
public class RaggedArray {
public static void main(String[] args) {
Random rand = new Random(47);
int[][][] a = new int[rand.nextInt(3)][][];
for (int i = 0; i < a.length; i++) {
a[i] = new int[rand.nextInt(3)][];
for (int j = 0; j < a[i].length; j++) {
a[i][j] = new int[rand.nextInt(5)];
}
}
System.out.println(Arrays.deepToString(a));
}
}
[[[0, 0, 0], [0]], [[0, 0, 0, 0]]]
第一个new创建了数组,其第一维的长度是由随机数决定的,其他维的长度则没有定义。位于for循环内第二个new会决定第二维的长度,直到碰到第三个new,第三维的长度才得以确定。
打印多维数组 Arrays.deepToString()
数组与泛型
通常,数组与泛型不能很好的结合,因为你不能实例化具有参数类型化的数组abc
例如
Peel<String>[] peel = new Peel<String>[5]; //语法错误
不能创建泛型数组这一说法并不十分准确,编译器确实不能让你实例化泛型数组,但是可以
创建对这种数组的引用
List<String>[] ls;//编译器不会报任何错误
但是可以这样 参数化数组本身的类型
class Peel<T>{
T t;
Peel(T t){
this.t = t;
}
void print(){
System.out.println(t);
}
}
public class Arrays {
public static void main(String[] args) {
Peel<String>[] peels = new Peel[5];
peels[0] = new Peel<String>("abc");
peels[1] = new Peel<>("def");
peels[0].print();
}
}
abc
注意,使用参数化方法而不使用参数化类的方便之处在于:你不必为需要应用的每种不同的类型都使用一个参数去实例化这个类,并且你可以将其定义为静态的。 当然不能总是选用参数化方法而不是参数化类,但是它应该成为首选。
创建测试数据
可以填充整个数组,也可以指定范围只填充数组的某个区域. 但是只能用单一的的数值填充.
//上面Peel类型的例子
Peel<String>[] peels = new Peel[10];
Arrays.fill(peels,0,1,new Peel<String>("ccc"));
Arrays实用功能
java.util类库有一套用于数组的static实用方法,其中有六个基本方法.
equals()用于比较两个数组是否相等(deepEquals()用于多维数组)
fill()用于单一的填充数组
sort()用于对数组排序
binarySearch()用于在已经排序的数组中查找元素.
toString()产生数组的String表示.
hashCode()产生数组的散列码.
Arrays.asList()接受任意的序列或数组作为其参数,并将其转变为List容器
复制数组
public static native void arraycopy(Object src, int srcPos,Object dest, int destPos, int length);
//参数依次是1.源数组2.表示从源数组的什么位置开始复制的偏移量3.目标数组
//4.表示从目标数组的什么位置开始被覆盖的偏移量5.要复制的个数
数组的比较
数组相等的条件是元素个数必须相等,并且对应位置的元素也相等.底层是对每一个元素使用equals()作比较来判断.
(对于基本类型,需要使用基本类型的包装器类的equals()方法)