JavaRush /Курсы /Java Syntax /Class ArrayList

Class ArrayList

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

— А вот и я.

— Привет, Элли!

— Сегодня новая интересная тема! Сейчас я расскажу тебе о новом интересном классе — ArrayList.

— О, новый класс? Круто! И что он умеет делать?

— Начну с небольшой предыстории. Программистам очень не нравилось одно свойство массива – его размер нельзя изменять. Что делать, если нужно сохранить в массиве ещё три элемента, а свободное место только одно?

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

— И что же придумали программисты?

— Они написали класс ArrayList (списочный массив), который выполнял ту же работу, что и Array (массив), но мог изменять свой размер.

— Интересный ход. И как же они это сделали?

— Внутри каждого объекта типа ArrayList хранится обычный массив элементов. Когда ты считываешь элементы из ArrayList, он считывает их из своего внутреннего массива. Когда записываешь – записывает их во внутренний массив. Вот сравни:

Array ArrayList
Создание контейнера элементов
String[] list = new String[10];
ArrayList<String> list = new ArrayList<String>();
Получение количества элементов
int n = list.length;
int n = list.size();
Взятие элемента из массива/коллекции
String s = list[3];
String s = list.get(3);
Запись элемента в массив
list[3] = s;
list.set(3, s);

— И в чем же преимущество ArrayList? Как по мне, так код стал длиннее.

— Во-первых, ArrayList поддерживает несколько дополнительных действий, которые очень часто приходится делать программистам во время работы, и которых нет у массива. Например – вставка и удаление элементов из середины массива, и чтобы не оставалось дырок.

— Во-вторых, изменение размера: когда нужно записать во внутренний массив ещё один элемент, а свободного места там нет, то внутри ArrayList делается вот что:

а) создаётся ещё один массив, в полтора раза больше размера внутреннего массива, плюс один элемент.

б) все элементы из старого массива копируются в новый массив.

в) новый массив сохраняется во внутренней переменной объекта ArrayList, старый массив объявляется мусором (мы просто перестаём хранить на него ссылку).

Array ArrayList
Добавление элемента в конец массива
Невозможно выполнить данное действие
list.add(s);
Вставка элемента в середину массива
Невозможно выполнить данное действие
list.add(15, s);
Вставка элемента в начало массива
Невозможно выполнить данное действие
list.add(0, s);
Удаление элемента из массива
Можно стереть элемент с помощью list[3] = null. Но тогда останется «дыра» в массиве.
list.remove(3);
7
Задача
Java Syntax Pro, 7 уровень, 5 лекция
Недоступна
У всего есть корень
Метод printSqrt(int[] array) должен выводить корень квадратный для каждого элемента переданного массива. Но этого не происходит из-за конфликта имен переменных. Исправь имена переменных так, чтобы код компилировался. В результате работы программа должна выводить в консоли соответствующую строку для

— А как работать с этим ArrayList’ом?

— А практически так же, как и с массивом. Вот смотри. Давай сравним работу с ArrayList с работой с массивом. Для примера решим такую задачу «ввести 10 строк с клавиатуры и вывести их на экран в обратном порядке» .

— Смотри:

Используем Array
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// ввод строк с клавиатуры
String[] list = new String[10];
for (int i = 0; i < list.length; i++)
{
  String s = reader.readLine();
  list[i] = s;
}

// вывод содержимого массива
// на экран в обратном порядке
for (int i = 0; i < list.length; i++)
{
  int j = list.length - i - 1;
  System.out.println( list[j] );
}
}
Используем ArrayList
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// ввод строк с клавиатуры
ArrayList<String> list = new ArrayList<String()>
for (int i = 0; i < 10; i++)
{
  String s = reader.readLine();
  list.add(s);
}

// вывод содержимого коллекции
// на экран в обратном порядке
for (int i = 0; i < list.size(); i++)
{
  int j = list.size() - i - 1;
  System.out.println( list.get(j) );
}
}

— Я раскрасила одним цветом эквивалентные действия в обеих колонках.

— С одной стороны все по-другому, с другой – все осталось тем же самым.

— Ага. Только мы теперь не используем квадратные скобочки при работе с Class ArrayList. Вместо них мы используем методы get, set и add.

— Да, я уже заметил. Но все равно очень похоже.

7
Задача
Java Syntax Pro, 7 уровень, 5 лекция
Недоступна
Города-гиганты
Программа должна выводить количество населения самых крупных городов мира и сравнивать их с самым большим городом — Токио. Но алгоритм программы немного нарушен. Для исправления ошибки тебе необходимо сделать, так чтобы в строке с выводом информации о самом крупном городе мира использовались статиче
Комментарии (384)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Nigol Уровень 7
26 июня 2024
list.remove(3) удалит четвертый по счету элемент списка или первое найденное число 3? Как отличить одну операцию от другой?
Alina Klishyna Уровень 8
1 июля 2024
remove() - удаляет не по значению, а по индексу

ArrayList<String> cats = new ArrayList<>();
cats.add("Барсик"); //индекс 0
cats.add("Фоксик");  //индекс 1
cats.add("Толик"); //индекс 2
cats.add("Геральт из Ривии"); //индекс 3

cats.remove(3); // удалится индекс 3 - Геральт из Ривии
24 марта 2024
24.03.2024 check, мой уровень все еще 7
Nina Rozhdestvenskaya Уровень 15
1 июня 2023
Подскажите пожалуйста как работает этот цикл: for (int i = 0; i < list.size(); i++) { int j = list.size() - i - 1; System.out.println( list.get(j) ); } не совсем понимаю смысл работы этой строчки: int j = list.size() - i - 1; Почему нельзя цикл начинать с последнего элемента и уменьшать на 1, пока не дойдём до первого?
Алексей Уровень 23
18 июля 2023
По идее можно было просто сделать так

