16.2数组是第一级对象
无论是哪种数组,数组标识符仅仅是一个引用,他指向在堆中创建的一个对象,这个对象用于保存其他对象的引用
16.3 返回一个数组
对于C和C++而言,他们不能返回一个数组,而只能返回一个指向该数组的指针,但这易造成问题,如数组的生命周期,甚至造成内存泄漏,但是对于java而言,你只是直接返回一个数组,而无需为数组负责,只要你需要他,他就会一直存在,垃圾回收器会帮助清理掉他
//: arrays/IceCream.java
// Returning arrays from methods.
import java.util.*;
public class IceCream {
private static Random rand = new Random(47);
static final String[] FLAVORS = {
"Chocolate", "Strawberry", "Vanilla Fudge Swirl",
"Mint Chip", "Mocha Almond Fudge", "Rum Raisin",
"Praline Cream", "Mud Pie"
};
public static String[] flavorSet(int n) {
if(n > FLAVORS.length)
throw new IllegalArgumentException("Set too big");
String[] results = new String[n];
boolean[] picked = new boolean[FLAVORS.length];
for(int i = 0; i < n; i++) {
int t;
do
t = rand.nextInt(FLAVORS.length);
while(picked[t]);
results[i] = FLAVORS[t];
picked[t] = true;
}
return results;
}
public static void main(String[] args) {
for(int i = 0; i < 7; i++)
System.out.println(Arrays.toString(flavorSet(3)));
}
} /* Output:
[Rum Raisin, Mint Chip, Mocha Almond Fudge]
[Chocolate, Strawberry, Mocha Almond Fudge]
[Strawberry, Mint Chip, Mocha Almond Fudge]
[Rum Raisin, Vanilla Fudge Swirl, Mud Pie]
[Vanilla Fudge Swirl, Chocolate, Mocha Almond Fudge]
[Praline Cream, Strawberry, Mocha Almond Fudge]
[Mocha Almond Fudge, Strawberry, Mint Chip]
*///:~
16.4 多维数组
数组中构成矩阵的每一个向量都可以具有任意的长度(粗糙数组)
//: arrays/RaggedArray.java
import java.util.*;
public class RaggedArray {
public static void main(String[] args) {
Random rand = new Random(47);
// 3-D array with varied-length vectors:
int[][][] a = new int[rand.nextInt(7)][][];
for(int i = 0; i < a.length; i++) {
a[i] = new int[rand.nextInt(5)][];
for(int j = 0; j < a[i].length; j++)
a[i][j] = new int[rand.nextInt(5)];
}
System.out.println(Arrays.deepToString(a));
}
} /* Output:
[[], [[0], [0], [0, 0, 0, 0]], [[], [0, 0], [0, 0]], [[0, 0, 0], [0], [0, 0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0], []], [[0], [], [0]]]
*///:~
16.5 泛型与数组
//: arrays/ArrayOfGenericType.java
// Arrays of generic types won't compile.
public class ArrayOfGenericType<T> {
T[] array; // OK //声明一个泛型数组是可以的
@SuppressWarnings("unchecked")
public ArrayOfGenericType(int size) {
//! array = new T[size]; // Illegal //创建一个泛型数组是非法的
array = (T[])new Object[size]; // "unchecked" Warning //但是创建一个Object类型的数组再将它转型则是可以的
}
// Illegal:
//! public <U> U[] makeArray() { return new U[10]; }
} ///:~
16.6 创建测试数据
16.6.3 从Generator中创建数组
16.7 Arrays实用功能
System.arraycopy()方法实现数组的拷贝,他不会执行自动装箱和自动拆包,两个数组必须具有相同的确切类型