LINUX.ORG.RU

Сработает ли в моем случае идея заменить arrayList массивом

 


0

1

У меня есть arrayList некоторых объектов, их в среднем 150, максимум около 1000. Они часто создаются и удаляюсь(около 30 в секунду). Проблема в том что удаляются они из середины, и если я правильно понимаю механизм arrayList то стоимость этой операции тем больше чем дальше элемент храниться от последнего элемента. Но мне порядок элементов не важен.

Моя идея в следующем, создаем массив с максимально возможным количеством объектов, дальше в некой переменной (пусть count) храним количество этих объектов. При добавлении элемента просто создаем его в array[count] = new Obj(); При удалении из середины последний объект перемешаем в тот что удаляем. В результате работает быстрее. Более того, никаких проблем с многопоточностью.

array[this_element_delete] = array[count-1];
array[count-1] = null;

Но собственно я плохо знаю джаву, как в этом случае будет вести себя сборщик мусора? Другие подводные камни?

★★★

Лучше вообще использовать LinkedList в данной ситуации - он как раз и создан для случаев, когда постоянно идёт добавление-удаление в случайные места списка.

GblGbl ★★★★★
()
Последнее исправление: GblGbl (всего исправлений: 1)
Ответ на: комментарий от GblGbl

Лучше вообще использовать LinkedList в данной ситуации - он как раз и создан для случаев, когда постоянно идёт добавление-удаление в случайные места списка.

У меня ещё была проблема с потоками, и как её решить я не понимаю. В моем способе таких проблем не будет?

abs ★★★
() автор топика
Ответ на: комментарий от GblGbl

Ага, только если к элементу обращаются по индексу, а не как-либо ещё, то профита никакого не будет.

PolarFox ★★★★★
()
Ответ на: комментарий от abs

Не знаю, что за проблема, но должно помочь synchronized(listName){ listName.add(...); ... listName.remove(...); } для каждой операции, но это из пушки по воробьям.
Есть много потокобезопасных коллекций в java.util.concurrent.

GblGbl ★★★★★
()
Ответ на: комментарий от GblGbl

Есть много потокобезопасных коллекций в java.util.concurrent.

так они медленнее.

abs ★★★
() автор топика
Ответ на: комментарий от IvS

Или балансированные деревья. Они в среднем за O(log n)

против моего O(1);

abs ★★★
() автор топика

Возьмите Set уже, раз порядок элементов не нужен.

rand
()

Тебе ещё учить структуры данных никто не советовал? Именно разбираться в том, как и почему они работают, а не посмотреть доки по интерфейсу и сложности. Чтобы не велосипедить потом.

devsdc ★★
()
Ответ на: комментарий от devsdc

Чтобы не велосипедить потом.

Если есть много кода, написанного для массива, то проще добавить нужную операцию поверх массива, чем всё переписывать.

monk ★★★★★
()

массив - это отлично.

+ ты смотрел ConcurrentHashMap? Во сколько раз у нее просядет производительность перед массивом?

stevejobs ★★★★☆
()
Ответ на: комментарий от monk

Если есть много кода

Вот про это я и говорю. Заранее нужно думать, какие структуры нужны и почему. А то привыкают делать всё на известных структурах, а потом удивляются тому, что какая-нибудь очередь на ArrayList люто тормозит.

devsdc ★★
()

По-моему, здравая идея. Только добавлю от себя пару замечаний.

  • Если программа исполняется в многопоточной среде, то надо быть крайне внимательным с вещами вида «последний объект перемешаем в тот что удаляем» и модификацией count. Надо, чтобы эти операции выполнялись атомарно, иначе могут возникнуть всякие трудновоспроизводимые аномалии.
  • Возможно, вместо переменной count имеет смысл завести BitSet (тоже не потокобезопасный!), который будет указывать занятые и свободные элементы массива. С одной стороны, тогда не придется ничего перемещать, но с другой стороны, прибавится работы при вставке.
  • На LinkedList я бы не стал рассчитывать, но вместо гаданий можно попробовать взять его и посмотреть на результат.
