[解決済み] SparseArrayとHashMapの比較
質問
いくつかの理由が思い当たります。
HashMap
よりも、整数のキーを持つものの方がはるかに優れています。
SparseArray
s:
-
のAndroidのドキュメントは
SparseArray
には、「一般に、従来のHashMap
"です。 -
を使ってコードを書くと
HashMap
ではなくSparseArray
を使用すると、コードが他の Map の実装で動作し、Map 用に設計されたすべての Java API を使用できるようになります。 -
を使ってコードを書くと
HashMap
ではなくSparseArray
を使用すれば、Android以外のプロジェクトでもコードが動作します。 -
マップのオーバーライド
equals()
とhashCode()
一方SparseArray
がない。
しかし、私が
HashMap
を使用するよう指示されました。
SparseArray
の代わりに。これは本当に理解しがたいことだと思います。誰か
SparseArray
s?
どのように解決するのですか?
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
メモリの面では、以下のような例があります。
SparseIntArray
対
HashMap<Integer, Integer>
を1000要素で表示します。
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バイト
出典 アンドロイド・メモリーズ by ロマン・ガイ スライド90より
上記の数値は、JVMがヒープ上に確保したメモリ量(バイト)です。 使用する特定のJVMによって異なる場合があります。
を使用します。
java.lang.instrument
パッケージには、オブジェクトのサイズをチェックするような高度な操作に役立つメソッドがいくつか含まれています。
getObjectSize(Object objectToSize)
.
その他の情報は、公式から入手可能です。 オラクルのドキュメント .
クラス = 12 バイト + (n 個のインスタンス変数) * 4 バイト
配列=20バイト+(n要素)×(要素サイズ)
エントリ = 32バイト + (第1要素サイズ) + (第2要素サイズ)
関連
-
ファインバグタイプ
-
プロジェクトの依存関係を解決できなかった 解決
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 4 at text.Division.main(Divisi
-
HttpClientがGZIP形式でない場合の対処法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] HashMapを直接(リテラルに)初期化する方法は?
-
[解決済み] ハッシュマップのキーを指定して、値を更新するには?
-
[解決済み] Java Hashmap。値からキーを取得する方法は?
-
[解決済み】HashMap、LinkedHashMap、TreeMapの違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
JQuery DataTable 详解
-
エラーの解決方法 jarfile XXX.jarにアクセスできません。
-
Methodのinvokeメソッド実装のJavaリフレクション
-
Javaエラーメッセージがenclosingクラスでない
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
mavenプロジェクトのテストエラー java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig の問題を解決する。
-
java 例外。Javaツールの初期化
-
[解決済み] HashMapとintをキーとする