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