CARS ★★★★
()

Более того, никаких проблем с многопоточностью.

Нет, при удалении массив всё равно придётся лочить.

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)
Ответ на: комментарий от Deleted

Аналогично. Совсем малую малость в Java. Но черт, это должно быть известно всем, какой List когда использовать.

anonymous_sama ★★★★★
()

Java
Игры

Они часто создаются и удаляюсь(около 30 в секунду).

Пул делай.

Kuzy ★★★
()

нет, не сработает. тебе вообще, судя по всему, не нужен ни массив, ни List.

для того чтобы понять, что же тебе нужно - опиши действия, которые ты с коллекцией будешь делать.

maloi ★★★★★
()
Ответ на: комментарий от maloi

для того чтобы понять, что же тебе нужно - опиши действия, которые ты с коллекцией будешь делать.

У меня патроны или пули. Они могут создаваться, при столкновению с целью исчезают. Следовательно - порядок не важен. Удаление из произвольного места, прямой доступ не нужен

abs ★★★
() автор топика
Ответ на: комментарий от abs

тебе зачем вообще их в коллекции хранить, можешь объяснить? ты будешь по ней итерироваться и удалять пули, удовлетворяющие некоторому условию?

maloi ★★★★★
()
Ответ на: комментарий от maloi

тебе зачем вообще их в коллекции хранить, можешь объяснить?

Незачем. Мне нужен был аналог вектора, так как количество пуль не известно. Я выбрал arrayList, я сделал что-то не так?

abs ★★★
() автор топика
Ответ на: комментарий от abs

Незачем. Мне нужен был аналог вектора, так как количество пуль не известно. Я выбрал arrayList, я сделал что-то не так?

ну и храни количество в отдельной переменной, нахрена для того чтобы узнать количество помещать объекты в коллекцию?

maloi ★★★★★
()
Ответ на: комментарий от abs

скорее вопрос для лучшего понимания переформулировать надо так: что бы ты делал с массивом, если бы количество было заранее известно и не менялось?

maloi ★★★★★
()
Ответ на: комментарий от maloi

ну и храни количество в отдельной переменной, нахрена для того чтобы узнать количество помещать объекты в коллекцию?

wat??? Я говорю о том что незнаю сколько заранее будет пуль, и их количество всегда меняется, для этого я применил аналог вектора их с++

abs ★★★
() автор топика
Ответ на: комментарий от maloi

что бы ты делал с массивом, если бы количество было заранее известно и не менялось?

К чему этот вопрос? У меня есть удаление и добавление элементов.

abs ★★★
() автор топика
Ответ на: комментарий от maloi

ты можешь сказать, какие методы класса вектор из C++ ты бы вызывал, если бы это был C++ ?

push_back(); и кажется remove();

abs ★★★
() автор топика
Ответ на: комментарий от abs

т.е. удалять по индексу? а индекс ты откуда будешь брать?

maloi ★★★★★
()
Ответ на: комментарий от abs

кстати, если тебе нужны только эти две функции, без чего-либо типа at/operator[], то зачем тебе вообще вектор?

maloi ★★★★★
()
Ответ на: комментарий от maloi

Вот у тебя вроде 4 звезды, но ты не можешь понять что я делаю.

У меня СНАРЯДЫ. мои бойцы их могут создать. Каждый фрейм с каждый снарядом выполняется действие(изменяются координаты - они летят). Когда они попадают в цель они удаляются из вектора.

abs ★★★
() автор топика
Ответ на: комментарий от Stil

Если тебе не важен порядок - используя множество или хеш картуэ

Не будет ли мой вариант быстрее?

abs ★★★
() автор топика
Ответ на: комментарий от abs

Вот у тебя вроде 4 звезды, но ты не можешь понять что я делаю.

количество звезд не влияет на способность телепатически извлекать твои мысли. это скорее ты не можешь понять, что я от тебя хочу узнать.

