Что такое массив в java. Java Array
Последнее обновление: 09.11.2018
Массив представляет набор однотипных значений. Объявление массива похоже на объявление обычной переменной, которая хранит одиночное значение, причем есть два способа объявления массива:
Тип_данных название_массива; // либо тип_данных название_массива;
Например, определим массив чисел:
Int nums; int nums2;
После объявления массива мы можем инициализовать его:
Int nums; nums = new int; // массив из 4 чисел
Создание массива производится с помощью следующей конструкции: new тип_данных[количество_элементов] , где new - ключевое слово, выделяющее память для указанного в скобках количества элементов. Например, nums = new int; - в этом выражении создается массив из четырех элементов int, и каждый элемент будет иметь значение по умолчанию - число 0.
Также можно сразу при объявлении массива инициализировать его:
Int nums = new int; // массив из 4 чисел int nums2 = new int; // массив из 5 чисел
При подобной инициализации все элементы массива имеют значение по умолчанию. Для числовых типов (в том числе для типа char) это число 0, для типа boolean это значение false , а для остальных объектов это значение null . Например, для типа int значением по умолчанию является число 0, поэтому выше определенный массив nums будет состоять из четырех нулей.
Однако также можно задать конкретные значения для элементов массива при его создании:
// эти два способа равноценны int nums = new int { 1, 2, 3, 5 }; int nums2 = { 1, 2, 3, 5 };
Стоит отметить, что в этом случае в квадратных скобках не указывается размер массива, так как он вычисляется по количеству элементов в фигурных скобках.
После создания массива мы можем обратиться к любому его элементу по индексу, который передается в квадратных скобках после названия переменной массива:
Int nums = new int; // устанавливаем значения элементов массива nums = 1; nums = 2; nums = 4; nums = 100; // получаем значение третьего элемента массива System.out.println(nums); // 4
Индексация элементов массива начинается с 0, поэтому в данном случае, чтобы обратиться к четвертому элементу в массиве, нам надо использовать выражение nums .
И так как у нас массив определен только для 4 элементов, то мы не можем обратиться, например, к шестому элементу: nums = 5; . Если мы так попытаемся сделать, то мы получим ошибку.
Длина массива
Важнейшее свойство, которым обладают массивы, является свойство length , возвращающее длину массива, то есть количество его элементов:
Int nums = {1, 2, 3, 4, 5}; int length = nums.length; // 5
Нередко бывает неизвестным последний индекс, и чтобы получить последний элемент массива, мы можем использовать это свойство:
Int last = nums;
Многомерные массивы
Ранее мы рассматривали одномерные массивы, которые можно представить как цепочку или строку однотипных значений. Но кроме одномерных массивов также бывают и многомерными. Наиболее известный многомерный массив - таблица, представляющая двухмерный массив:
Int nums1 = new int { 0, 1, 2, 3, 4, 5 }; int nums2 = { { 0, 1, 2 }, { 3, 4, 5 } };
Визуально оба массива можно представить следующим образом:
Одномерный массив nums1
Двухмерный массив nums2
Поскольку массив nums2 двухмерный, он представляет собой простую таблицу. Его также можно было создать следующим образом: int nums2 = new int; . Количество квадратных скобок указывает на размерность массива. А числа в скобках - на количество строк и столбцов. И также, используя индексы, мы можем использовать элементы массива в программе:
// установим элемент первого столбца второй строки nums2=44; System.out.println(nums2);
Объявление трехмерного массива могло бы выглядеть так:
Int nums3 = new int;
Зубчатый массив
Многомерные массивы могут быть также представлены как "зубчатые массивы". В вышеприведенном примере двухмерный массив имел 3 строчки и три столбца, поэтому у нас получалась ровная таблица. Но мы можем каждому элементу в двухмерном массиве присвоить отдельный массив с различным количеством элементов:
Int nums = new int; nums = new int; nums = new int; nums = new int;
foreach
Специальная версия цикла for предназначена для перебора элементов в наборах элементов, например, в массивах и коллекциях. Она аналогична действию цикла foreach , который имеется в других языках программирования. Формальное ее объявление:
For (тип_данных название_переменной: контейнер){ // действия }
Например:
Int array = new int { 1, 2, 3, 4, 5 }; for (int i: array){ System.out.println(i); }
В качестве контейнера в данном случае выступает массив данных типа int . Затем объявляется переменная с типом int
То же самое можно было бы сделать и с помощью обычной версии for:
Int array = new int { 1, 2, 3, 4, 5 }; for (int i = 0; i < array.length; i++){ System.out.println(array[i]); }
В то же время эта версия цикла for более гибкая по сравнению for (int i: array) . В частности, в этой версии мы можем изменять элементы:
Int array = new int { 1, 2, 3, 4, 5 };
for (int i=0; i Сначала создается цикл для перебора по строкам, а затем внутри первого цикла создается внутренний цикл для перебора по столбцам конкретной строки.
Подобным образом можно перебрать и трехмерные массивы и наборы с большим количеством размерностей. Думаю, мало кто из готовящихся к своему первому интервью, при приеме на первую работу в должности (pre)junior программиста, ответит на этот вопрос отрицательно. Или хотя бы усомнится в положительном ответе. Конечно, такая простая структура данных с прямым доступом по индексу - никаких подвохов! Нет, в некоторых языках типа JavaScript или PHP массивы, конечно, реализованы очень интересно и по сути являются много большим чем просто массив. Но речь не об этом, а о «традиционной» реализации массивов в виде «сплошного участка памяти». В этом случае на основании индексов и размера одного элемента просто вычисляется адрес и осуществляется доступ к соответствующему значению. Что тут сложного? Код с контролем времени
class A {
public static void main(String args) {
int n = 8000;
int g = new int[n][n];
long st, en;
// one
st = System.nanoTime();
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
g[i][j] = i + j;
}
}
en = System.nanoTime();
System.out.println("\nOne time " + (en - st)/1000000.d + " msc");
// two
st = System.nanoTime();
for(int i = 0; i < n; i++) {
g[i][i] = i + i;
for(int j = 0; j < i; j++) {
g[j][i] = g[i][j] = i + j;
}
}
en = System.nanoTime();
System.out.println("\nTwo time " + (en - st)/1000000.d + " msc");
}
}
под спойлер
program Time;
uses
Windows;
var
start, finish, res: int64;
n, i, j: Integer;
g: Array of Array of Integer;
begin
n:= 10000;
SetLength(g, n, n);
QueryPerformanceFrequency(res);
QueryPerformanceCounter(start);
for i:=1 to n-1 do
for j:=1 to n-1 do
g := i + j;
QueryPerformanceCounter(finish);
writeln("Time by rows:", (finish - start) / res, " sec");
QueryPerformanceCounter(start);
for i:=1 to n-1 do
for j:=1 to n-1 do
g := i + j;
QueryPerformanceCounter(finish);
writeln("Time by cols:", (finish - start) / res, " sec");
end.
Если есть необходимость копнуть глубже именно в реализацию Java, то просим соискателя понаблюдать за временем выполнения для небольших значений n
. Например, на ideone.com для n=117 «оптимизированный» вариант работает вдвое медленнее. Но для следующего значения n=118 он оказывается уже в 100 (сто) раз быстрее не оптимизированного! Предложите поэкспериментировать на локальной машине. Пусть поиграет с настройками. Несколько слов в оправдание
Хочу сказать несколько слов в оправдание такого способа собеседования при найме. Да, я не проверяю знание синтаксиса языка и владение структурами данных. Возможно, при цивилизованном рынке труда это все работает. Но в наших условиях тотальной нехватки квалифицированных кадров, приходится оценивать скорее перспективную адекватность претендента той работе с которой он столкнется. Т.е. способность научиться, прорваться, разобраться, сделать. Пока лидирует версия, что «виноват» кэш процессора. Т.е. последовательный доступ в первом варианте работает в пределах хэша, который обновляется при переходе за определенную границу. При доступе по столбцам хэш вынужден постоянно обновляться и это занимает много времени. Давайте проверим эту версию в самом чистом виде. Заведем массив и сравним, что быстрее - обработать все элементы подряд или столько же раз обработать элементы массива со случайным номером? Вот эта программа - ideone.com/tMaR2S . Для 100000 элементов массива случайный доступ обычно оказывается заметно быстрее. Что же это означает? Постепенно в лидеры выходит версия про дополнительные действия при переходе от одной строки массива к другой. И это правильно. Осталось разобраться, что же именно там происходит. Теги:
Добавить метки Массив
- это структура данных, которая предназначена для хранения однотипных данных. Массивы в Java работают иначе, чем в C/C++. Особенности: Одномерные Массивы: общая форма объявления Type var-name;
или
type var-name;
Объявление состоит из двух компонентов: типа и имени. type объявляет тип элемента массива. Тип элемента определяет тип данных каждого элемента. Кроме типа int, мы также можем создать массив других типов данных, таких как char, float, double или определяемый пользователем тип данных (объекты класса).Таким образом, тип элемента определяет, какой тип данных будет храниться в массиве. Например: // both are valid declarations
int intArray;
or int intArray;
byte byteArray;
short shortsArray;
boolean booleanArray;
long longArray;
float floatArray;
double doubleArray;
char charArray;
// an array of references to objects of
// the class MyClass (a class created by
// user)
MyClass myClassArray;
Object ao, // array of Object
Collection ca; // array of Collection
// of unknown type
Хотя приведенное выше первое объявление устанавливает тот факт, что intArray является переменной массива, массив фактически не существует. Он просто говорит компилятору, что эта переменная типа integer. Чтобы связать массив int с фактическим физическим массивом целых чисел, необходимо обозначить его с помощью new и назначить int. При объявлении массива создается только ссылка на массив. Чтобы фактически создать или предоставить память массиву, надо создать массив следующим образом: общая форма new применительно к одномерным и выглядит следующим образом: Здесь type указывает тип данных, size — количество элементов в массиве, а var-name-имя переменной массива. Int intArray; //объявление
intArray = new int; // выделение памяти
Int intArray = new int; // объединение
Важно знать, что элементы массива, выделенные функцией new, автоматически инициализируются нулем (для числовых типов), ложью (для логических типов) или нулем (для ссылочных типов). В ситуации, когда размер массива и переменные уже известны, можно использовать литералы. Int intArray = new int{ 1,2,3,4,5,6,7,8,9,10 };
// Declaring array literal
Доступ к каждому элементу массива осуществляется через его индекс. Индекс начинается с 0 и заканчивается на (общий размер)-1. Все элементы могут быть доступны с помощью цикла for. For (int i = 0; i < arr.length; i++)
System.out.println("Element at index " + i +
" : "+ arr[i]);
// Пример для иллюстрации создания array class GFG // allocating memory for 5 integers. //so on... // accessing the elements of the specified array Element at index 0: 10
Element at index 1: 20
Element at index 2: 30
Element at index 3: 40
Element at index 4: 50
Массив объектов создается так же, как элементов данных следующим образом: Student arr = new Student;
StudentArray содержит семь элементов памяти каждый из класса student, в котором адреса семи объектов Student могут быть сохранены. Student объекты должны быть созданы с помощью конструктора класса student и их ссылки должны быть присвоены элементам массива следующим образом: Student arr = new Student;
// Java program to illustrate creating an array of class Student // Elements of array are objects of a class Student. // allocating memory for 5 objects of type Student. // initialize the first elements of the array // initialize the second elements of the array // so on... // accessing the elements of the specified array Получаем: Element at 0: 1 aman
Element at 1: 2 vaibhav
Element at 2: 3 shikar
Element at 3: 4 dharmesh
Element at 4: 5 mohit
Что произойдет, если мы попытаемся получить доступ к элементу за пределами массива? Многомерные массивы — это массивы массивов, каждый элемент которых содержит ссылку на другой массив. Создается путем добавления одного набора квадратных скобок () для каждого измерения. Рассмотрим пример: Int intArray = new int; //a 2D array or matrix
int intArray = new int; //a 3D array
class multiDimensional // printing 2D array System.out.println(); Output:
2 7 9
3 6 1
7 4 2
Как и переменные, мы можем передавать массивы в методы. // Java program to demonstrate
// passing of array to method
class Test
{
// Driver method
public static void main(String args)
{
int arr = {3, 1, 2, 5, 4};
// passing array to method m1
sum(arr);
}
public static void sum(int arr)
{
// getting sum of array values
int sum = 0;
for (int i = 0; i < arr.length; i++)
sum+=arr[i];
System.out.println("sum of array values: " + sum);
}
}
На выходе получим: sum of array values: 15 Как обычно, метод также может возвращать массив. Например, ниже программа возвращает массив из метода m1. // Java program to demonstrate
// return of array from method
class Test
{
// Driver method
public static void main(String args)
{
int arr = m1();
for (int i = 0; i < arr.length; i++)
System.out.print(arr[i]+" ");
}
public static int m1()
{
// returning array
return new int{1,2,3};
}
}
Каждый массив имеет связанный объект класса, совместно используемый со всеми другими массивами с тем же типом компонента. // Java program to demonstrate
// Class Objects for Arrays
class Test
{
public static void main(String args)
{
int intArray = new int;
byte byteArray = new byte;
short shortsArray = new short;
// array of Strings
String strArray = new String;
System.out.println(intArray.getClass());
System.out.println(intArray.getClass().getSuperclass());
System.out.println(byteArray.getClass());
System.out.println(shortsArray.getClass());
System.out.println(strArray.getClass());
}
}
class +" ");
}
}
}
Клон многомерного массива (например, Object ) является копией и это означает, что он создает только один новый массив с каждым элементом и ссылкой на исходный массив элементов, но вложенные массивы являются общими. // Java program to demonstrate
// cloning of multi-dimensional arrays
class Test
{
public static void main(String args)
{
int intArray = {{1,2,3},{4,5}};
int cloneArray = intArray.clone();
// will print false
System.out.println(intArray == cloneArray);
// will print true as shallow copy is created
// i.e. sub-arrays are shared
System.out.println(intArray == cloneArray);
System.out.println(intArray == cloneArray);
}
}
Массив – это набор однотипных переменных, на которые ссылаются по общему имени. Массивы можно создавать из элементов любого типа, и они могут иметь одно или несколько измерений. К определенному элементу в массиве обращаются по его индексу (номеру). В заметке мы рассмотрим обработку одномерных и двумерных массивов. Одномерный массив – это, по существу, список однотипных переменных. Чтобы создать массив, сначала следует создать переменную массива (array variable) желательного типа. Общий формат объявления одномерного массива: Общий формат new в применении к одномерным массивам имеет вид: Как только вы выделили память для массива, можно обращаться к определенному элементу в нем, указывая в квадратных скобках индекс. Нумерация элементов массива начинается с нуля. Имена массивов являются ссылками. Возможна комбинация объявления переменной типа массив с выделением массиву памяти непосредственно в объявлении: Рассмотрим код программы, выполняющей замену отрицательных элементов массива на максимальный элемент: Public class FindReplace {
public static void main(String args) {
int myArray; // объявление без инициализации
int mySecond = new int; /* выделение памяти
с инициализацией значениями по умолчанию */
int a = {5, 10, 0, -5, 16, -2}; // объявление с инициализацией
int max = a;
for (int i = 0; i < a.length; i++) {
if (a[i]<0)
a[i] = max;
mySecond[i] = a[i];
System.out.println("a[" + i + "]=" + a[i]);
}
myArray = a; // установка ссылки на массив a
}
}
В результате выполнения будет выведено: Присваивание mySecond[i] = a[i] приведет к тому, что части элементов массива mySecond , а именно шести, будут присвоены значения элементов массива a . Остальные элементы mySecond сохранят значения, полученные при инициализации, то есть нули. Если же присваивание организовать в виде mySecond = a или myArray = a , то оба массива участвующие в присваивании получат ссылку на массив a , то есть оба будут содержать по шесть элементов и ссылаться на один и тот же участок памяти. Public class MonthDays {
public static void main(String args) {
int month_days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
System.out.println("Апрель содержит " + month_days + " дней.");
}
}
В результате выполнения программы на экран будет выведено: Апрель содержит 30 дней. Замечание:
Java
делает строгие проверки, чтобы удостовериться, что вы случайно не пробуете сохранять или читать значения вне области хранения массива. Исполнительная система Java
тоже делает тщательные проверки, чтобы убедиться, что все индексы массивов находятся в правильном диапазоне. (В этом отношении Java
существенно отличается от языков C/C++
, которые не обеспечивают проверки границ во время выполнения). В Java многомерные массивы
– это, фактически, массивы массивов. Они выглядят и действуют подобно регулярным многомерным массивам. Однако имеется пара тонких различий. Чтобы объявить многомерную переменную массива, определите каждый дополнительный индекс, используя другой набор квадратных скобок. Например, следующее утверждение объявляет переменную двумерного массива с именем twoD: Public class Matrix {
private int a;
Matrix(int n, int m) {
// создание и заполнение с random
a = new int[n][m];
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
a[i][j] = (int) (Math.random()*5);
show();
}
public Matrix(int n, int m, int k) {
// создание и заполнение с random
a = new int[n][m];
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
a[i][j] = k;
if (k != 0)
show();
}
public void show() {
System.out.println("Матрица:" + a.length + " на " + a.length);
for (int i = 0; i < a.length; ++i) {
for (int j = 0; j < a.length; ++j)
System.out.print(a[i][j] + " ");
System.out.println();
}
}
public static void main(String args) {
int n = 2, m = 3, z = 4;
Matrix p = new Matrix(n, m);
Matrix q = new Matrix(m, z);
Matrix r = new Matrix(n, z, 0);
for (int i = 0; i < p.a.length; ++i)
for (int j = 0; j < q.a.length; ++j)
for (int k = 0; k < p.a[i].length; ++k)
r.a[i][j] += p.a[i][k]*q.a[k][j];
System.out.println("Произведение матриц: ");
r.show();
}
}
Так как значения элементам массивов присваиваются при помощи метода random() , то одним и вариантов выполнения кода может быть следующий: > javac Matrix.java
> java Matrix
Матрица:2 на 3
3 2 0
3 3 1
Матрица:3 на 4
1 2 2 3
3 2 3 2
1 2 3 2
Произведение матриц:
Матрица:2 на 4
9 10 12 13
13 14 18 17
Следующий пример демонстрирует копирование массива: Public class ArrayCopyDemo {
public static void main(String args) {
int mas1 = {1,2,3}, mas2 = {4,5,6,7,8,9};
System.out.print("mas1: ");
show(mas1);
System.out.print("mas2: ");
show(mas2);
// копирование массива mas1 в mas2
System.arraycopy(mas1, 0, mas2, 2, 3);
/* 0 - mas1 копируется начиная с нулевого элемента
* 2 - элемент, с которого начинается замена
* 3 - количество копируемых элементов
*/
System.out.println("\n после arraycopy(): ");
System.out.print("mas1: ");
show(mas1);
System.out.print("\nmas2: ");
show(mas2);
}
private static void show(int mas) {
for (int i = 0; i < mas.length; ++i)
System.out.print(" " + mas[i]);
}
}
Результат выполнения программы: > javac ArrayCopyDemo.java
> java ArrayCopyDemo
mas1: 1 2 3mas2: 4 5 6 7 8 9
после arraycopy():
mas1: 1 2 3
mas2: 4 5 1 2 3 9
Существует иная форма, которая может использоваться для объявления массива: Int al = new int;
int a2 = new int;
Перебор многомерных массивов в цикле
int nums = new int
{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int i = 0; i < nums.length; i++){
for(int j=0; j < nums[i].length; j++){
System.out.printf("%d ", nums[i][j]);
}
System.out.println();
}
Давайте разберемся. Например, на Java. Просим ничего не подозревающего претендента создать массив целых чисел n
x n
. Человек уверено пишет что-то в духе:
int g = new int[n][n];
Отлично. Теперь просим инициализировать элементы массива чем-нибудь. Хоть единицами, хоть суммой индексов. Получаем:
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
g[i][j] = i + j;
}
}
Даже чаще пишут
for(int i = 0; i < g.length; i++) {
for(int j = 0; j < g[i].length; j++) {
g[i][j] = i + j;
}
}
что тоже повод для беседы, но сейчас речь о другом. Мы ведь пытаемся выяснить, что человек знает и посмотреть, как он думает. По этому обращаем его внимание на тот факт, что значения расположены симметрично и просим сэкономить на итерациях циклов. Конечно, зачем пробегать все значения индексов, когда можно пройти только нижний треугольник? Испытуемый обычно легко соглашается и мудро выделяя главную диагональ старательно пишет что-то в духе:
for(int i = 0; i < n; i++) {
g[i][i] = 2* i;
for(int j = 0; j < i; j++) {
g[j][i] = g[i][j] = i + j;
}
}
Вместо g[i][i] = 2* i;
часто пишут g[i][i] = i + i;
или g[i][i] = i << 1;
и это тоже повод поговорить. Но мы идем дальше и задаем ключевой вопрос: На сколько быстрее станет работать программа?
. Обычные рассуждения такие: почти в 2 раза меньше вычислений индексов; почти в 2 раза меньше вычислений значений (суммирование); столько же присваиваний. Значит быстрее процентов на 30. Если у человека за плечами хорошая математическая школа, то можно даже увидеть точное количество сэкономленных операций и более аргументированную оценку эффективности оптимизации.
Теперь самое время для главного удара. Запускаем оба варианта кода на каком-нибудь достаточно большом значении n
(порядка нескольких тысяч), например, так .
Что же мы видим? Оптимизированный вариант работает в 10-100 раз медленнее! Теперь самое время понаблюдать за реакцией претендента на должность. Какая будет реакция на необычную (точнее обычную в практике разработчика) стрессовую ситуацию. Если на лице подзащитного изобразился азарт и он стал жать на кнопочки временно забыв о Вашем существовании, то это хороший признак. До определенной степени. Вы ведь не хотите взять на работу исследователя, которому плевать на результат проекта? Тогда не задавайте ему вопрос «Почему?». Попросите переделать второй вариант так, чтобы он действительно работал быстрее первого.
Теперь можно смело заниматься некоторое время своими делами. Через пол часа у Вас будет достаточно материала, для того, чтобы оценить основные личностные и профессиональные качества претендента.
Кстати, когда я коротко описал эту задачку на своем рабочем сайте, то наиболее популярный комментарий был «Вот такая эта Ваша Java кривая». Специально для них выкладываю код на Великом и Свободном. А счастливые обладатели Free Pascal под Windows могут заглянуть
В приведенном коде на Паскале я убрал «запутывающие» моменты и оставил только суть проблемы. Если это можно назвать проблемой.
Какие мы в итоге получаем вопросы к подзащитному?
1. Почему стало работать медленнее? И поподробнее…
2. Как сделать инициализацию быстрее?
Кстати, а всем понятно, что происходит?
По духу это похоже на «собеседованию» при наборе легионеров в древнем Риме. Будущего вояку сильно пугали и смотрели краснеет он или бледнеет. Если бледнеет, то в стрессовой ситуации у претендента кровь отливает от головы и он склонен к пассивной реакции. Например, упасть в обморок. Если же соискатель краснел, то кровь у него к голове приливает. Т.е. он склонен к активным действиям, бросаться в драку. Такой считался годным.
Ну и последнее. Почему я рассказал об этой задаче всем, а не продолжаю использовать её на собеседованиях? Просто, эту задачу уже «выучили» потенциальные соискатели и приходится использовать другие.
Собственно на этот эффект я обратил внимание именно в связи с реальной задачей обработки изображений. Ситуация была несколько запутанная и я не сразу понял почему у меня так просел fps после рефакторинга. А вообще таких чуднЫх моментов наверное много накопилось у каждого.
Тут мне совершенно справедливо указали (Big_Lebowski), что перестановка циклов меняет результаты в пользу последовательного варианта. Пришлось для чистоты эксперимента поставить цикл для разогрева. Заодно сделал несколько повторов, чтобы вывести среднее время работы как советовал leventov. Получилось так ideone.com/yN1H4g . Т.е. случайный доступ к элементам большого массива на ~10% медленнее чем последовательный. Возможно и в правду какую-то роль может сыграть кэш. Однако, в исходной ситуации производительность проседала в разы. Значит есть еще что-то.Инициализация и доступ к массиву
Как создать массив в Java
var-name = new type ;
Получение массива — это двухэтапный процесс. Во-первых, необходимо объявить переменную нужного типа. Во-вторых, необходимо выделить память, которая будет содержать массив, с помощью new, и назначить ее переменной. Таким образом, в Java все массивы выделяются динамически.Литералы массива
Доступ к элементам массива Java с помощью цикла for
// целых чисел, помещает некоторые значения в массив,
// и выводит каждое значение.
{
{
int arr;
arr = new int;
arr = 10;
arr = 20;
arr = 30;
arr = 40;
arr = 50;
for (int i = 0; i < arr.length; i++)
System.out.println("Element at index " + i +
" : "+ arr[i]);
}
}
В итоге получаем:Массивы объектов
// objects
{
public int roll_no;
public String name;
Student(int roll_no, String name)
{
this.roll_no = roll_no;
this.name = name;
}
}
public class GFG
{
public static void main (String args)
{
// declares an Array of integers.
Student arr;
arr = new Student;
arr = new Student(1,"aman");
arr = new Student(2,"vaibhav");
arr = new Student(3,"shikar");
arr = new Student(4,"dharmesh");
arr = new Student(5,"mohit");
for (int i = 0; i < arr.length; i++)
System.out.println("Element at " + i + " : " +
arr[i].roll_no +" "+ arr[i].name);
}
}
Компилятор создает исключение ArrayIndexOutOfBoundsException, указывающее, что к массиву был получен доступ с недопустимым индексом. Индекс либо отрицательный, либо больше или равен размеру массива.Многомерные
{
public static void main(String args)
{
// declaring and initializing 2D array
int arr = { {2,7,9},{3,6,1},{7,4,2} };
for (int i=0; i< 3 ; i++)
{
for (int j=0; j < 3 ; j++)
System.out.print(arr[i][j] + " ");
}
}
}Передача массивов в метод
Возврат массивов из методов
Объекты класса
Одномерные массивы в Java
type var-name ;
Здесь type объявляет базовый тип массива; var-name – имя переменной массива. Базовый тип определяет тип данных каждого элемента массива. Например, объявление одномерного массива int-компонентов с именем month_days имеет вид:
int month_days ;
Хотя это объявление и устанавливает факт, что month_days является переменной массива, никакой массив в действительности не существует. Фактически, значение month_days установлено в null (пустой указатель), который представляет массив без значения. Чтобы связать month_days с фактическим, физическим массивом целых чисел, нужно выделить память для него, используя операцию new , и назначать ее массиву month_days ; new – это специальная операция, которая распределяет память.
array-var = new type ;
где type – тип распределяемых данных, size – число элементов в массиве, array-var– переменная, которая связана с массивом. Чтобы использовать new для распределения памяти под массив, нужно специфицировать тип и число элементов массива. Элементы в массиве, выделенные операцией new , будут автоматически инициализированы нулями. Следующий пример распределяет память для 12-элементного массива целых чисел и связывает его с переменной month_days .
month_days = new int;
После того как эта инструкция выполнится, month_days будет ссылаться на массив из двенадцати целых чисел. Затем все элементы в массиве будут инициализированы нулями.
Процесс получения массива включает два шага. Во-первых, следует объявить переменную массива желательного типа. Во-вторых, необходимо выделить память, которая будет содержать массив, используя операцию new , и назначать ее переменной массива. Таким образом, в Java
все массивы являются динамически распределяемыми.
int month_days = new int; >java FindReplace
a=5
a=10
a=0
a=5
a=16
a=5
Массивы можно инициализировать во время их объявления. Процесс во многом аналогичен тому, что используется при инициализации простых типов. Инициализатор массива – это список разделенных запятыми выражений, окруженный фигурными скобками. Массив будет автоматически создаваться достаточно большим, чтобы содержать столько элементов, сколько вы определяете в инициализаторе массива. Нет необходимости использовать операцию new . Например, чтобы хранить число дней в каждом месяце, следующий код создает инициализированный массив целых чисел:Многомерные массивы в Java
int twoD = new int;
Оно распределяет память для массива 4x5 и назначает ее переменной twoD . Внутренне эта матрица реализована как массив массивов целых чисел тип int .
Многомерные массивы возможно инициализировать. Для этого просто включают инициализатор каждого измерения в его собственный набор фигурных скобок.
В следующей программе создаются и инициализируются массивы массивов равной длины (матрицы), и выполняется произведение одной матрицы на другую:Альтернативный синтаксис объявления массива
type var-name;
Здесь квадратные скобки следуют за спецификатором типа, а не именем переменной массива. Например, следующие два объявления эквивалентны:
Представленные здесь объявления также эквивалентны:
char twodi = new char;
char twod2 = new char;
Эта альтернативная форма объявления включена, главным образом, для удобства.Инициализаторы массивов и безымянные массивы
В языке Java есть средство для одновременного создания массива и его инициализации. Вот пример такой синтаксической конструкции:
int
smallPrimes =
{
2
,
3
,
5
,
7
,
11
,
13
}
;
Отметим, что в этом случае не нужно применять оператор new . Кроме того, можно даже инициализировать безымянный массив:
new
int
{
16
,
19
,
23
,
29
,
31
,
37
}
Это выражение выделяет память для нового массива и заполняет его числами, указанными в фигурных скобках. При этом подсчитывается их количество и, соответственно, определяется размер массива. Эту синтаксическую конструкцию удобно применять для повторной инициализации массива без образования новой переменной. Например, выражение
smallPrimes =
new
int
{
17
,
19
,
23
,
29
,
31
,
37
}
;
представляет собой укороченную запись выражения
int
anonymous =
{
17
,
19
,
23
,
29
,
31
,
37
}
;
smallPrimes =
anonymous;
Можно создать массив нулевого размера. Такой массив может оказаться полезным при написании метода, вычисляющего некий массив, который оказывается пустым. Массив нулевой длины объявляется следующим образом:
new
тип Элементов
Заметим, что такой массив не эквивалентен объекту null .
Копирование массивов arrays
Один массив можно скопировать в другой, но при этом обе переменные будут ссылаться на один и тот же массив.
int
luckyNumbers =
smallPrimes;
luckyNumbers[
5
]
=
12
;
//Теперь элемент smallPrimesтакже равен 12
Результат показан на рис. 3.1. Если необходимо скопировать все элементы одного массива в другой, следует использовать метод arraycopy из класса System . Его вызов выглядит следующим образом:
System.
arraycopy
(from,
fromlndex,
to,
tolndex,
count)
;
Массив to должен иметь достаточный размер, чтобы в нем поместились все копируемые элементы.
Рис.3.1. Копирование массива
Например, показанные ниже операторы, результаты работы которых изображены на рис. 3.2, создают два массива, а затем копируют последние четыре элемента первого массива во второй. Копирование начинается со второй позиции в исходном массиве, а копируемые элементы помещаются в целевой массив, начиная с третьей позиции.
int
smallPrimes =
{
2
,
3
,
5
,
7
,
11
,
13
}
;
int
luckyNumbers =
{
1001
,
1002
,
1003
,
1004
,
1005
,
1006
,
1007
}
;
System.
аrrаусору(smallPrimes,
2
,
luckyNumbers,
3
,
4
)
;
for
(int
i =
0
;
i <
luckyNumbers.
length;
i++
)
System.
out.
println
(i +
": "
+
luckyNumbers[
i]
)
;
Выполнение этих операторов приводит к следующему результату.
0
:
1001
1
:
1002
2
:
1003
3
:
5
4
:
7
5
:
11
6
:
13
Рис. 3.2. Копирование элементов массива
Массив в языке Java значительно отличается от массива в языке C++. Однако он практически совпадает с указателем на динамический массив. Это значит, что оператор
int
a =
new
int
[
100
]
;
//Java
эквивалентен оператору
int
*
=
new
int
[
100
]
;
//C++,
а не
int
a[
100
]
;
//C++
В языке Java оператор пo умолчанию проверяет диапазон изменения индексов. Кроме того, в языке Java нет арифметики указателей - нельзя увеличить указатель а, чтобы обратиться к следующему элементу массива.
Ссылка на перво