Class ArrayList

Открыта

— А вот и я.

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

— Сегодня новая интересная тема! Сейчас я расскажу тебе о новом интересном классе — 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);
2
Задача
Java Syntax,  7 уровень,  5 лекция
Недоступна
Набираем код Ӏ Java Syntax: 7 уровень, 5 лекция
Java Syntax: 7 уровень, 5 лекция. Иногда думать не надо, строчить надо! Как ни парадоксально звучит, порой пальцы «запоминают» лучше, чем сознание. Вот почему во время обучения в секретном центре JavaRush вы иногда встречаете задания на набор кода. Набирая код, вы привыкаете к синтаксису и зарабатываете немного материи. А ещё — боретесь с ленью.

— А как работать с этим 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.

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

Комментарии (231)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Eversman8 уровень, Владивосток
18 May, 06:16
запись такого формата как в примере: ArrayList<String> list = new ArrayList<String>(); а затем добавление значений в массив через цикл скорее всего вызовет у вас ошибку, это связано с тем, что java начнет ругаться на то, что в () не указан явный размер массива и он будет отказываться добавлять туда значение.
Viktor Vdovichenko0 уровень
20 May, 16:08
нет, дефолтный конструктор создаёт лист на 10 элементов, а далее, по мере необходимости, увеличивается размер в полтора раза.
Владислав15 уровень, Санкт-Петербург
21 May, 08:25
Размер чего увеличивается в полтора раза? Массива? Тогда при добавлении нового элемента к массиву из 10 элементов, он станет длинной 16 или что (currentLength * 1,5 + 1)?
Eversman8 уровень, Владивосток
21 May, 09:42
у меня была подобная ошибка, при использовании цикла While при добавлении в лист введенных с клавиатуры данных, на более ранних этапах, пришлось лезть на всеми любимый стэковерфлоу.
Владимир 12 уровень, Краснодар
14 May, 20:29
привет не могу разобраться с определением максимального и минимального числа (max и min) можете дать ссылку лекции где эту тему затронули или сайт с объяснением буду очень благодарен :)
JSON9 уровень, Москва
Monday, 05:56
https://ru.stackoverflow.com/questions/634119/Поиск-индексов-минимального-и-максимального-элементов-массива Тут есть рабочий пример кода. Принцип в том, чтобы циклом for перебрать все элементы массива и на каждой итерации выбрать минимальный. При этом мы каждый раз записываем в переменную индекс минимального (максимального) значения.
IwanIV8 уровень
12 May, 21:20
"— Ага. Только мы теперь не используем квадратные скобочки при работе с Class ArrayList. Вместо них мы используем методы get, set и add." Вот про это можно было бы ссылку оставить почитать, а не ждать когда профессор в 10й лекции расскажет...
Антон Пономарев15 уровень, Санкт-Петербург
10 May, 11:07
а в чем разница между list.add и list.set? вот чтобы не выглядить идиотом на собеседовании...
test_user15 уровень
10 May, 13:52
Как я понял, list.add добавляет элемент в конец коллекции, например команда list.add(s) запишет содержимое s в конец коллекции list Команда list.set записывает элемент по указанному индексу. list.set(3, s) - в коллекции list содержимое элемента s будет находится на третьем месте с начала.
Антон Пономарев15 уровень, Санкт-Петербург
10 May, 15:59
нет,в том и дело в статье выше последний мример list.add(3, s) кидаем s 4ыйм эл-ом
Igor13 уровень, Москва
10 May, 19:05
Судя по всему, add создает новую ячейку (там где хочется), а set устанавливает в нее значение.
Антон Пономарев15 уровень, Санкт-Петербург
10 May, 20:07
я add-ом сразу делаю и то и то хоть в конец, хоть в начало. куда хочешь. может конечно add-ом нельзя заменять,а set может именно заменить старое значение на новое. я пока не гугдил, тк задачи рещаю и немного не до этого. после буду смотреть в интернетах ибо реально завалить могут этим вопросом на собеседовании
Антон Пономарев15 уровень, Санкт-Петербург
10 May, 20:11
add добавляет новое значение,а set eго заменить может по старому индексу
Viktar8 уровень, Минск
12 May, 17:19
add Добавляет элемент в конец массива и сдвигает цепочку, а set делает тоже самое, но затирает элемент старый на новый.
Александр8 уровень, Москва
1 May, 07:49
Ввод строки с клавиатуры можно тоже короче записать, и не создавать лишнюю переменную. for (int i = 0; i < 10; i++) { list.add(reader.readLine()); }
18 April, 09:48
Кто может объяснит этот момент int j = list.size() - i - 1; некак не пойму как работаетет момент с минусами
Віктор Капінос16 уровень, Винница
18 April, 20:17
Длина массива = list.size(1 -10) ячейки массива(адрес: 0 - 9) -1 - ровняем, а то будем за границей массива -i - перебираем ячейки, сначала -0, потом -1 и т.д. (это в обратном порядке)
Life DIY15 уровень, Екатеринбург
23 April, 11:20
Извращенцы. Можно было проще:
for (int i = list.size() - 1; i >= 0; i--) {
            System.out.println(list.get(i));
        }
Vyacheslav Trembitsky8 уровень, Москва
1 May, 19:46
о том же самом подумал, изврат полнейший
Azamat Abdilov8 уровень
11 May, 13:53
Согласен. Намного проще.
Михаил13 уровень, Москва
13 April, 10:39
Сейчас уже можно вместо
ArrayList<String> list = new ArrayList<String>();
писать так:
ArrayList<String> list = new ArrayList<>();
Александр Шишкин13 уровень, Екатеринбург
12 April, 07:56
после набранного кода вылезает ошибка справа вверху. Раньше такого не было... видимо это из-за того, что я уже решал задачу... не заметил пометку "Закрыта"... наверно для большей ясности лучше делать всё-таки что-то типо "Пройдено" или "Решено"
Elena Ivantsova15 уровень
9 April, 12:18
Небольшое видео с визуальным отображением того, что происходит в ArrayList, когда мы используем add или set или get и тд. Язык английский, но и без него все понятно. https://www.youtube.com/watch?v=DoNwHQHuHLc
Dr.Strangelove8 уровень, Таллинн
7 April, 13:15
import java.util.ArrayList; Очень важно, могли б в статью добавить.
LeeSyash8 уровень, Днепр
10 May, 12:44
Ни про один импорт создатели курса не сказали до этого момента. Увы.