JavaRush /Java блогу /Random-KY /Javaдагы HashMap - бул кандай карта?

Javaдагы HashMap - бул кандай карта?

Группада жарыяланган
Салам! Бүгүн биз дагы бир маалымат структурасы жөнүндө сүйлөшөбүз - Карта. Анын расмий орусча аты "ассоциативдик массив" болуп саналат, бирок ал көп колдонулbyte. Кеңири таралган варианттар "сөздүк", "карта" же (көбүнчө) жаргон англисизм "карта" :) Картанын ичинде маалыматтар "ачкыч" - "баа" форматында, башкача айтканда, жуптарда сакталат. Ачкычтар да, баалуулуктар да ар кандай an objectтер болушу мүмкүн - сандар, саптар же башка класстардын an objectилери.

Карта башка маалымат структураларынан эмнеси менен айырмаланат

Буга чейин биз элементтер өз алдынча сакталган маалымат структураларын карадык. Массивде же ArrayList / LinkedList , биз элементтердин белгилүү санын сактайбыз. Бирок биздин милдетибиз бир аз өзгөрсө эмне болот? Мисалы, биз адамдын толук аты-жөнү жана паспортунун номери сактала турган 100 адамдын тизмесин түзүү милдети алдында турат деп элестетип көргүлө. Негизи, бул анчалык деле кыйын эмес. Мисалы, сиз экөөнү тең бир сапка батырып, төмөнкүдөй саптардын тизмесин түзө аласыз: "Анна Ivanовна Решетникова, 4211 717171." Бирок бул чечим эки кемчorктери бар. Биринчиден, бизге паспорт издөө функциясы керек болушу мүмкүн. Ал эми маалыматты сактоо үчүн бул формат менен, бул көйгөйлүү болот. Экинчиден, бир эле паспорт номери менен эки башка адамды түзүүгө эч нерсе тоскоол болбойт. Бул биздин чечимибиздин эң олуттуу кемчorги. Мындай жагдайларды толугу менен алып салуу керек, бир паспорт номери менен эки адам жок. Бул жерде Карта жана анын айтылган өзгөчөлүктөрү бизге жардамга келет (маалыматтарды “ачкыч”-”баа” форматында жупта сактоо). Келгиле, эң кеңири таралган Картаны ишке ашырууну карап көрөлү - Java HashMap классы .HashMap - бул кандай карта?  - 1

Javaда HashMap түзүү жана класс менен иштөө

Бул ишке ашыруу түзүү үчүн абдан жөнөкөй:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

}
Бул жерде биз элементтер "сан-сап" форматында сактала турган сөздүк түздүк. Сан ачкыч болот, ал эми сап маани болот. Ошондой эле бизде кандай түрдөгү ачкычтар ( Integer) жана кандай маанилер ( String) болорун көрсөттүк. Эмне үчүн мындай? Биринчиден, HashMapдагы ачкыч ар дайым уникалдуу . Бул биз үчүн абдан жакшы болот, анткени биз паспорттун номерин ачкыч катары колдонуп, кайталанмалардын алдын алабыз. Ал эми толук аты менен сызык мааниге ээ болот (ар кандай адамдардын толук аты жонокой кайталанышы мүмкүн, биз үчүн эч кандай жаман нерсе жок).

HashMapга жаңы жуп кошуу

Бул тапшырма төмөнкүдөй көрүнөт:
public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();


       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);

   }

}
Бул үчүн ыкма колдонулат put(). Кошумчалай кетсек, HashMap'тин жокко чыгарылган ыкмасы бар toString(), ошондуктан аны консолго басып чыгарууга болот. Чыгуу төмөнкүдөй болот: {212133=Лидия Аркадьевна Бубликова, 8082771=Дональд Джон Трамп, 162348=Ivan Михайлович Серебряков}

HashMap ачкычтарынын өзгөчөлүктөрү

Эми ачкычтар чындап эле уникалдуубу, текшерип көрөлү? Картада ачкычы бар жаңы элементти кошууга аракет кылалы :
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Viktor Mikhailovich Stychkin");//repeat key

   System.out.println(passportsAndNames);

}
Чыгуу: {212133=Лидия Аркадьевна Бубликова, 8082771=Дональд Джон Трамп, 162348=Виктор Михайлович Стычкин} Көрүнүп тургандай, 162348 ачкычы менен мурунку элементтин үстүнө жазылган. "Ачкыч" эмне үчүн ачкыч деп аталды. HashMapдагы маанилерге ачкыч аркылуу жетүүгө болот (бирок тескерисинче эмес - ачкычты маани боюнча алуу мүмкүн эмес, анткени маанилер кайталанышы мүмкүн). Бул элементти алуу, ошондой эле HashMapтан элементти алып салуу мисалдарында ачык көрүнүп турат:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   String lidiaName = passportsAndNames.get(212133);
   System.out.println(lidiaName);


   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);

}
Маани алуу же сөздүктөн жупту жок кылуу үчүн, так ушул мааниге туура келген уникалдуу ачкычты get()методдорго өткөрүп беришибиз керек. HashMapда массивдер же тизмелердегидей сандык индекстер жок - мааниге ачкыч аркылуу жетет. Консол чыгаруу: Лидия Аркадьевна Бубликова {212133=Лидия Аркадьевна Бубликова, 8082771=Дональд Джон Трамп}remove()

