JavaRush /Курсы /Java Syntax Pro /Продвинутая работа с массивами

Продвинутая работа с массивами

Java Syntax Pro
5 уровень , 3 лекция
Открыта

1. Массив типа String

Ну и вкратце хотелось бы рассказать о массиве типа String.

Как мы уже говорили, массив может быть любого типа. А значит, можно создать массив типа String. Вот как бы выглядел код, если бы нам нужно было написать программу, которая «вводит с клавиатуры 10 строк и выводит их на экран в обратном порядке».

Scanner console = new Scanner(System.in);
String[] array = new String[10];
for (int i = 0; i < 10; i++)
{
   array[i] = console.nextLine();
}
for (int i = 9; i >= 0; i--)
{
   System.out.println(array[i]);
}
Создаем объект Scanner
Создаем объект-массив на 10 элементов
Цикл от 0 до 9

Читаем строку с клавиатуры и сохраняем ее в очередную ячейку массива
Цикл от 9 до 0

Выводим на экран очередную ячейку массива

Код практически не изменился! Пришлось только при создании массива заменить тип int на String. Ну и при чтении строки с клавиатуры заменить метод nextInt() на nextLine().


2. Массив типа String в памяти

И еще один полезный факт. Рассмотрим 3 картинки:

Картинка 1. Как объект String располагается в памяти:

Массив типа String в памяти

Эта картинка взята из предыдущих лекций.

Обращаем ваше внимание, что текст строки не хранится прямо в переменной: для него выделяется отдельный блок памяти. А в переменной типа String хранится адрес(ссылка) на объект с текстом.

Картинка 2. Как массив целых чисел располагается в памяти:

Массив типа String в памяти

Тоже известна картинка.

Картинка 3. Как в памяти располагается массив строк:

Как в памяти располагается String массив

Слева мы видим переменную-массив типа String[] (хранит адрес объекта-массива).

В середине — объект-массив типа String.

А справа — объекты-строки, которые хранят какие-то тексты.

В ячейках объекта-массива типа String хранятся не сами строки(тексты), а их адреса (ссылки). Точно так же, как в переменных типа String хранятся адреса строк(текста).

Учитывайте этот факт, когда будете сравнивать ячейки массива:

String[] array = new String[10];
 array[1] = "Привет";
array[2] = array[1];
array[3] = new String("Привет");
// сравниваем
array[1] == array[2];
array[1] == array[3];
array[1].equals(array[3]);
array[1].equalsIgnoreCase(array[3]);
Создаем массив на 10 строк

Заносим значения в массив



true (ссылки равны)
false (ссылки не равны)
true (строки равны)
true (строки все равно равны)


3. Быстрая инициализация массива в Java

Массивы — очень полезная вещь, поэтому разработчики Java постарались сделать работу с ними максимально удобной.

И первое, что они сделали — это упростили инициализацию массива, занесение в него стартовых значений.

Ведь очень часто, кроме данных, которые программа откуда-то считывает, ей для работы нужны еще свои внутренние данные. Например, нам нужно хранить в массиве длины всех месяцев. Как может выглядеть этот код:

int[] months = new int[12];
months[0] = 31; // январь
months[1] = 28; // февраль
months[2] = 31; // март
months[3] = 30; // апрель
months[4] = 31; // май
months[5] = 30; // июнь
months[6] = 31; // июль
months[7] = 31; // август
months[8] = 30; // сентябрь
months[9] = 31; // октябрь
months[10] = 30; // ноябрь
months[11] = 31; // декабрь

Но есть способ записать его короче — спасибо создателям Java:

// длины месяцев года
int[] months = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

Можно просто перечислить через запятую все значения массива!

Удобно, да? Но и это еще не все.

Оказывается компилятор может определить тип контейнера (объекта-массива) на основе типа переменной-массива. А для определения длины массива — банально подсчитать количество элементов, написанных в фигурных скобках.

Поэтому этот код можно записать еще короче:

// длины месяцев года
int[] months = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

Разве не красота? 🙂

Такая запись называется «быстрая инициализация массива». Она, кстати, работает не только для типа int...

// имена месяцев года
String[] months = { "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"};


