Создайте List<String>
пар состояний и Map<String, String>
пар [город, штат] и размещайте их на сервере в качестве статических данных только для чтения.Загрузите его из базы данных при запуске.
Я бы порекомендовал WeakHashMap
в качестве вашей реализации.Это даст GC возможность выселить значения, если это абсолютно необходимо.
Количество состояний не изменится, но список городов может быть довольно большим.