序文
昨夜、AndroidアプリケーションでINTを追加したかったのですが、Eclipseは昨夜、私はそれを無視しました今日の具体的な通知。
より良いパフォーマンスを得るために、代わりに新しいSparsearray <String>(...)を使用してください
この警告は、Sparsearrayを使用してそれを交換して、より良いパフォーマンスを得ることを意味します。
ソースコード
Sparsearrayの全体的なコードは比較的単純であるため、最初にソースコードを表示し、次にSparsearrayの使用がHashmapを使用するよりも優れたパフォーマンスを発揮する理由を分析します。
Public Class sparsear <e> cloneable {new boolean mgarbage = false; * *特定のマッピングを停止するためにyのすべてのマッピングを必要としない新しいスパルレイを作成します。 Arlocations(int initial -capacity){mkeys = containerhelpers.empty_ints;} = new Object [InitialCapacity];} msize = 0;}} @override @suppresswarnings( "unchecked")public sparsearray <e> clone(){sparsearray <e> clone = null; )super.clone(); clone.mkeys.clone(); *仕様キーからオブジェクトMapdを取得します< / null < / code> *そのようなマッピングがBen get(int key){return get(key、null);} / ** *指定されたキーからマッピングされたオブジェクト、またはそのようなpingが作成されていない場合は、オブジェクトを指定します。 、msize、key)キーを指定します。 ! ;}/ ** *specify index(index){m)= deleted [index] = true; ;} / ** *バッチとしてマッピングを削除します * @param sizeのマッピングの削除(msize、index+size); 「Sparsearray」 + msizeで開始します){object values [i]; } o ++;} mgarbage = false = o( "sparsearray"、 "+msize)。 1つがあります。 else {i = 〜i; mkeys.length){gc(); Indiaresが変更された可能性があります。 msize + 1); nkeys = new int [n]; " + n); system.arraycopy(mkeys、0、nkeys、mkeys.length); system.arraycopy(mvalues、0、nvalues、0、mvalues.length); ys; mvalues = nvalues;} if(msize -i! (i、mvalues、i+1、mkeys [i] = msize ++; / public int size(){gc();} return msize;} / ** * ** * ange <code> 0 ... size()-1 < / code>、returns *からキーを返します<code> index </code>この * sparsearrayが昇順であることを保証するキー値マッピング。 key and <code> keyat(size()-1)< / code>は、large *キーを返します。 mkeys [index];}/** *範囲のインデックス<code> 0 ... size() - 1 </code>のインデックスが与えられ、<code> index </code> th key-から値を返します - この * sparsearrayストアの値。 *最小のキーと値(size()-1)</ cは、largetキーに関連付けられていますindex){if(mgarbage){gc();} return(e)es [index];} / * * size> 0 ... size()-1 < /code>、 <code> index < / code>の新しい値を設定します。 } mvalues [index] = value;} / ** * {@link {@link #keyat}が指定されたキーを返すインデックス、または指定された *キーがマッピングされない場合は負の数字を返します。 / public indexofkey(int key){if(mgarbage){gc();} return c ontainerhelpers.binarysearch(mkeys、msize、key);} / *** {@link #valueat}が返すインデックスを返します。 *指定されたキー、または *指定された値にマッピングされていない場合、これはキーによるルックアップとは異なり、線形検索であることに注意してください。それらの1つを見つけます。 if(mgarbage){gc();} for(i <msize; i ++)if(mvalues [i] == value)return -1;} / ** *このSparsearrayから。 msize = 0; mgarbage = false;} /*** e*キーは、配列のすべての既存のキーよりも大きくなります。 if(msize!= 0 <= msize -1]){put、value); ){int n = arrayalintarraysize(] nkeys = new int [n]; mkeys.length + " + n); pos] = malues [pos] = msize = 1;} * * * * <p>このマッピングを繰り返しますITSEELが値として含まれています。STリング "(このマップ)" *はその場所に表示されます。 buffer = new StringBuilder(msize * 28); ;} int keyat(i); else {buffer.append( "("( "(" end( '}'); return buffer.toString();}})
まず、Sparsearrayのコンストラクターを見てください。
/***マッピングなしを含む新しいsparsearrayを作成します。マッピングは0の初期容量をサポートする場合、 * Sparsアレイは、軽量の抑制で初期化されます。 ; mvalues = containerhelpers.empty_objects;}
コンストラクターから、コンテナのサイズが事前に設定されており、デフォルトのサイズは10であることがわかります。
データ操作の追加を見てみましょう。
/ ** *指定されたキーから値にマッピングを追加します。 BinarySearch(mkeys、msize、key); {mkeys [i] = mvalues = return;} 、msize、key);} if(mkeys.length){int n = idealintarraysize(msize + 1); .e( "sparsearray"、 " + mkeys.length +" + n); mvalues = nvalues;} if(msize -i!= 0){// log.e( "sparsearray"、 "move" +(msize -i)); 1、msize.ArrayCopy(i、mvalues、msize -i);} mkeys [i] = value;}}
データをチェックする方法を見てください。
/** * specifyキーからマッピングされたオブジェクト、または<code> null </code> *そのようなマッピングがない場合。 *指定されたキーからマッピングされたオブジェクト、またはそのようなマッピングが作成されていない場合は指定されています。 )
データとデータを取得するプロセスでは、実際には均一に呼び出されています。
static int binarysearch(int [] array、int value){int lo = 0 hi = size -1; 1; ;} else {return mid;個人的には、(lo + hi)>>> 1の方法は少し奇妙であり、Lo +(hi -lo) / 2を直接使用する方が良いと思います。