У меня есть примерно 420 000 элементов, которые мне нужно легко хранить в каком-либо наборе или списке.Ограничения, однако, заключаются в том, что мне нужно иметь возможность выбирать случайный элемент и что он должен быть быстрым.
Изначально я использовал ArrayList и LinkedList, однако с таким количеством элементов это было очень медленно.Когда я его профилировал, я увидел, что метод equals()
в объекте, который я хранил, вызывался примерно 21 миллион раз за очень короткий период времени.
Далее я попробовал HashSet.То, что я получаю в производительности, я теряю в функциональности: я не могу выбрать случайный элемент.HashSet поддерживается HashMap, который поддерживается массивом HashMap.Entry
объектов.Однако, когда я попытался раскрыть их, мне помешала сумасшедшая приватность и приватность пакета всей Java Collections Framework (даже копирование и вставка класса не работали, JCF очень «использует то, что у нас есть, или сверните свои собственные»).«).
Каков наилучший способ случайного выбора элемента, хранящегося в HashSet или HashMap?Из-за размера коллекции я бы предпочел не использовать циклы.
ВАЖНОЕ РЕДАКТИРОВАНИЕ: Я забыл действительно важную деталь: как именно я использую коллекцию.Я заполняю всю коллекцию в начале стола.Во время программы я выбираю и удаляю случайный элемент, затем выбираю и удаляю еще несколько известных элементов, затем повторяю.Постоянный поиск и изменение - вот что вызывает медлительность