JavaRush /Java блогу /Random-KY /Java тилиндеги Карта жөнүндө эң мыкты 9 суроо
Treefeed
Деңгээл

Java тилиндеги Карта жөнүндө эң мыкты 9 суроо

Группада жарыяланган
Эске салсак, Карта – бул ачкыч-маани түгөйлөрүнүн жыйындысынан турган структураланган маалымат жана ар бир ачкыч бир Картада бир гана жолу колдонулушу мүмкүн. Бул тема Java жана анын ишке ашырылган класстарында Картаны колдонуу боюнча 9 негизги суроону камтыйт . Жөнөкөйлүк үчүн, мен мисалдарда жалпылоолорду колдоном . Ошондуктан, мен Карта спецификациясын көрсөтпөстөн, жөн гана Карта деп жазам. Бирок сиз K жана Vнын эки мааниси тең салыштырууга болот деп ойлосоңуз болот , демек K Салыштырууну жана V Салыштырууну кеңейтет .Javaдагы Карта жөнүндө эң мыкты 9 суроо - 1

0. Картаны тизмеге айландыруу

Java тorнде Карта интерфейси коллекциялардын үч түрүн сунуштайт: ачкыч топтому, маанилер топтому жана ачкыч-маанилер топтому. Алардын бардыгын конструктор же метод аркылуу Тизмеге айландырса болот addAll(). Төмөнкү code үзүндүсү картадан ArrayListти кантип жасоону көрсөтөт.
// 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. Картадагы бардык баалуулуктарды айлантыңыз

Ар бир ачкыч-баа жуптарын аралап өтүү Картаны басып өтүүнүн эң негизги, негизги proceduresасы. Java тorнде ар бир түгөй Map.Entry деп аталган Карта талаасында сакталат . Map.entrySet()ачкыч-маанилердин топтомун кайтарат, ошондуктан Картанын бардык баалуулуктарын кайталоонун эң натыйжалуу жолу:
for(Entry entry: Map.entrySet()) {
  //get the key
  K key = entry.getKey();
  //get value
  V value = entry.getValue();
}
IteratorБиз , айрыкча JDK 1.5тен кичирээк versionларда да колдоно алабыз
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. Картаны баскычтар боюнча заказ кылуу

Карталарды баскычтар боюнча уюштуруу дагы бир кеңири колдонулган proceduresа. Биринчи жол - тизмеге Map.Entry кошуу жана маанилери боюнча сорттоочу компаратордун жардамы менен сорттоо.
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());
  }
});
Дагы бир жолу: колдонуу SortedMap , ал кошумча иретинде ачкычтарын иретке келтирет. Бирок, бардык баскычтар Comparable болушу керек же салыштыруучу тарабынан кабыл алынышы керек. Ишке ашырылган класстардын бири TreeMapSortedMap болуп саналат . Анын конструктору компараторду кабыл алат. Төмөнкү code кадимки codeду кантип иреттелгенге айландырууну көрсөтөт. Map
SortedMap sortedMap = new TreeMap(new Comparator() {

  @Override
  public int compare(K k1, K k2) {
    return k1.compareTo(k2);
  }

});
sortedMap.putAll(Map);

3. Картаны баалуулуктар боюнча иреттөө

Тизмеге Картаны кошуу жана аны сорттоо бул учурда иштейт, бирок бул жолу колдонушуңуз керек Entry.getValue(). Төмөндөгү code мурункудай дээрлик бирдей.
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());
  }

});
Бул учурда биз аны колдоно алабыз SortedMap, бирок баалуулуктар уникалдуу болсо гана. Бул учурда, сиз ачкыч-маани жуптарын ачкыч-мааниге айланта аласыз. Бул чечим катуу чектөөлөргө ээ жана мен тарабынан сунушталbyte.

4. Статикалык/өзгөрбөс картаны инициализациялоо

Картанын өзгөрүлбөс бойдон калышын кааласаңыз, аны өзгөрүлгүс Картага көчүрүү жакшы жолу. Бул коргонуу программалоо ыкмасы колдонууга гана эмес, ошондой эле жиптен да коопсуз Картаны түзүүгө жардам берет. Статикалык/өзгөрбөс Картаны инициализациялоо үчүн биз инициализаторду колдонсок болот static(төмөндө караңыз). Бул codeдун көйгөйү, Карта катары жарыяланганына карабастан static final, биз инициализациялангандан кийин аны менен иштей алабыз, мисалы Test.Map.put(3,"three");. Демек, бул чыныгы өзгөрбөстүк эмес. Статикалык инициализатордун жардамы менен өзгөрүлгүс Картаны түзүү үчүн бизге супер анонимдүү класс керек, аны биз инициализациянын акыркы кадамында өзгөрүлгүс Картага кошобуз. Сураныч, codeдун экинчи бөлүгүн караңыз. Эгер сиз иштетсеңиз, UnsupportedOperationException качан ыргытылат Test.Map.put(3,"three");.
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 китепканасы ошондой эле статикалык жана өзгөрүлбөс коллекцияларды баштоонун ар кандай жолдорун колдойт. Guava's өзгөрүлгүс коллекциялар утorтасынын артыкчылыктары жөнүндө көбүрөөк билүү үчүн, Guava How-to'догу Өзгөрбөс жыйнактар ​​бөлүмүн караңыз .

