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
vs HashMap<Integer, Integer>
สำหรับองค์ประกอบ 1000 รายการ:
SparseIntArray
:
class SparseIntArray {
int[] keys;
int[] values;
int size;
}
Class = 12 + 3 * 4 = 24 ไบต์
อาร์เรย์ = 20 + 1,000 * 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;
}
Class = 12 + 8 * 4 = 48 ไบต์
รายการ = 32 + 16 + 16 = 64 ไบต์
อาร์เรย์ = 20 + 1000 * 64 = 64024 ไบต์
รวม = 64,136 ไบต์
ที่มา: ความทรงจำ Android โดย Romain Guyจากสไลด์ 90
ตัวเลขด้านบนคือจำนวนหน่วยความจำ (เป็นไบต์) ที่จัดสรรโดยฮีปโดย JVM อาจแตกต่างกันไปขึ้นอยู่กับ JVM เฉพาะที่ใช้
แพคเกจประกอบด้วยวิธีการที่เป็นประโยชน์บางอย่างสำหรับการดำเนินงานขั้นสูงเช่นการตรวจสอบขนาดของวัตถุด้วยjava.lang.instrument
getObjectSize(Object objectToSize)
ข้อมูลเสริมไว้บริการอย่างเป็นทางการจากเอกสารของ Oracle
Class = 12 ไบต์ + (ตัวแปรอินสแตนซ์ n) * 4 ไบต์
อาร์เรย์ = 20 ไบต์ + (n องค์ประกอบ) * (ขนาดองค์ประกอบ)
รายการ = 32 ไบต์ + (ขนาดองค์ประกอบที่ 1) + (ขนาดองค์ประกอบที่ 2)