Ачкычтын жана маанинин бар-жоктугун текшерүү

ArrayList жана LinkedList класстарында тизмеде белгилүү бир элемент бар же жок экенин текшере алабыз. HashMap да муну жасоого мүмкүндүк берет жана жуптун эки бөлүктөрү үчүн: анын методдору бар containsKey()(ачкычтын бар-жоктугун текшерет) жана containsValue()(баалуулуктун бар-жогун текшерет).
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");


   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));

}
Чыгуу: false true

Бардык ачкычтардын жана баалуулуктардын тизмесин алуу

HashMapтын дагы бир ыңгайлуу өзгөчөлүгү - сиз өзүнчө бардык ачкычтардын жана бардык баалуулуктардын тизмесин ала аласыз . Бул үчүн, ыкмалары keySet()жана колдонулат values():
public class Main {

   public static void main(String[] args) {

       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");

       Set<Integer> keys = passportsAndNames.keySet();
       System.out.println("Keys: " + keys);

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);

   }

}
Ачкычтар коллекцияга чыгарылат Set. Анын өзгөчөлүгү кайталануучу элементтерди камтый алbyte. Эми эстен чыгарбоо керек болгон негизги нерсе, бардык ачкычтардын тизмеси HashMapтан өзүнчө жыйнакка алынышы мүмкүн. Мисалда биз баалуулуктарды нормалдуу түрдө сактадык ArrayList. Консолдун чыгышы: Ачкычтар: [212133, 8082771, 162348] Маанилер: [Лидия Аркадьевна Бубликова, Дональд Джон Трамп, Ivan Михайлович Серебряков] Методдор биз өткөн мурунку структуралардагыдай эле size()кылат clear(): биринчиси сандык элементтерди кайтарат азыркы учурда сөздүк, экинчиси бардык элементтерди жок кылат.
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);

}
Чыгуу: 3 {} Биздин HashMap кеминде бир элементи бар-жогун текшерүү үчүн, биз ыкманы колдонсок болот isEmpty():
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);

   }

}
Чыгуу: {212133=Лидия Аркадьевна Бубликова, 8082771=Дональд Джон Трамп, 162348=Ivan Михайлович Серебряков} Эми консолго алдын ала текшерүүдөн кийин гана чыгарабыз :)

Эки картаны бир картага бириктирүү

Дагы бир кызыктуу жагдай - эки картаны бир картага бириктирсе болот . Бул үчүн бир ыкма бар putAll(). Биз аны биринчи HashMap деп атайбыз , экинчисин аргумент катары өткөрүп беребиз, экинчиден элементтер биринчиге кошулат:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Alexey Andreevich Ermakov");
   passportsAndNames2.put(925648, "Maxim Olegovich Arkharov");


   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);

}
Чыгуу: {917352=Алексей Андреевич Ермаков, 212133=Лидия Аркадьевна Бубликова, 8082771=Дональд Джон Трамп, 925648=Максим Олегович Архаров, 162348=Ivan Михайлович Серебряковдун паспорттору } Баардык элементтери кошулган . Эми бир кыйла татаал мисалды карап көрөлү. Тактап айтканда, циклде HashMap аркылуу кайталаңыз.
for (Map.Entry entry: passportsAndNames.entrySet()) {

   System.out.println(entry);

}
Интерфейс Map.Entryжөн гана сөздүктүн ичиндеги ачкыч-маани түгөйүн билдирет. Метод entrySet()биздин HashMapдагы бардык түгөйлөрдүн тизмесин кайтарат (биздин картабыз дал ушундай Entry жуптардан тургандыктан, биз өз-өзүнчө ачкычтарды же маанилерди эмес, жуптарды кайталайбыз). Корутунду: 212133=Лидия Аркадьевна Бубликова 8082771=Дональд Джон Трамп 162348=Ivan Михайлович Серебряков Бул макаланы келечекке сактаңыз: https://habr.com/ru/post/128017/ Эми аны окууга али эрте, бирок келечекте , HashMap колдонууну колго алганыңызда, бул маалымат түзүмү ичинен кантип иштээрин түшүнүүгө жардам берет. Ошондой эле, HashMapдагы расмий Oracle documentтерин текшерүүнү унутпаңыз .
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION