Xatırladaq ki, Xəritə bir sıra açar-dəyər cütlərindən ibarət strukturlaşdırılmış məlumatdır və hər bir açar bir Xəritədə yalnız bir dəfə istifadə edilə bilər. Bu mövzu Java-da Map- dən istifadə və onun tətbiq olunan sinifləri ilə bağlı 9 əsas sualı əhatə edir . Sadəlik üçün nümunələrdə ümumiləşdirmələrdən istifadə edəcəyəm . Ona görə də Map spesifikatorunu göstərmədən sadəcə Map yazacağam. Ancaq güman edə bilərsiniz ki, K və V- nin hər iki dəyəri müqayisə edilə bilər, yəni K Müqayisə edilə biləni , V isə Müqayisə olunanı genişləndirir .
0. Xəritənin Siyahıya çevrilməsi
Java-da Xəritə interfeysi üç növ kolleksiya təklif edir: açar dəsti, dəyər dəsti və açar-dəyər dəsti. Onların hamısı konstruktor və ya metoddan istifadə edərək Siyahıya çevrilə biləraddAll()
. Aşağıdakı kod parçası Xəritədən ArrayList-in necə hazırlanacağını nümayiş etdirir.
// list of keys
List keyList = new ArrayList(Map.keySet());
//list of values
List valueList = new ArrayList(Map.valueSet());
//list key-value
List entryList = new ArrayList(Map.entrySet());
1. Xəritədəki bütün dəyərləri dövrələyin
Hər bir açar-dəyər cütlüyündən keçmək, Xəritədə gəzmək üçün ən əsas, əsas prosedurdur. Java-da hər bir cüt Map.Entry adlı Xəritə sahəsində saxlanılır .Map.entrySet()
bir sıra açar-dəyərləri qaytarır, ona görə də Xəritənin bütün dəyərlərini təkrarlamağın ən səmərəli yolu:
for(Entry entry: Map.entrySet()) {
//get the key
K key = entry.getKey();
//get value
V value = entry.getValue();
}
Iterator
Xüsusilə JDK 1.5-dən kiçik versiyalarda da istifadə edə bilərik
Iterator itr = Map.entrySet().iterator();
while(itr.hasNext()) {
Entry entry = itr.next();
//get the key
K key = entry.getKey();
//get value
V value = entry.getValue();
}
2. Xəritəni düymələrlə sifariş etmək
Xəritələrin düymələrə görə təşkili başqa bir çox istifadə edilən prosedurdur. Birinci yol Map.Entry-ni siyahıya əlavə etmək və dəyərlərə görə çeşidləyən müqayisəçidən istifadə etməklə çeşidləməkdir.List list = new ArrayList(Map.entrySet());
Collections.sort(list, new Comparator() {
@Override
public int compare(Entry e1, Entry e2) {
return e1.getKey().compareTo(e2.getKey());
}
});
Başqa bir yol: SortedMap istifadə edin , bu da əlavə olaraq açarlarını sıra ilə düzəldir. Lakin, bütün açarlar Müqayisə edilə biləni təcəssüm etdirməlidir və ya müqayisəçi tərəfindən qəbul edilməlidir. Həyata keçirilən siniflərdən biri TreeMapSortedMap
-dır . Onun konstruktoru müqayisəçi qəbul edir. Aşağıdakı kod normalı sifarişli birinə çevirməyi göstərir. Map
SortedMap sortedMap = new TreeMap(new Comparator() {
@Override
public int compare(K k1, K k2) {
return k1.compareTo(k2);
}
});
sortedMap.putAll(Map);
3. Xəritəni dəyərlərə görə sıralayın
Siyahıya Xəritə əlavə etmək və sonra onu çeşidləmək bu halda işləyir, lakin bu dəfə istifadə etməlisinizEntry.getValue()
. Aşağıdakı kod əvvəlki kimi demək olar ki, eynidir.
List list = new ArrayList(Map.entrySet());
Collections.sort(list, new Comparator() {
@Override
public int compare(Entry e1, Entry e2) {
return e1.getValue().compareTo(e2.getValue());
}
});
Bu vəziyyətdə hələ də istifadə edə bilərik SortedMap
, ancaq dəyərlər unikal olduqda. Bu halda, siz açar-dəyər cütünü açar-dəyərə çevirə bilərsiniz. Bu həllin ciddi məhdudiyyətləri var və mənim tərəfimdən tövsiyə edilmir.
4. Statik/dəyişməz Xəritənin işə salınması
Xəritənin dəyişməz qalmasını istədiyiniz zaman, yaxşı yol onu dəyişməz Xəritəyə köçürməkdir. Bu müdafiə proqramlaşdırma texnikası sizə yalnız istifadə üçün təhlükəsiz deyil, həm də mövzu üçün təhlükəsiz olan Xəritə yaratmağa kömək edəcək. Statik/dəyişməz Xəritəni işə salmaq üçün biz başlatıcıdan istifadə edə bilərikstatic
(aşağıya bax). Bu kodla bağlı problem ondadır ki, Xəritə kimi elan etsək də static final
, biz işə salındıqdan sonra hələ də onunla işləyə bilərik, məsələn Test.Map.put(3,"three");
. Beləliklə, bu, əsl dəyişməzlik deyil. Statik başlatıcıdan istifadə edərək dəyişməz Xəritə yaratmaq üçün bizə super anonim sinif lazımdır, biz onu sonuncu başlanğıc addımında dəyişməz Xəritəyə əlavə edəcəyik. Zəhmət olmasa kodun ikinci hissəsinə baxın. Çalışdığınız zaman UnsupportedOperationExceptionTest.Map.put(3,"three");
atılacaq .
public class Test {
private static final Map Map;
static {
Map = new HashMap();
Map.put(1, "one");
Map.put(2, "two");
}
}
public class Test {
private static final Map Map;
static {
Map aMap = new HashMap();
aMap.put(1, "one");
aMap.put(2, "two");
Map = Collections.unmodifiableMap(aMap);
}
}
Guava kitabxanası həmçinin statik və dəyişməz kolleksiyaları işə salmağın müxtəlif yollarını dəstəkləyir. Guava-nın dəyişməz kolleksiyalar yardım proqramının üstünlükləri haqqında daha çox öyrənmək üçün Guava Necə Edilir -dəki Dəyişməz Kolleksiyalar bölməsinə baxın .
5. HashMap, TreeMap və Hashtable arasındakı fərq
Java-da Xəritə interfeysinin üç əsas tətbiqi var : HashMap , TreeMap və Hashtable . Əsas fərqlər aşağıdakılardır:- Keçid qaydası . HashMap və HashTable Xəritənin sifarişinə zəmanət vermir; xüsusilə, zamanla sifarişin eyni qalacağına zəmanət vermirlər. Lakin
TreeMap
o, bütün dəyərləri açarların "təbii qaydasında" və ya müqayisəçi ilə sifariş edəcək. - Etibarlı açar-dəyər cütləri.
HashMap
null açarına və null dəyərinə sahib olmağa imkan verir.HashTable
null açarı və ya null dəyərinə icazə vermir. Təbii sıradan istifadə edilərsəTreeMap
və ya müqayisəçi boş düyməyə icazə vermirsə, istisna atılacaq. - Sinxronizasiya . Yalnız
HashTable
sinxronlaşdırılıb, qalanları deyil. Lakin, "işlə təhlükəsiz tətbiqə ehtiyac yoxdursa, bununHashMap
əvəzinə " istifadə etmək tövsiyə olunurHashTable
.
. | HashMap | HashTable | TreeMap
-------------------------------------------------------
Упорядочивание |нет |нет | да
null в ключ-meaning | да-да | нет-нет | нет-да
синхронизировано | нет | да | нет
производительность | O(1) | O(1) | O(log n)
воплощение | корзины | корзины | красно-чёрное дерево
HashMap ilə əlaqəsi haqqında ətraflı oxuyun . TreeMap vs. Hashtable vs. LinkedHashMap .
6. Əks axtarış/görünüşü ilə xəritə
Bəzən bizə açar-açar cütləri dəsti lazımdır, yəni dəyərlər açarlar qədər unikaldır (bir-bir nümunə). Bu ardıcıllıq Xəritədə "ters çevrilmiş görünüş/axtarış" yaratmağa imkan verir. Yəni biz açarı dəyərinə görə tapa bilərik. Bu məlumat strukturu iki istiqamətli Xəritə adlanır , təəssüf ki, JDK tərəfindən dəstəklənmir. Həm Apache Common Collections, həm də Guava müvafiq olaraq BidiMap və BiMap adlı iki istiqamətli Xəritə tətbiqetmələrini təklif edir. Hər ikisi açarlar və dəyərlər arasında 1:1 xəritələşdirməni tətbiq edən məhdudiyyət təqdim edir.7. Xəritənin dayaz surəti
Java-dakı Xəritələrin hamısı olmasa da, demək olar ki, hamısı başqa bir Xəritə üçün surət konstruktorunu ehtiva edir. Lakin kopyalama proseduru sinxronlaşdırılmır. Bu o deməkdir ki, bir mövzu Xəritəni kopyalayanda, digər mövzu onun strukturunu dəyişə bilər. Qəfil surətdə sinxronizasiyanın qarşısını almaq üçün belə bir vəziyyətdə onlardan biri istifadə edilməlidirCollections.synchronizedMap()
.
Map copiedMap = Collections.synchronizedMap(Map);
Dayaz surətdə köçürməyin başqa bir maraqlı yolu istifadə etməkdir clone()
. Lakin Java kolleksiyaları çərçivəsinin yaradıcısı Joshua Bloch tərəfindən belə tövsiyə edilmir. “ Kopya Konstruktoru Klonlama ” debatında o, belə bir mövqe tutur: Sitat: “Mən tez-tez konkret siniflərə ictimai klon metodunu daxil edirəm, çünki insanlar onların orada olmasını gözləyirlər... Klonlaşdırmanın pozulduğu utancvericidir, lakin baş verdi... Klonlaşdırma zəif nöqtədir və düşünürəm ki, insanlara onun məhdudiyyətləri barədə xəbərdarlıq edilməlidir”. clone()
Bu səbəbdən, mən sizə Xəritəni kopyalamaq üçün metoddan necə istifadə edəcəyinizi belə göstərmirəm
8. Boş Xəritə yaradın
DəyişməzsəMap
, istifadə edin:
Map = Collections.emptyMap();
Və ya hər hansı digər təcəssümü istifadə edin. Misal üçün:
Map = new HashMap();
SON
GO TO FULL VERSION