При необходимости одну переменную массива можно скопировать в другую, но в этому случае обе переменные будут ссылаться на один и тот же массив.
1 2 |
int[] luckyNumbers = smallPrimes; luckyNumbers[5] = 12; // Теперь элемент smallPrimes[5] также равен 12. |
Результат копирования переменных массивов показан на рис.1.
Рис.1. Копирование переменной массива
Если необходимо скопировать все элементы одного массива в другой, следует использовать метод copyTo() из класса Arrays. Его вызов выглядит следующим образом:
1 |
int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers, luckyNumbers.length); |
Вторым параметром является длина нового массива. Обычно этот метод применяется для увеличения размера массива:
1 |
luckyNumbers = Arrays.copyOf(luckyNumbers, 2 * luckyNumbers.length); |
Дополнительные элементы заполняются нулями, если массив содержит числа, и false — если значения типа boolean. В противоположность этому, если длина нового массива меньше длины исходного, то копируются только начальные элементы.
До появления Java SE 6 для копирования элементов массива использовался метод arrayCopy класса System. Синтаксис этого вызова выглядит следующим образом:
1 |
System.arrayCopy(from, fromIndex, to, toIndex, count); |
Массив to должен иметь достаточный размер, чтобы в нем уместились все копируемые элементы.
Ниже приведен фрагмент кода, результаты которого показаны на рис.2. Вначале создаются два массива, а затем последние четыре элемента первого массива копируются во второй. Копирование исходного массива начинается с элемента с номером 2, а в целевой массив копируемые данные помещаются, начиная с элемента с номером 3.
1 2 3 4 5 |
int[] smallPrimes = {2, 3, 5, 7, 11, 13}; int[] luckyNumbers = {1001, 1002, 1003, 1004, 1005, 1006, 1007}; System.arrayCopy(smallPrimes, 2, luckyNumbers, 3, 4); for(int i = 0; i<luckyNumbers.length; i++) System.out.println(i + ": " + luckyNumbers[i]); |
Выполнение данного фрагмента приводит к следующему результату:
1 2 3 4 5 6 7 |
0: 1001 1: 1002 2: 1003 4: 5 5: 7 6: 11 7: 13 |
Рис.2. Копирование элементов массива.
Массив в языке Java значительно отличается от массива в C++, располагающегося в стеке. Однако переменную массива можно условно сравнить с указателем на динамически созданный массив. Таким образом, выражение Java:
1 |
int[] a = new int[100]; // Java |
можно сравнить с выражением C++
1 |
int* a = new int[100]; // С++ |
но оно существенно отличается от следующего:
1 |
int a[100]; // C++ |
В языке Java операция [] по умолчанию проверяет диапазон изменения индексов. Кроме того, в языке Java не поддерживается арифметика указателей — нельзя увеличить указатель a, чтобы обратиться к следующему элементу массива.