5. HashMap, TreeMap жана Hashtable ортосундагы айырма

Javaда Карта интерфейсинин үч негизги ишке ашырылышы бар : HashMap , TreeMap жана Hashtable . негизги айырмачылыктар болуп төмөнкүлөр саналат:
  • Өтүү тартиби . HashMap жана HashTable Картаны иретке келтирүүгө кепилдик бербейт; атап айтканда, тартиптин убакыттын өтүшү менен сакталып кала тургандыгына кепилдик беришпейт. Бирок TreeMapал ачкычтардын "табигый тартипте" же компаратор аркылуу бардык баалуулуктарды буйрук кылат.
  • Жарактуу ачкыч-маани жуптары. HashMapнөл ачкыч жана нөл мааниге ээ болууга мүмкүндүк берет. HashTableнөл ачкыч же нөл мааниге жол бербейт. Табигый тартип колдонулса TreeMapже компаратор нөл ачкычка жол бербесе, өзгөчөлүк ташталат.
  • Синхронизация . Бир гана HashTableсинхрондоштуруу, калгандары жок. Бирок, "эгер жипти коопсуз ишке ашыруунун кереги жок болсо, анын HashMapордуна " колдонуу сунушталат HashTable.
Кененирээк салыштыруу
.                       | HashMap | HashTable | TreeMap
-------------------------------------------------------

Упорядочивание          |нет      |нет        | да
null в ключ-meaning    | да-да   | нет-нет   | нет-да
синхронизировано        | нет     | да        | нет
производительность      | O(1)    | O(1)      | O(log n)
воплощение              | корзины | корзины   | красно-чёрное дерево
HashMap менен мамилеси тууралуу көбүрөөк оку . TreeMap vs. Hashtable vs. LinkedHashMap .

6. Карта тескери издөө/көрүү

Кээде бизге ачкыч-ачкыч жуптарынын топтому керек болот, бул маанилер ачкычтар сыяктуу уникалдуу экенин билдирет (бирден-бир үлгү). Бул ырааттуулук Картада "инверттелген көрүнүш/издөө" түзүүгө мүмкүндүк берет. Башкача айтканда, биз анын баалуулугу боюнча ачкыч таба алабыз. Бул маалымат структурасы эки багыттуу карта деп аталат , тилекке каршы, JDK тарабынан колдоого алынbyte. Apache Common Collections жана Guava экөө тең BidiMap жана BiMap деп аталган эки багыттуу картаны ишке ашырууну сунуштайт. Экөө тең ачкычтар менен баалуулуктардын ортосунда 1:1 карта түзүүнү талап кылган чектөө киргизет.

7. Картанын тайыз көчүрмөсү

Баары болбосо да, дээрлик бардыгы Javaдагы Карталарда башка Карта үчүн көчүрмө конструктор бар. Бирок көчүрүү proceduresасы синхрондоштурулган эмес. Бул бир жип Картаны көчүрсө, башка жип анын түзүлүшүн өзгөртө алат дегенди билдирет. Көчүрмөлөрдү капыстан синхрондоштурууну болтурбоо үчүн, мындай учурда алардын бирин колдонуу керек Collections.synchronizedMap().
Map copiedMap = Collections.synchronizedMap(Map);
тайыз көчүрүү дагы бир кызыктуу жолу колдонуу болуп саналат clone(). Бирок аны Java коллекцияларынын негизинин жаратуучусу Джошуа Блох да сунуш кылbyte. " Көчүрмө конструкторго каршы клондоо " дебатында ал мындай позицияны ээлейт: Цитата: "Мен көп учурда конкреттүү класстарда ачык клондоо ыкмасын сунуштайм, анткени адамдар алардын ошол жерде болушун күтүшөт. ... Клондоо бузулганы уят, бирок бул болду... Клондоштуруу алсыз жер жана менимче, адамдарга анын чектөөлөрү жөнүндө эскертүү керек». clone()Ушул себептен, мен сизге Картаны көчүрүү ыкмасын кантип колдонууну көрсөтпөйм

8. Бош Картаны түзүңүз

Эгерде Mapөзгөрүлбөсө, колдонуңуз:
Map = Collections.emptyMap();
Же болбосо, башка ишке ашырууну колдонуңуз. Мисалы:
Map = new HashMap();
END
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION