android estrutura de dados
TRANSCRIPT
Estruturas de Dados AndroidOtimizando uso de memória em aplicações android
Paula RosaDesenvolvedora Android
Estruturas de dados Java• API do Java;• Representam estruturas de dados
avançadas;• Vieram para facilitar a manipulação de
estruturas;• Mais utilizadas no android: ArrayList,
HashMap;
Estrutura de dados JavaArrayList LinkedList HashMap TreeMap
interface List
interface Map
- Permite valores duplicados - Não Permite chaves duplicadas
ArrayList• Representa um array (série de elementos do mesmo
tipo);• Foi criada para facilitar manipulação com os arrays• Rápida para acessar elementos get(index);• Não é syncronized LinkedList• Lista ligada: cada elemento Entry possui 3
referencias: next, previous e element;• Rápida para adicionar e remover elementos;• Não é syncronized
HashMap• Possui conceito de chave-valor (key-value);• Implementa a interface Map;• 2 conceitos importantes:
- initial size: default 16 posições- load factor (float mensura o momento em que
dobrará o número de posições) - default: 0.75• Métodos: put(key, value), get(key), containsKey(key)
…• Não é syncronized
Estrutura de dados Android: SparseArray e ArrayMap• São estruturas de dados criadas
especificamente para o Android;• Usadas em situações que precisamos de
estruturas Chave-Valor (key-value);
1˚ motivo: Autoboxing
• Conversão automática de um primitivo na sua classe Wrapper;
• Ocorre em tempo de compilação;• Hashmap não permite chaves com primitivos;
Integer i = 5;
2˚ motivo: Objetos Extras para mapeamento
• Cria um objeto extra (int) usado no cálculo da posição;
• Precisa armazenar os valores de hashcode, chave, valor e próximo registro;
10
5
15
2
3
função hash
f(x) = x mod 13
Posição
chave
nullnull23
null5
15
bucket
Colisão
SparseArray• Utiliza conceito de chave-valor (key-value);• utiliza valores int ou long primitivos como
chave; • Utiliza um array separado para a chave;• Utiliza busca binária internamente;• Recomendado para estruturas até 1000
elementos;
SparseArray
• Os elementos removidos são marcados, o array não sofre compactação logo em seguida da remoção;
• Futuramente será recolhido pelo GC;
Chave Valor
Arrays
Adicionar de Elementos Remoção de elementos
012345
ABCKEF
put(3,”K") 012345
ABC
DeletedEF
remove(3)012345
ABCDEF
SparseArray
Considerações:• O elemento removido é
marcado como DELETED;• Ao requisitar o tamanho ou um
elemento, ocorre a compactação;
• Ao inserir verifica se a posição já esta marcada como Deleted;
SparceArray Tipo de dados
SparseArray <int, Object>SparseIntArray <int, int>SparseBooleanArray <int ,
boolean>SparseLongArray <int, long>LongSparseArray <long,
Object>
Curiosidades • SparseArray é recomendado para estrutura de dados
pequenas
"João""Amanda"
"Luiz"
HashMap
função hash
AmandaLuiz
012
…
João
…
14
Bucket
O(1) constante (melhor caso)O(n) proporcional (pior caso)
SparseArrays
012345
ABCDEF
O(log n) - busca bináriainserir e deletar mais trabalhoso
get get
Resultado• Redução na quantidade de objetos utilizados;• Implica em menos objetos para serem recolhidos pelo garbage
collector;• Melhor aproveitamento da estrutura;• Economia de memória;
ArrayMap• Utiliza conceito de chave-valor (key-value);• Utiliza objetos como chave; • Utiliza dois arrays: um com valor de hash outro
com chave/valor;• Utiliza busca binária internamente;• Implementa a interface Map;• Recomendado para estruturas até 1000
elementos;
ArrayMap
Considerações:• Recomendado para maior frequência de leitura (get);• Adicionar e remover são mais custosos;• Cache interno de Arrays de tamanho 4 e 8 para
evitar spam do GC;• API 19+;
Array 1 Array 2
hash #1hash #2hash #3
key #1value #1key #2value #2key #3value #3
ArrayMap
Iteração
Curiosidades • ArrayMap é recomendado para estrutura de dados
pequenas
"João""Amanda"
"Luiz"
HashMap
função hash
AmandaLuiz
012
…
João
…
14
Bucket
O(1) constante (melhor caso)O(n) proporcional (pior caso)
hash #1hash #2hash #3
key #1value #1key #2
value #2key #3
value #3
ArrayMap
O(log n) - busca bináriainserir e deletar mais trabalhoso
get get
Resultado• Redução na quantidade de objetos utilizados;• Implica em menos objetos para serem recolhidos pelo garbage
collector;• Melhor aproveitamento da estrutura;• Economia de memória;
Curiosidades • SparseArrayCompat (suporte versões API < 19)
• removeAtRange(int index, int size);• ArrayMap implementa interface Map
• SimpleArrayMap (suporte)• importante: não implementa Map, mas contém
a maioria dos métodos;• ArraySet implementa Collection<E> e Set<E>;
Curiosidades • Syncronized:
• ArrayList, LinkedList• Collections.syncronizedList(lista);
• HashMap • Collections.syncronizedMap(map);• HashTable;
finally{}• Utilizar estrutura de dados do Android quando
necessário;• Tamanho de dados não exceder 1000 itens;• Chaves int ou long: SparseArray• Chaves objetos: ArrayMap• Usar SimpleArrayMap quando não precisar de
compatibilidade com Map;
Referências• https://developer.android.com/reference/android/util/
SparseArray.html• https://developer.android.com/reference/android/
support/v4/util/ArrayMap.html• https://www.youtube.com/watch?v=ORgucLTtTDI• https://www.youtube.com/watch?v=I16lz26WyzQ&t=129s• http://gunhansancar.com/sparsearray-vs-hashmap/ • https://blog.mindorks.com/android-app-optimization-using-
arraymap-and-sparsearray-f2b4e2e3dc47#.lhprjal9a • http://deepakmishra.me/blog/index.php/2015/10/19/hashmaps-
arraymaps-and-sparsearrays-in-android/• http://www.roman10.net/2017/01/29/arraymap-and-its-friends-in-
android/• http://www.roman10.net/2017/01/21/sparsearray-and-its-friends-
in-android/