Android SparseArray со строковым ключом?

Мне нужно использовать хэш-карту для хранения ключей/значений в моем приложении для Android (потенциально тысячи), но я понимаю, что я должен использовать SparseArray для сохранения памяти. Однако мой ключ должен быть строкой. Есть ли способ создать пользовательскую реализацию SparseArray или какой-либо другой альтернативы?

Ответ 1

SparseArray - это всего лишь вещь, когда целыми являются ключом. Это оптимизация памяти, которая возможна только с целыми значениями, потому что вам нужно бинарно искать ключи. Бинарные поиски в строках дорогие и недостаточно четко определены (должно быть "1" меньше или больше "а" или "сумасшедшего японского персонажа"?), Поэтому они этого не делают.

BTW, SparseArray сохраняет память, но может занять больше времени. Получить HashMap должен быть O (n/size), где size - количество ведер в хэш-карте. SparseArray будет O (log (n)). Это зависит от объема памяти и скорости, в которой вы нуждаетесь. Если у вас действительно большой (100 тыс. Записей), вы даже столкнетесь с проблемами подкачки памяти, когда физические реалии промахов в кеше могут привести к тому, что больше HashMap будет работать лучше, даже если его технически хуже, потому что у него будет максимум 1 кеш miss per get, в то время как двоичный поиск может иметь несколько.

Ответ 2

Вы можете использовать ArrayMap: ArrayMap представляет собой общую структуру данных сопоставления значений ключей, которая предназначена для большей эффективности памяти, чем традиционная HashMap

Для получения дополнительной информации: ArrayMap Doc

Ответ 3

SparseArray - это специализированный класс для карт, которые имеют целые числа в качестве типа ключа. Они в основном используют этот факт для сохранения значения int вместо ссылки на объект Integer (следовательно, экономия памяти).

Нет ничего неправильного в использовании стандартного HashMap, если ключ имеет любой другой тип.

Ответ 4

Вы можете использовать hashCode строки → mystring.hashCode()