Sobes.tech
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 线程中使用这些结构时,线程安全不是问题。