Java: Как инициализировать и заполнить окончательный статический упорядоченный Map? - PullRequest
3 голосов
/ 05 марта 2012

У меня есть алгоритм стволов в Java, который требует статического финала HashMap<String, String>, предварительно заполненного около 30 000 записей.

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

Я подумал, что мог бы вручную вставить значения в файл класса Java, поскольку это самый быстрый способ загрузить их в ОЗУ (время / производительность очень важны для этого проекта), используя 30 000 вызовов, таких как

map.put("Key", "Value");

Проблема в том, что java (или, по крайней мере, затмение) допускает только 65 КБ кода в любом сегменте / методе и т. Д. Поэтому я в итоге расширил 11 классов и поместил 65 КБ .put s в конструктор или static { } .

Все было хорошо, но когда я запускаю его, порядок шифруется. Для стольких строк я не могу отследить, где что-то пошло не так, в порядке расширения или на карте.

Итак, скажите, пожалуйста, как лучше всего заполнить финальную карту в java с точки зрения производительности.

P.S .: Загрузка и разбор записей из файла слишком медленная ...

Ответы [ 2 ]

5 голосов
/ 05 марта 2012

Все было хорошо, но когда я запускаю его, порядок шифруется. Для так много строк я не могу отследить, где все пошло не так, в продолжении заказать или на карте.

a) HashMap не сохраняет порядок вставки. Вместо этого используйте LinkedHashMap. Или, так как вы будете использовать его как константу, рассмотрите Guava ImmutableMap. Он сохраняет вставку oder, является неизменным и предоставляет объект-конструктор для его построения со многими значениями.

б)

P.S .: Загрузка записей из файла слишком медленная ...

Почему? Это будет сделано только один раз, во время загрузки класса. А 35K String / String пары на самом деле не много данных для современной машины.

2 голосов
/ 05 марта 2012

Рассматривали ли вы использовать в базе данных памяти (например, HSQLDB) Неправильно предварительно заполнить класс таким количеством данных.

...