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 = { "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"};


Комментарии (618)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анна Клушкина Уровень 12
4 января 2026
⛏ Много лекций, это хорошо
Dmitry Уровень 13
12 декабря 2025
Эта задача высосала все соки, сначала не понимал, как начать "перебирать" грамотно элементы массива, потом вроде разобрался. Далее затупил со счетчиками, потом вроде дошло, что надо брать за основу первый элемент(внешний цикл) и сравнивать его с последующими элементами внутреннего цикла. Потом понял, что в идеале у меня заменяются другие повторения, кроме 1-го. И тут я подсмотрел, что надо бы через boolean это сделать. Охх, задача далась с трудом
Игорь Лупац Уровень 21
30 декабря 2025
Как только привык пользоваться дебаггером, всё улеглось. Конечно, здорово, когда можешь прокручивать в голове вложенные циклы, многомерные массивы и прочее. Но зачастую такое усилие избыточно, да и упустить некоторые нюансы исполнения можно запросто.
Роман Зарубин Уровень 8
29 ноября 2025
Работаем !
Магомед Уровень 7
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 элемент и так далее со всеми оставшимися
Александр Уровень 26
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 Уровень 22
1 ноября 2025
решение во вкладке "правильное решение" на дату 01.11.2025 стирает только 2 одинаковых значения массива, если будет 3 одинаковых значения, то решение будет не актуальным
Anonymous #6414466 Уровень 9
13 ноября 2025
тоже заметила! при этом моё решение не компилируется 😁 где-то ошибка((
Horror Уровень 6
26 августа 2025
если кому-то скучно решать абстрактные задачи, то у Вас уже есть все навыки, чтобы сделать консольный вариант игры "камень, ножницы, бумага". ипользуйте: Scanner для считывания выбора игроков; String[] - для хранения {"камень", "ножницы", "бумага"}; флаги boolean и if/else if/else для выявления победителя, ну и System.out.println - для вывода на экран. Если возникли проблебы с определением победителя, то Вам нужно гуглить 2-й закон де Моргана. Успехов в реализации!!!
Vadim Уровень 16
12 августа 2025
public static String[] strings; зачем тут это??
Anonymous #3608596 Уровень 9
13 августа 2025
объявление переменной массива, но без инициализации. strings = new String[]; – инициализация переменной strings типа String =)
Vadim Уровень 16
14 августа 2025
я это понял, но зачем public static
29 июля 2025
Почему мое решение не правильное? Вроде все работает... Scanner sc = new Scanner(System.in); strings = new String[6]; for (int i = 0; i < 6; i++) strings [i] = sc.nextLine(); for (int i = 0; i < strings.length; i++) { if (strings[i] == null) continue; String currentString = strings[i]; for (int j = i + 1; j < strings.length; j++) { if (currentString.equals(strings[j])) { strings[j] = null; strings[i] = null; break; } } } for (int i = 0; i < strings.length; i++) { System.out.print(strings[i] + ", "); }
nastya_zhadan Уровень 66
6 августа 2025
Ваше решение работает только для пары одинаковых строк, но не удаляет все дубликаты, если их больше двух. Получается, что цикл j останавливается после первого совпадения (break) и strings[i] удаляется сразу, что препятствует удалению других копий этой строки. А в итоге нужно удалить все строки, у которых есть хотя бы один дубликат. У меня вот так сработало: public class Solution { public static String[] strings; public static void main(String[] args) { Scanner input = new Scanner(System.in); strings = new String[6]; for (int i = 0; i < 6; i++) strings[i] = input.nextLine(); for (int i = 0; i < 6; i++) { if (strings[i] == null) continue; Boolean duplicateFound = false; for (int j = 0; j < 6; j++) { if (j != i && strings[j] != null && strings[i].equals(strings[j])) { strings[j] = null; duplicateFound = true; } } if (duplicateFound) strings[i] = null; } for (int i = 0; i < strings.length; i++) { System.out.print(strings[i] + ", "); } } }
Firdavs Уровень 13
17 октября 2025
просто если убрать break, то всё заработает
Hissazul Уровень 6
1 ноября 2025
Intellij1@(j != i && strings[j] != null && strings[i].equals(strings[j])) на мой взгляд несколько избыточное условие, вполне достаточно проверить (j != i && strings[i].equals(strings[j]))
nastya_zhadan Уровень 66
1 ноября 2025
Я из будущего полностью согласна)
Elya #3578035 Уровень 12
23 июня 2025
Добрый вечер! А как запустить консоль input для ввода данных? Заранее спасибо
Александр Уровень 15
5 июля 2025
добрый! если вопрос без подвоха, то через Scanner