JavaRush /Java блогы /Random-KK /Java тіліндегі HashMap - бұл қандай карта?

Java тіліндегі HashMap - бұл қандай карта?

Топта жарияланған
Сәлеметсіз бе! Бүгін біз басқа деректер құрылымы - Карта туралы сөйлесетін боламыз. Оның ресми орысша атауы «ассоциативті массив» болып табылады, бірақ ол жиі қолданылмайды. Ең көп таралған опциялар «сөздік», «карта» немесе (көбінесе) сленгтік «карта» ағылшынизмі :) Картаның ішінде деректер «кілт» - «мән» пішімінде, яғни жұпта сақталады. Кілттер де, мәндер де кез келген нысандар — сандар, жолдар немесе басқа сыныптардың an objectілері болуы мүмкін.

Картаның басқа деректер құрылымдарынан айырмашылығы

Бұрын біз элементтер өздігінен сақталатын деректер құрылымдарын қарастырдық. Массивте немесе ArrayList / LinkedList , біз элементтердің белгілі бір санын сақтаймыз. Бірақ біздің міндетіміз аздап өзгерсе ше? Мысалы, алдымызда адамның толық аты-жөні мен төлқұжат нөмірі сақталатын 100 адамның тізімін жасау міндеті тұр деп елестетіңіз. Негізінде, бұл қиын емес. Мысалы, сіз екеуін де қатарға орналастырып, келесідей жолдар тізімін жасай аласыз: «Анна Ivanовна Решетникова, 4211 717171.» Бірақ бұл шешімнің екі кемшілігі бар. Біріншіден, бізге төлқұжат іздеу функциясы қажет болуы мүмкін. Ақпаратты сақтауға арналған осы форматпен бұл проблемалы болады. Екіншіден, төлқұжат нөмірлері бірдей екі түрлі адамды құруға ештеңе кедергі болмайды. Және бұл біздің шешіміміздің ең маңызды кемшілігі. Мұндай жағдайларды толығымен алып тастау керек, бірдей төлқұжат нөмірі бар екі адам жоқ. Мұнда Карта және оның көрсетілген мүмкіндіктері бізге көмекке келеді («кілт»-»мән» пішімінде жұпта деректерді сақтау). Ең көп таралған Картаның іске асырылуын қарастырайық - 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"));

}
Шығару: жалған ақиқат

Барлық кілттер мен мәндердің тізімін алу

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. Оның ерекшелігі қайталанатын элементтерді қамти алмайды. Енді есте сақтау керек ең бастысы, барлық кілттердің тізімін 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 құжаттамасын тексеруді ұмытпаңыз .
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION