Sobes.tech
Middle

In Android gibt es Maps, in die man primitive Typen hinzufügen kann. Kannst du mehr darüber erzählen?

sobes.tech KI

Antwort von AI

Ja, um Android SDK, existem implementações especializadas de Map para trabalhar com tipos primitivos, otimizadas para desempenho e economia de memória em comparação com o HashMap<K, V> padrão.

As mais comuns são:

  • SparseIntArray: Armazena pares de chaves int e valores int.
  • SparseLongArray: Armazena pares de chaves int e valores long.
  • SparseBooleanArray: Armazena pares de chaves int e valores boolean.
  • LongSparseArray<E>: Armazena pares de chaves long e objetos do tipo E.

Vantagens do uso dessas classes:

  • Eficiência de memória: Elas usam arrays internos para armazenar dados, evitando custos associados à criação de objetos wrapper para tipos primitivos (Integer, Long, Boolean) e à estrutura de lista ligada de HashMap.
  • Desempenho: Operações de inserção, obtenção e remoção geralmente são mais rápidas, especialmente com muitos elementos, graças a uma estrutura interna mais simples e à evitação de hashing para chaves primitivos no caso de SparseArray.

Exemplo de uso de SparseIntArray:

// Criar SparseIntArray
SparseIntArray sparseArray = new SparseIntArray();

// Adicionar elementos
sparseArray.put(0, 100);
sparseArray.put(1, 200);
sparseArray.put(10, 300);

// Obter valor por chave
int value = sparseArray.get(1); // value será 200

// Obter valor por chave com valor padrão
int valueWithDefault = sparseArray.get(5, -1); // valueWithDefault será -1

// Remover elemento por chave
sparseArray.delete(10);

// Iterar sobre os elementos
for (int i = 0; i < sparseArray.size(); i++) {
    int key = sparseArray.keyAt(i);
    int val = sparseArray.valueAt(i);
    // Lógica de processamento de key e val
}

De modo similar, SparseLongArray, SparseBooleanArray e LongSparseArray são utilizados. LongSparseArray requer a especificação do tipo de objeto, pois seus valores são objetos e não tipos primitivos.

A escolha entre HashMap padrão e mapas Sparse especializados depende de seus requisitos:

  • Se as chaves forem objetos arbitrários ou tipos primitivos que não sejam int ou long, use HashMap.
  • Se as chaves forem int ou long, e os valores forem tipos primitivos ou objetos no caso de LongSparseArray, e a eficiência de memória e desempenho forem importantes, é preferível usar mapas Sparse.

É importante notar que mapas Sparse não são seguros para uso em múltiplas threads. Se precisar de uma implementação segura para threads, considere usar ConcurrentHashMap com objetos wrapper para primitivos. No entanto, na maioria dos casos, na thread de interface do usuário de uma aplicação Android, onde essas estruturas são frequentemente usadas, a segurança de threads não é um problema.