По сути решение ничем не отличается от "правильного". Разница лишь в том что у меня все содержимое первого файла хранилось в одной строке, а не в массиве ArrayList. И соответственно не было цикла который перебирал бы элементы списка. Интересно мнение профессионала, какой из вариантов лучше и почему? Повторюсь принципиальная разница в том что есть либо список строк, либо одна большая строка представляющая из себя элементы списка через пробел.
smart_engineer
43 уровень
Решил задачу не используя ArrayList. Стоило ли оно того?
Обсуждается
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Стас ПасинковSoftware Developer в ZipyMaster
10 декабря 2021, 20:17полезный
ваш код я не вижу, но предполагаю, что вы как только считывали потенциальное число (кусок строки между пробелами) из первого файла - сразу проверяли его на то, является ли оно числом, и если да - то писали в строку? предполагаю, что как-то так:
то-есть, использовали конкатенацию?
в 8й джаве эта штука не оптимизирована. то-есть при каждой конкатенации (при каждом "выполнении" плюсика) создается новый объект строки, а старый объект так и остается торчать в памяти, пока его garbage collector не подчистит.
в таком случае рекомендуют использовать для таких штук специальный класс StringBuilder(или StringBuffer если нужна синхронизация). а он у себя внутри реализован через... барабанная дробь... ArrayList :) если я не ошибаюсь)
так что если вы использовали конкатенацию - то ваше решение чуть хуже, чем через ArrayList. если использовали более оптимальное решение через StringBuilder - тогда одинаково.
в более новых версиях джавы конкатенация уже "под капотом" реализована через StringBuilder, поэтому решение будет почти такое же, как и с использованием ArrayList
+1
Ksenia VolkovaJava Developer в DXCMaster
10 декабря 2021, 20:22
У StringBuilder внутри массив байт
0
Стас ПасинковSoftware Developer в ZipyMaster
10 декабря 2021, 20:27
спасибо :)
посмотрел у себя в jdk - там массив символов используется, но да, не ArrayList, согласен :)
у ArrayList-а тоже массив используется внутри, наверное поэтому я их в голове у себя и приравнял)
правда, у ArrayList-а используется внутри массив объектов. так что да, через StringBuilder будет чуток пооптимальней :)
0
smart_engineer
11 декабря 2021, 21:28
Я использовал как раз StringBuilder
В правильном решение считанную строку добавляли в ArrayList. В итоге у меня вместо набора строк была одна большая. Но как мы выяснили это примерно тоже самое что добавлять строки в список. С первой частью программы (чтение из файла) вопрос снят.
Есть еще вопрос по второй части. В моем варианте я делил свою длинную строку методом split() и мог получить очень большой массив строк. Подозреваю это более затратно чем много раз разделить на массивы строки поменьше.
0
hidden #598481
11 декабря 2021, 23:12
На самом деле каждый сплит или сабстринг это такое себе занятие с точки зрения памяти.
Дело в том, что строка, как известно содержит массив байт, а сабстринг не укорачивает его буквально, как можно было подумать, а лишь прячет из отображения его ненужную часть, оставляя видимым только искомый фрагмент. Сплит аналогично.
То есть если выполнить "a b c d".split(" "), то в памяти помимо оригинального объекта строки будет создано ещё четыре абсолютно таких же "a b c d", только у одного "видимой" частью будет "a" , у второго "b" и так далее, а в памяти места занято на всю исходную строку. Соответственно, на длинных строках, где в результате и массив получается длинный, и каждый элемент - это длинная строка, памяти может подожрать прилично.
0
Стас ПасинковSoftware Developer в ZipyMaster
12 декабря 2021, 07:54
в 8й джаве (или даже в 7й) эту штуку с сабстрингом заоптимайзили. насчет сплита - не уверен, но думаю тоже
сам недавно попался на этом :)
джавараш у себя тоже поправили, кстати :) "поправили" с того момента, когда я про эту штуку у них прочитал, а это было очень давно)))
0
smart_engineer
14 декабря 2021, 12:56
VK, получается по памяти разницы нет. Что длинная строка будет в памяти храниться, что тот же текст разбитый на короткие строки, будет храниться как ArrayList. Или в случае ArrayList строки будут подгружаться в "быструю" память по очереди, для обработки, а целиком массив хранится в "медленной"?
0