JavaRush /Java Blogu /Random-AZ /Java-da Xəritə haqqında ən yaxşı 9 sual
Treefeed
Səviyyə

Java-da Xəritə haqqında ən yaxşı 9 sual

Qrupda dərc edilmişdir
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, KV- 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 .Java-da Xəritə ilə bağlı ən yaxşı 9 sual - 1

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ər addAll(). 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();
}
IteratorXü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əlisiniz Entry.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ərik static(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 , TreeMapHashtable . Ə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 TreeMapo, 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. HashMapnull açarına və null dəyərinə sahib olmağa imkan verir. HashTablenull açarı və ya null dəyərinə icazə vermir. Təbii sıradan istifadə edilərsə TreeMapvə ya müqayisəçi boş düyməyə icazə vermirsə, istisna atılacaq.
  • Sinxronizasiya . Yalnız HashTablesinxronlaşdırılıb, qalanları deyil. Lakin, "işlə təhlükəsiz tətbiqə ehtiyac yoxdursa, bunun HashMapəvəzinə " istifadə etmək tövsiyə olunur HashTable.
Daha ətraflı müqayisə
.                       | 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əlidir Collections.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
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION