Нужно ввести 10 строк. Я понимаю, что загвоздка в том, что инициализировав список на 10 элементов, я в цикле ограничиваю итерации длинной списка. Что проблема именно в этом. Но хоть убей не могу понять почему.
То есть, если не буду в инициализации ставить 10 и поставлю в цикле 10, все пройдет хорошо. Но как только введу длину списка, сразу все, не работает.
Не работает:
ArrayList<String> string = new ArrayList<>(10);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < string.size(); i++) {
string.add(reader.readLine());
}
Работает:
ArrayList<String> string = new ArrayList<>();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 10; i++) {
string.add(reader.readLine());
}
Andrii
22 уровень
Почему после запуска на выполнение, сразу успешно завершается и не просит ничего ввести?
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Павел МинеевExpert
30 августа 2019, 16:36
А initialCapacity (аргумент в конструкторе) это не тоже самое, что size(), это просто инструкция jvm для выделения памяти под 10 элементов.
0
Павел МинеевExpert
30 августа 2019, 16:34
Потому что string.size() = 0 и тело цикла ни разу не исполняется.
0
Andrii
30 августа 2019, 16:46
но разве когда я инициализировал список, всем этим элементам не присвоился null? Разве они по факту не существуют уже? По моей логике тогда string.size() имеет уже к этому моменту
значение 10. разве нет?
0
Павел МинеевExpert
30 августа 2019, 17:02
нет, при инициализации значение string.size() = 0. Аргумент переданный в конструкторе не задаёт начальный размер листа, а лишь указывает jvm выделить память под String[], который находится под капотом ArrayList<String>. Почитайте подробнее о том, как в памяти представлен ArrayList и как реализуется его основная "фишка" в виде динамической размерности.
0
Andrii
30 августа 2019, 17:13
Спасибо, вернусь к этому. видимо пропустил
0