Potrzebuję użyć hashmap do przechowywania klucz/wartości w mojej aplikacji na Androida (potencjalnie tysiące), ale rozumiem, że powinienem używać SparseArray w celu zaoszczędzenia pamięci. Jednak mój klucz musi być ciągiem. Czy istnieje sposób na stworzenie niestandardowej implementacji SparseArray lub innej alternatywy?Android SparseArray z klawiszem String?
Odpowiedz
SparseArray jest rzeczą, gdy kluczem są liczby całkowite. Jest to optymalizacja pamięci, która jest możliwa tylko z wartościami całkowitymi, ponieważ musisz przeszukiwać klucze binarnie. Wyszukiwania binarne ciągów są kosztowne i nie są dobrze zdefiniowane (czy "1" powinno być mniejsze lub większe niż "a" lub "zwariowany japoński znak"?), Więc nie robią tego.
BTW, SparseArray oszczędza pamięć, ale może zająć więcej czasu. Uzyskanie mapy HashMap powinno wynosić O (n/size), gdzie rozmiar jest liczbą segmentów w mapie mieszającej. SparseArray ma być O (log (n)). To, którego użyć, zależy od pamięci i szybkości, jakiej potrzebujesz. Jeśli masz naprawdę dużą (100 tysięcy wpisów), możesz nawet uruchomić problemy z przywoływaniem pamięci, w których fizyczna rzeczywistość w przypadku pomyłek w pamięci podręcznej może spowodować, że więcej HashMap będzie działało lepiej, nawet jeśli jest technicznie gorsza, ponieważ będzie miała maksymalnie 1 pamięć podręczną miss na get, podczas gdy wyszukiwanie binarne może mieć wiele.
SparseArray
to wyspecjalizowana klasa dla map, dla których jako typ klucza użyto liczb całkowitych. Zasadniczo używają tego faktu do zapisania wartości int zamiast odwołania do obiektu Integer (stąd oszczędność pamięci).
Nie ma nic nieodłącznego w używaniu standardu HashMap
, gdy klucz jest innego rodzaju.
Podczas wpisywania ciągu używa standardowej praktyki HashMap, gdy: 1. Potrzebuję przechowywać tysiące lub nawet miliony wpisów i 2. wpisywać ciąg w celu pobrania wartości? Nie ma absolutnie lepszego sposobu na zrównoważenie pamięci i prędkości? – Mike6679
@Mike jeśli twoje struny mogą mieć wspólne przedrostki, możesz chcieć użyć Drzewa Radix. – matiash
Można użyć ArrayMap: ArrayMap jest ogólnym keystone> struktura danych mapowania wartość, która ma być więcej pamięci efektywne niż tradycyjne HashMap
uzyskać więcej informacji: ArrayMap Doc
Można wykorzystać hashCode ciągu -> mystring.hashCode()
Hmmm.ok ma sens. Jaka jest najlepsza praktyka, gdy trzeba wprowadzić klucz? Czy hashmap jest najbardziej efektywnym sposobem na szybkość i pamięć? – Mike6679
Wybierz jedną pamięć lub prędkość. Nie zoptymalizujesz dla obu. Jeśli potrzebujesz prędkości, użyj mapy hash. Jeśli potrzebujesz pamięci, przejdź do czegoś w oparciu o tablicę, posortowaną listę lub BST (z czego korzysta wiele baz danych, a nie zły kompromis z log (n) wyszukiwaniem i pamięcią O (n)). Ale nie będziesz w stanie zoptymalizować obu. Jeśli uważasz, że to będzie problem, wyizoluj go we własnej klasie, aby móc później zmienić implementację. –
Jestem zaznajomiony z drzewa wyszukiwania binarnego, ale klucze na liczbach całkowitych, w jaki sposób użyć BST, jeśli muszę wprowadzić wartość ciągu? – Mike6679