2012-09-15 14 views
30

ich ein Bitmap-Cache Implementierung eines HashMap<Integer, Bitmap> mit und erhielt die folgende Warnung in Eclipse:SparseArray, ob Schlüssel vorhanden

Verwenden Sie neue SparseArray (...) stattdessen für eine bessere Leistung.

Ich habe noch nie von dieser Klasse gehört, aber es Inspektion es scheint nicht eine containsKey() Methode zu haben, die ich aus dem Cache auf Abruf eines Bitmap Aufruf zu überprüfen, ob es in dem Cache vorhanden ist, und wenn nicht, dann füge es hinzu.

Haben Sie Ideen, wie Sie am besten prüfen können, ob der Schlüssel bereits existiert?

Ich denke, ich könnte den Code ändern, um diese Überladung zu verwenden und auf Null überprüfen?

Bitmap bitmap = cache.get(key, null); 

Antwort

39

könnten Sie verwenden:

Bitmap bitmap = cache.get(key, null); 

Aber verstehen, dass dies das gleiche wie get(key):

Bitmap bitmap = cache.get(key); 

Der beste Weg, get(key, default) zu verwenden, ist einen generischen Standardfall zur Verfügung zu stellen, um etwas zu ist ein gültiger Ersatz, wenn der Schlüssel nicht gefunden wird.

Aber es gibt keinen guten Grund, if(get(key) != null) nicht als schnellen Ersatz für zu verwenden.

+0

Danke Sam, guter Platz auf der Überladung, ich bin mit Ihrem Vorschlag gegangen, nur mit if (get (key)! = Null) zu ersetzen. – magritte

1

Zitat von documentation.

SparseArrays ordnen Ganzzahlen Objekten zu. Im Gegensatz zu einer normalen Anordnung von Objekten kann es Lücken in den Indizes geben. Es soll effizienter sein, als eine HashMap zum Zuordnen von Ganzzahlen zu Objekten zu verwenden.

Sie können get(int) verwenden, das auch null zurückgibt, wenn der Schlüssel nicht gefunden wird. Mögen;

Bitmap Bitmap = cache.get (Schlüssel);

+0

Schlüssel kann Nullwert haben, in diesem Fall können Sie mit Ihrem Code nicht feststellen, ob der Schlüssel existiert oder nicht. d. h., wenn der Schlüssel nicht existiert, gibt er null zurück, und wenn der Schlüssel null ist, gibt er auch null zurück. indexOfKey sollte in diesem Fall Benutzer sein (siehe Alex's Antwort) – user1991679

+0

@ user1991679 ziemlich alte Antwort und was Sie vorschlagen, ich denke, über neuere Apis. Antwort auf Ihren Kommentar ist jedoch, Int Primitive kann nicht null sein. – auselen

+0

Ich verstehe nicht, wie die Tatsache, dass primitive kann nicht null in Bezug auf meinen Kommentar sein. BTW, indexOfKey wurde in API 1 eingeführt. – user1991679

26

Daher kann Ihr Wert in verschiedenen Situationen Null sein, ich würde vorschlagen, indexOfKey(int key) zu verwenden Hier ist die indexOfKey(int key) Referenz.

Dann sind Sie einfach nur für negativen Rückgabewert

if(mySparseArray.indexOfKey(int) < 0) { 
    //Item does not exist. Do something relevant 
} 
+0

Ist das besser/schlechter als nur '.get' zu verwenden? – Smar

1

durch die Umsetzung der SparseArray geht es erscheint unlogisch, dass es eine bessere Leistung (Zeit-Komplexität) als HashMap (andere als niedrigerer Raumbedarf hat was für eine mobile Umgebung sinnvoll ist), da das get() - Member von SparseArray die binäre Suche (O (log N)) verwendet, während HashMap die Array-Indizierung (O (1)) verwendet.

Bereitstellung der Methode get() Implementierung für beide Klassen (wie sie ist):

public V get(Object key) { // for HashMap 
    if (key == null) 
     return getForNullKey(); 
    int hash = hash(key.hashCode()); 
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
      e != null; 
      e = e.next) { 
     Object k; 
     if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
      return e.value; 
    } 
    return null; 
} 

public E get(int key, E valueIfKeyNotFound) { //for SparseArray 
    int i = binarySearch(mKeys, 0, mSize, key); 

    if (i < 0 || mValues[i] == DELETED) { 
     return valueIfKeyNotFound; 
    } else { 
     return (E) mValues[i]; 
    } 
} 

, ob indexOfKey (key) < 0 oder erhalten (key) == null verwenden Existenz für die Überprüfung des Schlüssels in einem SparseArray ist alles in Ordnung, da beide die Binärsuche darunter verwenden.

public int indexOfKey(int key) { // for SparseArray 
    if (mGarbage) { 
     gc(); 
    } 

    return binarySearch(mKeys, 0, mSize, key); 
} 
+1

Ich kann nicht verstehen, wo die Verbindung von Ihrer Antwort zu den Fragen ist. –

Verwandte Themen