Middle
Android-ում կան քարտեր, որոնց մեջ կարելի է ավելացնել primitive տեսակներ: Կարող եք ավելի մանրամասն պատմել այդ մասին?
sobes.tech AI
Պատասխան AI-ից
Այո, Android SDK-ում հատուկ իրականացումներ կան Map-ի համար, որոնք օպտիմիզացված են կատարողականի և հիշողության խնայողության համար՝ համեմատած ստանդարտ HashMap<K, V>-ի:
Ամենատարածվածները՝
SparseIntArray: պահում էintբանալիներ ևintարժեքներ:SparseLongArray: պահում էintբանալիներ ևlongարժեքներ:SparseBooleanArray: պահում էintբանալիներ ևbooleanարժեքներ:LongSparseArray<E>: պահում էlongբանալիներ ևEտիպի օբյեկտներ:
Այս դասերի օգտագործման առավելությունները՝
- Հիշողության արդյունավետություն՝ օգտագործում են ներքին զանգվածներ տվյալների պահպանման համար, խուսափելով օբյեկտների ստեղծման ծախսերից՝ primitives տիպերի համար (
Integer,Long,Boolean) ևHashMap-ի կապակցված ցանկի կառուցվածքից: - Աշխատողականություն՝ մուտքագրման, ստացման և հեռացման գործողությունները սովորաբար ավելի արագ են, հատկապես մեծ քանակությամբ տարրերով աշխատելիս, ավելի պարզ ներքին կառուցվածքի և primitives համար hash-ման խուսափելու շնորհիվ
SparseArray-ում:
Օրինակ SparseIntArray-ի օգտագործման:
// `SparseIntArray` ստեղծում
SparseIntArray sparseArray = new SparseIntArray();
// տարրեր ավելացնել
sparseArray.put(0, 100);
sparseArray.put(1, 200);
sparseArray.put(10, 300);
// արժեք ստանալ ըստ բանալի
int value = sparseArray.get(1); // արժեքը կլինի 200
// արժեք ստանալ ըստ բանալի՝ նախնական արժեքով
int valueWithDefault = sparseArray.get(5, -1); // արժեքը կլինի -1
// տարր հեռացնել ըստ բանալի
sparseArray.delete(10);
// անցնել բոլոր տարրերով
for (int i = 0; i < sparseArray.size(); i++) {
int key = sparseArray.keyAt(i);
int val = sparseArray.valueAt(i);
// Լոգիկա key և val մշակելու համար
}
Անալոգично օգտագործվում են SparseLongArray, SparseBooleanArray և LongSparseArray։ LongSparseArray-ը պահանջում է տիպի նշում, քանի որ նրա արժեքները օբյեկտներ են, ոչ primitives:
Ընտրությունը ստանդարտ HashMap-ի և հատուկ Sparse քարտաների միջև կախված է ձեր պահանջներից՝
- Եթե բանալիները տարբեր օբյեկտներ կամ primitives են, որոնք չեն
intկամlong, օգտագործեքHashMap: - Եթե բանալիները
intկամlongեն, իսկ արժեքները primitives կամ օբյեկտներ՝LongSparseArray-ի դեպքում, և կարևոր է հիշողության և կատարողականի արդյունավետությունը, ապա ավելի լավ է օգտագործել Sparse քարտեր:
Կարևոր է նշել, որ Sparse քարտերը չեն thread-safe։ Եթե ձեզ անհրաժեշտ է thread-safe իրականացում,考虑使用带有原始类型包装对象的 ConcurrentHashMap。但大多数情况下,在 Android 应用程序的 UI 线程中使用这些结构时,线程安全不是问题。