android estrutura de dados

23
Estruturas de Dados Android Otimizando uso de memória em aplicações android Paula Rosa Desenvolvedora Android

Upload: paula-caroline-da-rosa

Post on 13-Apr-2017

254 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Android estrutura de dados

Estruturas de Dados AndroidOtimizando uso de memória em aplicações android

Paula RosaDesenvolvedora Android

Page 2: Android estrutura de dados

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;

Page 3: Android estrutura de dados

Estrutura de dados JavaArrayList LinkedList HashMap TreeMap

interface List

interface Map

- Permite valores duplicados - Não Permite chaves duplicadas

Page 4: Android estrutura de dados

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

Page 5: Android estrutura de dados

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

Page 6: Android estrutura de dados
Page 7: Android estrutura de dados

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);

Page 8: Android estrutura de dados

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;

Page 9: Android estrutura de dados

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

Page 10: Android estrutura de dados

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;

Page 11: Android estrutura de dados

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

Page 12: Android estrutura de dados

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>

Page 13: Android estrutura de dados

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

Page 14: Android estrutura de dados

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;

Page 15: Android estrutura de dados

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;

Page 16: Android estrutura de dados

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

Page 17: Android estrutura de dados

ArrayMap

Iteração

Page 18: Android estrutura de dados

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

Page 19: Android estrutura de dados

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;

Page 20: Android estrutura de dados

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>;

Page 21: Android estrutura de dados

Curiosidades • Syncronized:

• ArrayList, LinkedList• Collections.syncronizedList(lista);

• HashMap • Collections.syncronizedMap(map);• HashTable;

Page 22: Android estrutura de dados

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;

Page 23: Android estrutura de dados

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/