Java. Урок 16. Массивы

Уроки для начинающих   18 января 2013  Автор статьи:  

Массив — это множество однотипных объектов, которые имеют общее название. К каждому элементу массива возможен доступ по его индексу. Рассмотрим реальный пример. Пусть у нас есть некоторый склад, который называется a и пусть в нем есть некоторое количество ящиков, каждый из которых последовательно пронумерован. В каждом ящике лежит некоторый объект, который по своему типу совпадает с объектами в других ящиках. Пример данного склада является классическим массивом, где название склада — это название массива, ящики — это элементы массива, номера ящиков — это индексы элементов, а содержимое ящиков — это значения наших переменных. Представим, что внутри ящиков лежат лимоны, и в каждом ящике лежит определенное количество лимонов. Тогда, значения наших переменных будут показывать количество лимонов. Рассмотрим такой склад, состоящий из трех ящиков, пусть в первом ящике лежит 3, во втором 7, в третьем 273. Тогда, массив, описывающий данный склад можно изобразить следующим образом:

Индекс 0 1 2
Значение 3 7 273

Индексация в массиве всегда начинается с 0. Рассмотрим некоторые операции, которые можно производить с массивом:

Создание массива

Все массивы в Java можно считать динамическими, так как мы выделяем под них память во время работы программы. Процесс создания массива в Java можно разделить на два этапа:
Объявление:

Тип[] имяПеременной;
int[] a;//целочисленный массив
char[] b;//массив символов
String[] c;

Выделение памяти:

a = new int[10];//выделяем память под 10 элементов
b = new char[20];//выделяем память под 20 элементов
c = new String[30];//выделяем память под 30 элементов

Таким образом инициализация массива выглядит следующим образом:

int[] a = new int[10];//инициализация массива целых чисел из 10 элементов
char[] b = new char[20];//инициализация массива символов из 20 элементов
String[] c = new String[30];//инициализация массива строк из 30 элементов

Всем элементам массива после такой инициализации присваивается значение по умолчанию.
Существует возможность сразу задать значения элементов массива, создадим массив, который будет показывать количество лимонов в ящике, как в примере выше:

int[] a = new int[]{ 3, 7, 273 };

Работа с массивом

Считывание массива:

import java.util.Scanner;
public class test {
public static void main(String[] args) {
int[] a;//массив целых чисел
int n;//количество элементов в массиве
Scanner in = new Scanner(System.in);
n = in.nextInt();
a = new int[n];
for(int i = 0; i < n; i++) { a[i] = in.nextInt(); } } }

Изменение значений массива:

int[] a;//массив целых чисел, который был как - то обработан
for(int i = 0; i < a.length; i++) { a[i] = a[i] * 2; }

Вывод массива:

int[] a;//массив целых чисел, который был как - то обработан
for(int i = 0; i < a.length; i++) { System.out.println(a[i]); }

Произвольный доступ к элементу массива по индексу:

System.out.println(a[0]);//Выводим первый элемент массива
a[1] = 1;//Присваиваем второму элементу массива 1
int temp = a[2];//Сохраняем значение третьего элемента массива в переменную temp

Вот так вот выглядят основные операции с массивами. Очень часто на различных уроках по информатике просят вынести эти этапы работы с массивом в отдельные функции, но про это мы поговорим позднее. Таким образом, с помощью считывания массива, мы можем ввести некоторые значение с консоли, с помощью изменения значений, мы можем например, увеличить все значения на единицу или умножить на два, а с помощью вывода мы можем вывести текущие значения массива. Если нам требуется работать только с конкретными элементами массива, то тут мы можем воспользоваться произвольным доступом по индексу, где индекс - это любое положительное целое число, которое меньше длины массива. Текущую длину массива можно получить с помощью свойства length, оно уже применялось при выводе массива.
Тут я опущу диалог про то, что массивы являются ссылками и работа с ними отличается от работы с обычными базовыми типами.

Двумерные массивы

Не всегда бывает удобно нумеровать ящики на складе с 0 до определенного числа, иногда хочется привести склад в более упорядоченный вид, например ввести ряды. Теперь каждый ящик имеет свой номер ряда и свой порядковый номер в этом ряду. Пусть на нашем складе есть девять ящиков, которые имеют содержат 1, 2 и так далее 9 апельсинов. Ящики на складе располагаются в три ряда по три ящика, тогда ситуацию на складе можно представить так:

Индексы 0 1 2
0 1 2 3
1 4 5 6
2 7 8 9

Двумерные массивы в Java - это массив массивов:

int[][] a;

Казалось бы объявляем, как всегда и никаких проблем:

int[][] a = new int[3][3];

И работаем с ним. Но при попытке обратиться к любому элементу массива:

a[0][0] = 1;//Ошибка, массив не инициализирован

Почему спросите вы? Ведь я создал массив размером 3 на 3. Дело в том, что вы создали только массив массивов, но значение по умолчанию для массива это null. После объявления массива еще необходимо создать все одномерные массивы:

for(int i = 0; i < a.length; i++) { a[i] = new int[3]; }

После этого уже можно проводить операции считывания, обработки значений и вывода результата на экран.
Мы еще ни раз вернемся к массивам и научимся лучше их понимать и работать с ними.


Массивы в C++
Массивы в Delphi

  • Andy

    Читаю Ваши уроки с удовольствием: всё сжато и информативно, но, по-моему, в строке ниже-неточность: после объявления массива можно сразу присваивать значение любому элементу массива.
    a[0][0] = 1;//Ошибка, массив не инициализирован

    • Да, действительно неточность, но до недавнего времени было именно так. Скорей всего вместе с JDK 7.0 ушла в небытие данная проблема.

  • Guess Who?

    ………………………………
    int[] a;//массив целых чисел

    int n;//количество элементов в массиве

    Scanner in = new Scanner(System.in);

    n = in.nextInt();

    a = new int[n];

    for(int i = 0; i < a.length; i++)

    {

    a[i] = in.nextInt();

    System.out.println(a[i]);

    }}

    В этом примере мы вводим длину массива(пример:5) и каждый элемент будет инициализирован как 5, то есть в данном случаии у вывод на экран видим :5
    [5,5,5,5,5]
    Правильно?))))))

    • Ну, примерно. Каждый элемент будет считан с клавиатуры. Например, я ввожу 5 1 2 3 4 5 и в результате получу [1,2,3,4,5]

      • Guess Who?

        Scanner in = new Scanner(System.in);

        n = in.nextInt();

        a = new int[n];

        for(int i = 0; i < a.length; i++)

        {

        a[i] = in.nextInt();

        //System.out.println(a[i]);

        }System.out.println(Arrays.toString(a));}}

        5

        44

        45

        7

        8

        3

        [44, 45, 7, 8, 3]

        сорри, но сортировка то не происходит!цикл ведь просто считывает все введенные элементы)

        • Нет, сортировка не происходит. Если она тебе нужна, то вызови ее отдельно перед выводом значений.

  • Odd

    Можно сделать маcсив типа integer содержащий тип char?

    • Странный вопрос. Но если вы хотите положить в массив типа integer тип char, то почему бы просто не создать массив типа char?

  • Allexia

    Поменяйте нижнюю строку про инициализацию двумерного массива!!! Если бы не зашёл в комментарии, то наверное бы ближайшие недели две надо мною смеялись на стажировке!

    • Какую именно и на что=)

  • Олег

    Статья чем-то похожа на статью на proglang.su/java/142 про массивы в Java.

Научиться программировать

  • на Delphi

  • на Java

  • на C++