Os arrays, em especial os bidimensionais, dão muito jeito para armazenar informação - especialmente quando existem vários registos que contêm o mesmo tipo de dados. Apesar da limitação que apresentam relativamente à sua dimensão (que é fixa, a partir do momento em que um array é criado), fazemos deles uso regular.
Por curiosidade, investigámos um pouco mais sobre o espaço em memória que é reservado (gasto) assim que é criado um array, mesmo que este se encontre “vazio”, e chegámos a algumas conclusões interessantes.
Em Java, a criação de um array de valores inteiros implica um overhead de 16 bytes (8 deles definem o objecto). Para arrays de alguma dimensão, este overhead representa uma percentagem baixa do espaço total reservado, não sendo por isso um factor relevante. No entanto, e porque o Java não suporta directamente a criação de arrays de múltipla dimensão, um array bidimensional é no fundo um array de um array. Como tal, para um array de dimensões [i][j], cada array [j] representa um objecto separado, que implica (para o caso de valores inteiros) o overhead de 16 bytes.
Um dos exemplos que encontrámos compara um array de apenas uma dimensão int[256] com um array bidimensional int[128][2]. Embora ambos apresentem o mesmo espaço disponível para armazenamento, efectivamente em memória são gastos apenas 1040 bytes para o primeiro, mas 3600 bytes para o segundo (2.46x mais espaço ocupado!).
Muitos dos arrays que utilizamos armazenam valores do tipo string, de dimensão de 40 bytes (comparado com apenas 4 bytes para um inteiro); para além disso, o overhead sobe para 24 bytes. Para um exemplo idêntico - string[256] e string[128][2] - seriam necessários respectivamente 10246 e 18456 bytes, uma proporção inferior (”apenas” 0.8x maior), dado que o overhead é bastante inferior ao espaço necessário para armazenar a string.
Não é difícil imaginar que será fácil atingir arrays do tipo string na ordem dos megabytes (um array vazio de dimensão [1000][50] ocupa cerca de 2MB), o que num telemóvel representa um potencial risco. Por uma questão de perspectiva, o iPhone possui apenas 128MB de RAM, sendo que cerca de 11MB são reservados para a placa gráfica, e uma boa parte da memória restante é utilizada pelo OS e as aplicações comuns que o telemóvel necessita de ter a funcionar.
Embora no nosso caso não seja necessário armazenar grandes volumes de informação, esta é uma questão pertinente e interessante. Como exemplo, estimamos necessitar de cerca de 700KB para armazenar temporariamente os dados de 1000 contactos telefónicos, caso o utilizador deseje restaurar toda a informação em backup do lado Web. Tipicamente os arrays que utilizamos andarão na ordem dos 150~200KB, para 1000 contactos.








