В некоторых ограниченных случаях может работать хеш-карта. Но вам нужно подумать о:
(1) Как вы собираетесь очищать кэшированные изображения из памяти, когда кэш заполнен (однако вы определяете это - возможно, какой-то максимальный объем памяти, который вы хотите выделить для кэширования).
(2) Как вы собираетесь бороться с параллелизмом.
(3) Соответственно, как вы будете иметь дело со случаем, когда клиент A запрашивает изображение, а затем клиент B запрашивает то же изображение, пока оно все еще загружается в кэш для клиента A.
Очень простое решение (1) может заключаться в том, чтобы всегда сохранять SoftReferences для данных изображения и позволить JVM позаботиться о принятии решения о том, когда их очищать (имейте в виду, что это может произойти произвольно, иногда в не зависящих от вас). В противном случае вам необходимо разработать какую-то политику (сначала - изображение, к которому обращались дольше всего назад, наименьшее / наибольшее изображение и т. Д., Изображение, которое понадобится больше всего времени для декодирования, если нам потребуется загрузить его снова и т. Д.) - только вы знаете свои данные и использование так что вы должны найти правильную политику.
Для (2) ConcurrentHashMap , как правило, поможет вам; Вы можете решить использовать явные блокировки и другие утилиты параллелизма в более изумительных случаях.
Для (3) довольно элегантное решение, предложенное Гетцем и его коллегами, заключается в угоне класса Future. На вашей карте вы сохраняете Future в кэшированном объекте (или в вашем объекте «записи в кэше»). Если запрашивающий объект обнаруживает, что Future уже добавлен на карту, он может вызвать get () и подождать, пока другой поток завершит кеширование данных. (Вы можете достичь аналогичного эффекта с явной блокировкой и условием, но Future берет на себя часть работы за вас.)
P.S. Я согласен с постером, который сказал, что вы, вероятно, хотите хранить изображения в их первоначальном кодированном виде. Но из вашего кода я предполагаю, что это было, вероятно, то, что вы намеревались все время.