SparseArray
HashMap
キーがプリミティブタイプの場合に、置換に使用できます。すべてが公開されているわけではありませんが、さまざまなキー/値タイプにはいくつかのバリアントがあります。
利点は次のとおりです。
欠点:
- 一般的に低速で、大規模なコレクションには表示されません
- Android以外のプロジェクトでは機能しません
HashMap
以下で置き換えることができます:
SparseArray <Integer, Object>
SparseBooleanArray <Integer, Boolean>
SparseIntArray <Integer, Integer>
SparseLongArray <Integer, Long>
LongSparseArray <Long, Object>
LongSparseLongArray <Long, Long> //this is not a public class
//but can be copied from Android source code
メモリに関しては、1000要素のSparseIntArray
vsの例を次に示しHashMap<Integer, Integer>
ます。
SparseIntArray
:
class SparseIntArray {
int[] keys;
int[] values;
int size;
}
クラス= 12 + 3 * 4 = 24バイト
配列= 20 + 1000 * 4 = 4024バイト
合計= 8,072バイト
HashMap
:
class HashMap<K, V> {
Entry<K, V>[] table;
Entry<K, V> forNull;
int size;
int modCount;
int threshold;
Set<K> keys
Set<Entry<K, V>> entries;
Collection<V> values;
}
クラス= 12 + 8 * 4 = 48バイト
エントリ= 32 + 16 + 16 = 64バイト
配列= 20 + 1000 * 64 = 64024バイト
合計= 64,136バイト
出典:スライド90のRomain GuyによるAndroid Memories
上記の数値は、JVMによってヒープに割り当てられたメモリの量(バイト単位)です。使用される特定のJVMによって異なる場合があります。
java.lang.instrument
パッケージが持つオブジェクトのサイズを確認するなどの高度な操作のためのいくつかの有用なメソッドが含まれていますgetObjectSize(Object objectToSize)
。
追加情報は、オラクルの公式ドキュメントから入手できます。
クラス= 12バイト+(nインスタンス変数)* 4バイト
配列= 20バイト+(n要素)*(要素サイズ)
エントリ= 32バイト+(1番目の要素サイズ)+(2番目の要素サイズ)