У меня СНАРЯДЫ. мои бойцы их могут создать. Каждый фрейм с каждый снарядом выполняется действие(изменяются координаты - они летят). Когда они попадают в цель они удаляются из вектора.

ты напиши в псевдокоде (или кусок реального кода приложи), как ты их оттуда будешь удалять, т.к. то что ты описал - можно сделать без всяких векторов.

maloi ★★★★★
()
Ответ на: комментарий от abs

на самом деле 30 в секунду и коллекция из 1000 элементов - это очень мало, и я очень сильно сомневаюсь, что ты сможешь хоть каким-нибудь инструментом измерить разницу от того что ты поменяешь одну реализацию на другую (если конечно где-нибудь не напортачишь совсем жестоко, но тогда скорее всего будут тормозить любые реализации).

maloi ★★★★★
()
Ответ на: комментарий от abs

У меня СНАРЯДЫ. мои бойцы их могут создать. Каждый фрейм с каждый снарядом выполняется действие(изменяются координаты - они летят). Когда они попадают в цель они удаляются из вектора.

Создай массив на максимальное число снарядов. В классе снаряда создай поле active. Если нужно создать снаряд — ищешь первый попавшийся объект с active=false, делаешь ему active=true и используешь его. Вместо удаления снаряда делаешь active=false. Есть готовые коллекции для работы в подобном стиле, ключевое слово для гугления — pooling.

Иначе раз в несколько секунд игру будет заедать на сборку мусора.

PolarFox ★★★★★
()
Последнее исправление: PolarFox (всего исправлений: 1)
Ответ на: комментарий от maloi

на самом деле 30 в секунду и коллекция из 1000 элементов - это очень мало

Не забывай, я пишу под телефоны, они не шибко быстрые.

abs ★★★
() автор топика
Ответ на: комментарий от abs

Не забывай, я пишу под телефоны

очень хреново получается, когда не знаешь, да ещё и забудешь, или мне опять нужно было проявлять телепатию?

они не шибко быстрые.

j2me что-ли? значит я пишу в некрофильском треде.

maloi ★★★★★
()
Ответ на: комментарий от maloi

очень хреново получается, когда не знаешь, да ещё и забудешь, или мне опять нужно было проявлять телепатию?

на джава пишут игры не под андроид? Оооо. Даже не так, на джава пишут игры под линукс?????

abs ★★★
() автор топика
Ответ на: комментарий от abs

на джава пишут игры не под андроид?

да

Даже не так, на джава пишут игры под линукс?????

нет, на джава пишут кросплатформенные игры.

ЗЫ. если ты пишешь под андроид, то под андроидом железо такое, что моё замечание про скорость вполне себе верно.

maloi ★★★★★
()

Пул объектов сделай. Ничего не удаляй. Только поля переинициализируй и всё.

//ziemin

anonymous
()
Ответ на: комментарий от anonymous

Какой же ты тупой.

Детка, я понимаю что ты неспособен воспринимать объективные факты которые не в твою сторону, я сдал зно на 192 балла, балл этот рейтинговый, и это значит что я нагнул более 98% своих ровесников. Физика 194, и это 99%. лав ю.)

abs ★★★
() автор топика
Ответ на: комментарий от PolarFox

Создай массив на максимальное число снарядов. В классе снаряда создай поле active. Если нужно создать снаряд — ищешь первый попавшийся объект с active=false, делаешь ему active=true и используешь его. Вместо удаления снаряда делаешь active=false. Есть готовые коллекции для работы в подобном стиле, ключевое слово для гугления — pooling.

Вроде понял. Спасибо. На этом думаю можно делать тему решенной.

abs ★★★
() автор топика
Ответ на: комментарий от anonymous

Извини, не указал что именно. Математику, математику я сдал лучше чем 98% сверстников. любви тебе.

abs ★★★
() автор топика
Ответ на: комментарий от anonymous

Сначала ты говоришь это «Какой же ты тупой.». А потом меняешь тему, так делают только пидары типа тебя. Допилю игру, дам ЛОРу на пробу, понравиться, выложи исходники и/или перепишу на Qt;

abs ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.