Комментарии (623)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Valeria Levchenko Уровень 6
30 июня 2026
Задача не прошла проверку( но вроде верно работает: package com.javarush.task.pro.task05.task0508; import java.util.Scanner; /* Удаляем одинаковые строки */ public class Solution { public static String[] strings; public static void main(String[] args) { //напишите тут ваш код Scanner scanner = new Scanner(System.in); String[] strings = new String[6]; for (int i = 0; i < 6; i++) { strings[i] = scanner.nextLine(); } for (int i = 0; i < strings.length; i++) { String compare = strings[i]; for (int j = i+1; j < strings.length; j++) { if (compare == null) { break; } if (compare.equals(strings[j])) { strings[i] = null; strings[j] = null; } } } for (int i = 0; i < strings.length; i++) { System.out.println(strings[i]); } } }
Maxim Terletsky Уровень 16
4 июня 2026
04.06.2026. Решил задачу. JavaRush уважаю, спасибо за платформу. Но по задаче "Удаляем одинаковые строки" есть пожелание: сделайте формулировку более точной. В текущем виде второе требование ("удалить повторяющиеся строки") допускает разные трактовки. Лучше было бы расписать шаги подробнее, например: 1. Считать с клавиатуры 6 строк и сохранить их в массив strings. 2. Создать булевый массив isNull такого же размера (6 элементов). 3. Организовать вложенный цикл для сравнения всех возможных пар элементов массива strings. Для каждой пары с разными индексами, где оба элемента не равны null и равны друг другу, отметить оба индекса в булевом массиве isNull как true. 4. Пройти по массиву strings и заменить на null те элементы, позиция которых имеет значение true в массиве isNull. 5. Вывести все элементы массива strings на экран, разделяя их запятой с пробелом (,). Написано условно, но такая формулировка была бы более понятна. Спасибо!
wmachine Уровень 7
11 июля 2026
2. Создать булевый массив isNull такого же размера (6 элементов). Для решения этой задачи совсем не обязательно создавать дополнительный массив с булевыми значениями и хранить его в памяти и потом еще раз итерироваться по strings - это очень неэффективно - можно решить задачу проще, видимо поэтому и не расписали эти шаги в условии, а оставили на подумать 🙂
Hollwestn Уровень 18
25 февраля 2026
Scanner io = new Scanner(System.in); //напишите тут ваш код strings = new String[6]; for (int i = 0; i < strings.length; i++) { strings[i] = io.nextLine(); } for (int i = 0; i < strings.length - 1; i++) { int same = 0; if(strings[i] == null){ continue; } for(int j = i + 1; j < strings.length; j++){ if(strings[j] == null || strings[i] == null){ continue; } if(strings[i].equals(strings[j])){ strings[j] = null; same++; } } if(same > 0){strings[i] = null;} } for (int i = 0; i < strings.length; i++) { System.out.print(strings[i] + ", "); } Решил вложенным циклом решить
Anna Klushkina Уровень 60
4 января 2026
⛏ Много лекций, это хорошо
Dmitry Уровень 29
12 декабря 2025
Эта задача высосала все соки, сначала не понимал, как начать "перебирать" грамотно элементы массива, потом вроде разобрался. Далее затупил со счетчиками, потом вроде дошло, что надо брать за основу первый элемент(внешний цикл) и сравнивать его с последующими элементами внутреннего цикла. Потом понял, что в идеале у меня заменяются другие повторения, кроме 1-го. И тут я подсмотрел, что надо бы через boolean это сделать. Охх, задача далась с трудом
Игорь Лупац Уровень 39
30 декабря 2025
Как только привык пользоваться дебаггером, всё улеглось. Конечно, здорово, когда можешь прокручивать в голове вложенные циклы, многомерные массивы и прочее. Но зачастую такое усилие избыточно, да и упустить некоторые нюансы исполнения можно запросто.
Роман Зарубин Уровень 8
29 ноября 2025
Работаем !
16 февраля 2026
Зачастую заглядываю в комментарии, чтобы найти твое сообщение "Работаем!" 😄 Оно немного подталкивает идти вперед
Магомед Уровень 9
26 ноября 2025
Scanner console = new Scanner(System.in); strings = new String[6]; for ( int b = 0 ; b < 6; b++ ) { strings[b] = console.nextLine(); } for ( int a = 0; a < 6; a++ ) { if ( strings[a] == null ) continue; for ( int c = a + 1 ;c < 6 ;c++ ) { // на каждый эллемент if ( strings [c] == null ) continue; if (strings[a].equals(strings[c])) { strings [c] = null; for ( int s = c + 1; s < 6 ; s++ ) { if ( strings [s] == null ) continue; if ( strings[a].equals(strings[s]) ) { strings [s] = null;} } strings [a] = null; break; } } for (int i = 0; i < strings.length; i++) { System.out.print(strings[i] + ", "); } } } } краткость явно не моя сестра 2-й for с "a" цикл для прокрутки всех элементов 3-й for с "c" для каждого элемента массива . В нем сравниваем 1строку со 2, если совпадают , то 2 строка = null, а 1-я строка входит в 4-й for из выхода которого она станет null в 4-ом for совпавшая строка , сравнивается с остальными строками , если есть еще совпадения они приравниваются null . На этом 4-й for заканчивается внутри 3-го 3 - й for : так как совпавшая строка еще не = null , делает ее null . Срабатывает break и 3- й for заканчивается внутри 2-го . Так прошел 1 элемент и так далее со всеми оставшимися
Александр Уровень 66
26 ноября 2025
Такой код не пропускает JR (ради спортивного интереса хочу фильтровать при заполнении):

        final Scanner sc = new Scanner(System.in);
        strings = new String[6];
        String input;
        boolean isDuplicate;

        for (int i = 0; i < strings.length; i++) {
            input = sc.nextLine();
            isDuplicate = false;

            for (int j = 0; j < i && !isDuplicate; j++) {
                if (input.equals(strings[j])) {
                    strings[j] = null;
                    isDuplicate = true;
                }
            }

            strings[i] = isDuplicate ? null : input;
        }

        for (int i = 0; i < strings.length; i++) {
            System.out.print(strings[i] + ", ");
        }
techn0di Уровень 32
1 ноября 2025
решение во вкладке "правильное решение" на дату 01.11.2025 стирает только 2 одинаковых значения массива, если будет 3 одинаковых значения, то решение будет не актуальным
Anonymous #6414466 Уровень 10
13 ноября 2025
тоже заметила! при этом моё решение не компилируется 😁 где-то ошибка((
Horror Уровень 6
26 августа 2025
если кому-то скучно решать абстрактные задачи, то у Вас уже есть все навыки, чтобы сделать консольный вариант игры "камень, ножницы, бумага". ипользуйте: Scanner для считывания выбора игроков; String[] - для хранения {"камень", "ножницы", "бумага"}; флаги boolean и if/else if/else для выявления победителя, ну и System.out.println - для вывода на экран. Если возникли проблебы с определением победителя, то Вам нужно гуглить 2-й закон де Моргана. Успехов в реализации!!!