for (int i = list.size() - 1; i >= 0;  i--)
{
   System.out.println( list.get(i) );
}
В данном случае, наверное, для наглядности так сделали
Alina Klishyna Уровень 8
1 июля 2024
Можно уменьшить с последнего и до 0

for (int i = 0; i < list.size(); i++) {
  int j = list.size() - i - 1;   // берем полный размер массива отнимаем от i, 
// так же должны отнять 1, так как кол-во всех элементов например 10,
// но так как счет начинается с 0, то мы как бы двигаемся от 9 элемента
  System.out.println( list.get(j) );
}
Anonymous #3268884 Уровень 36
20 апреля 2023
Я не понимаю, я прохожу 12 уровень, сталкиваюсь с темой ArrayList Ранее эта тема не упоминалась. Начинаю искать, оказывается она еще в седьмом уровне, но эта лекция почему-то для меня теперь недоступна. При этом во вкладке Курс на карте квестов указано, что 7 уровень 5 лекция - это вовсе не ArrayList, а Видимость Переменных. А эту лекцию ArrayList я не могу открыть
Lo Уровень 35 Expert
14 мая 2023
Лекции поменяли местами, я в прошлом году проходила курс, тоже было по другому, бросила по личным причинам на 6 уровне, сейчас замечаю, что некоторые лекции с первых уровней бывают намного позже. А насчет недоступности это и правда странно, я делаю записи в тетрадь и ищу когда нужно что то вспомнить, ну или просто гуглить тоже вариант, чаще всего поиск выдает статьи javaRush как раз. Еще я купила книжку Брюса Эккеля - Философия Java?, в печатном виде, как справочник очень помогает, в ней есть описание всего необходимого на данном уровне обучения.
Sergey Уровень 17
26 сентября 2023
В одной из предыдущих лекций, один товарищ оставлял ссылку на все лекции javarush. https://disk.yandex.ru/d/I9VY5SSQh6dQHQ?w=1
Максим Уровень 9
2 апреля 2024
Спасибо тебе добрый человек!
Sergey Dubakin Уровень 6 Expert
28 апреля 2024
Дружище, Огромное тебе Спасибо 🤜🤛 🤝🤝🤝
Евгений N Уровень 23
4 апреля 2022
где же знаменитый forEach?
Egor Kurilko Уровень 7
10 марта 2022
Подскажите, а в чем различие add и set ?
Anonymous #3025762 Уровень 28
11 марта 2022
Add - добавляет в конец списка, set - присвоить значение n-оному элементу
Anon Уровень 22
3 ноября 2022
Не совсем так по поводу .add(). Данный метод принимает как один, так и два аргумента. Если передать индекс и сам элемент (в виде .add(int index, E element)), то элемент будет вставлен в массив по переданному индексу. Элементы справа относительно вставленного будут сдвинуты далее.
Anonymous #3025762 Уровень 28
4 ноября 2022
Точно, правда, не помню, пользовался ли им когда-либо, но метод полезный
Den Уровень 19
23 марта 2023
add (DataType element) - Добавляет элемент в конец списка. add (int index, DataType element) - Добавляет элемент. Сначала сдвигает все элементы вправо начиная с позиции index, а затем добавляет элемент в ячейку index. set (int index, DataType element) - Заменяет элемент. Затирает старое значение хранящееся в ячейке и на это место помещает элемент переданный в параметре.
Alexey Уровень 15
26 января 2022
ArrayList это легко, а вот дальше пойдут HashMap всякие, вот там трудно
Максим Уровень 22 Expert
21 августа 2023
А ещё дальше многопоточность и лямбды,может ну его нафиг ?
Andrei Уровень 7
18 января 2022
Важно отметить, что массив в которого ArrayList хранит свои значения имеет тип Object.
Максим Уровень 22 Expert
21 августа 2023
по умолчанию да,ведь всё что мы напишем в параметрах в любом случае будет наследоваться от Object
Ruslan Zalikov Уровень 9
18 января 2022
Зачем в правой половине тоже указано String? ArrayList<String> list = new ArrayList<String>();
Andrei Уровень 7
18 января 2022
Можно и так, и так, не принципиально.
Anonymous #733630 Уровень 8
10 января 2022
for (int i = 0; i < 10; i++) { String s = reader.readLine(); list.add(s); } Мне одному кажется, что должно быть list.add(i, s), а не list.add(s)? Ведь, согласно описанию выше, list.add(s) без указания индекса - "добавление элемента в конец массива".
Fira Уровень 12
21 января 2022
созданный список пустой, соответственно, первый добавленый элемент и будет последним
FuryCydonian Уровень 22
26 января 2022
Ну да. Сначала список пустой (не как массив, у которого есть ячейки, но они пустые, а прям без элементов, просто контейнер вроде как), и с каждой итерацией ты добавляешь в него в конец новое значение введенное. Все правильно. Массиву нужен индекс, потому что он не может просто взять и добавить элемент в конец. У него уже есть ячейки, они пустые и их индекс надо явно задавать с помощью [i].
Николай Уровень 10
31 января 2022
Представь коробку, в которую ты ложишь листы бумаги! Или пачку бумаги - каждый новый лист ты ложишь наверх в стопку. Этим список и проще тоже, не нужно "гвоздями" прибиваться к индексу. add. n - нный лист add. второй лист add. первый лист