показывает, как взять ссылку, связанную с одним объектом массива, и присвоить ее другому объекту массива, как это делается с любым другим типом ссылки на объект. В результате and указывают на один объект массива в куче.
Вторая часть ArrayOptions.java показывает, что примитивные массивы работают точно так же, как массивы объектов,
Возврат массива
Предположим, вы пишете метод, который должен возвращать не отдельное значение, а целый набор значений. В таких языках, как С и С++, это сделать нелегко, потому что возвращается из метода не массив, а только указатель на массив.
При этом возникают проблемы, поскольку сложности с управлением жизненным циклом массива могут привести к утечке памяти.
В Java вы просто возвращаете массив. Вам не нужно беспокоиться о нем — массив будет существовать до тех пор, пока он вам нужен, а когда надобность в нем отпадет, массив будет уничтожен уборщиком мусора. В качестве примера рассмотрим возвращение массива String:
//: arrays/IceCream.java // Возвращение массивов из методов 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 IllegalArgumentExceptionC'Set too big"); String[] results = new StringCn]; 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] = FLAVORSCt]: picked[t] = true;
}
return results;
}
public static void main(String[] args) { for(int i = 0; i < 7; i++)
System.out.pri ntin(Arrays.toStri ng(f1 avorSet(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] *///:-
Метод flavorSet() создает массив results с элементами String. Размер массива равен п; он определяется аргументом, передаваемым при вызове метода. Далее метод случайным образом выбирает элементы из массива FLAVORS и помещает их в массив results, возвращаемый методом. Массив возвращается точно так же, как любой другой объект, — по ссылке. При этом не важно, был ли массив создан методом flavorSet(), или он был создан в другом месте. Массив останется с вами все время, пока он будет нужен, а потом уборщик мусора позаботится о его уничтожении.
Из выходных данных видно, что метод flavorSet() действительно выбирает случайное подмножество элементов при каждом вызове.
Многомерные массивы
Создание многомерных массивов в Java не вызывает особых сложностей. Для многомерных массивов примитивных типов каждый вектор заключается в фигурные скобки:
// arrays/MultidimensionalPrimitiveArray.java // Создание многомерных массивов import java.util.*.
public class MultidimensionalPrimitiveArray { public static void main(String[] args) { int[][] a = {
{ 1. 2. 3. }. { 4, 5, 6, }.
}:
System out println(Arrays.deepToString(a));
}
} /* Output: [[1. 2, 3]. [4, 5. 6]] *///:-
Каждая вложенная пара фигурных скобок описывает новую размерность массива.
В этом примере используется метод Java SE5 Arrays.deepToString(). Как видно из выходных данных, он преобразует многомерные массивы в String.
Массив также может создаваться ключевым словом new. Пример создания трехмерного массива выражением new:
//: arrays/ThreeDWithNew.java import java.util.*;
public class ThreeDWithNew {
public static void main(String[] args) {
// Трехмерный массив фиксированной длины:
int[][][] а = new int[2][2][4]:
System.out.pri ntln(Arrays.deepToStri ng(a)):
}
} /* Output:
[[[0. 0. 0, 0]. [0. 0. 0, 0]]. [[0, 0, 0. 0]. [0. 0. 0, 0]]] *///•-
Как видите, если массиву примитивйых типов не заданы явные значения, он автоматически инициализируется значениями по умолчанию. Массивы объектов инициализируются ссылками null.
Векторы массивов, образующих матрицу, могут иметь разную длину (это называется
//: arrays/RaggedArray java import java util *;
public class RaggedArray {
public static void main(Stnng[] args) { Random rand = new Random(47), // Трехмерный массив с векторами переменной длины int[][][] а = new int[гаnd.nextInt(7)][][]; for(int i =0. i < a length. i++) {
a[i] = new int[rand nextlnt(5)][]. for(int j = 0. j < a[i] length. j++)
a[i][j] = new int[rand nextlnt(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]]] */// ~