JavaRush /Java блогу /Random-KY /Алар интервьюда эмнени сурашы мүмкүн: Javaдагы маалымат с...
Константин
Деңгээл

Алар интервьюда эмнени сурашы мүмкүн: Javaдагы маалымат структуралары. 1-бөлүк

Группада жарыяланган
Салам! Кандай гана карабаңыз, сиз техникалык кирүү маегинде ийгorктүү өтпөстөн иштеп чыгуучу боло албайсыз. Алар интервьюда эмнени сурашы мүмкүн: Javaдагы маалымат структуралары - 1Java менен байланышкан көптөгөн технологиялар бар жана бардыгын үйрөнүү мүмкүн эмес. Эреже катары, алар долбоор үчүн маанилүү кандайдыр бир алкагында жакшы тажрыйбасы бар иштеп чыгуучу издеп жатканда гана интервью учурунда конкреттүү бир нерсе суралат. Эгер ушундай болсо, анда сиз бул алHowтан толук ылдамдыкта өтөсүз, сизде эч кандай күмөн жок. Интервью учурунда алар эмнени сурашы мүмкүн: Javaдагы маалымат структуралары - 2Бирок биз азыр ар бир Java иштеп чыгуучусу бorши керек болгон база жөнүндө айтып жатабыз. Баары башталат ошол классикалык бorм жөнүндө. Бүгүн мен ар кандай интервьюнун негизги темаларынын бирине токтолгум келет - Javaдагы маалымат структуралары . Ошентип, бадалдын айланасында ургандын ордуна, баштайлы. Интервью учурунда бул тема боюнча берorши мүмкүн болгон суроолордун тизмесин табыңыз.

1. Маалымат структуралары жөнүндө бир аз айтып бериңиз

Берorштер структурасы - бул белгилүү бир жол менен структураланган маалыматты камтыган маалымат кампасы. Бул структуралар кээ бир операцияларды натыйжалуу аткаруу үчүн иштелип чыккан. Маалымат структураларынын типтүү мисалдары:
  • массивдер,
  • стектер,
  • кезектер,
  • тиешелүү тизмелер,
  • графиктер,
  • дарактар,
  • префикс дарактар,
  • хэш tableсы.
Сиз бул жерде жана бул жерде алар жөнүндө көбүрөөк биле аласыз . Берorштер программанын негизги компоненти болуп саналат жана структуралар бул маалыматтарды белгилүү, так структураланган формада сактоого мүмкүндүк берет. Сиздин тиркемеңиз эмне кылбасын, бул аспект анда дайыма болот: эгерде бул веб-дүкөн болсо, анда продуктулар жөнүндө маалымат сакталат, эгерде бул социалдык тармак болсо, колдонуучулар жана файлдар жөнүндө маалыматтар жана башкалар.

2. Массивдер жөнүндө эмне билесиз?

Массив – саны алдын ала көрсөтүлгөн бир типтеги маанилерди сактоочу контейнер. Саптын маанилери бар массивди түзүүнүн мисалы:
String[] strArray = {"Java","is","the","best","language"};
Массивди түзүүдө эстутум анын бардык элементтери үчүн бөлүнөт: элементтер үчүн адегенде канча уяча көрсөтүлсө, ошончолук көбүрөөк эс бөлүнөт. Эгерде белгилүү бир сандагы уячалары бар бош массив түзүлсө, массивдин бардык элементтерине демейки маанилер ыйгарылат. Мисалы:
int[] arr = new int[10];
Ошентип, логикалык типтеги элементтери бар массив үчүн баштапкы ( демейки ) маанилер жалган болот , сандык маанилери бар массивдер үчүн - 0, char түрүнүн элементтери менен - ​​\u0000 . Класс тибиндеги массив (an objectтер) үчүн - null (бош саптар эмес - “” бирок өзгөчө null ). Башкача айтканда, жогорудагы мисалда arr массивинин бардык маанилери түздөн-түз көрсөтүлгөнгө чейин 0 болот. Коллекциялардан айырмаланып, массивдер динамикалык эмес. Белгилүү өлчөмдөгү массив жарыялангандан кийин, анын өлчөмүн өзгөртүүгө болбойт. Массивге жаңы элемент кошуу үчүн, жаңы чоңураак массив түзүп, ага эски массивдин бардык элементтерин көчүрүү керек (ArrayList ушундай иштейт). Баары эле биле бербеген жана сизди жакшы кармай турган бир жагдай бар. Javaда өзгөрмөлөрдүн эки түрү бар - жөнөкөй типтер жана толук кандуу an objectтерге шилтемелер . Булардын кайсынысы массивдер? Мисалы, бул жерде:
int[] arr = new int[10];
Баары жөнөкөй окшойт - бул 10 int элементтери . Демек, бул жөнөкөй түрү деп айта алабыз? Кандай болбосун. Java тorнде массивдер an object болуп саналат, динамикалык түрдө түзүлөт жана Object түрүндөгү өзгөрмөлөргө дайындалышы мүмкүн. Object классынын бардык методдорун массивде чакырса болот. Ошентип, биз да жаза алабыз:
Object arr = new int[]{7,5,4,3};
System.out.println(arr.toString());
Консолго чыгарууда сиз төмөнкүдөй нерсени аласыз:
[I@4769b07b
Java массивдеринин өзгөчөлүктөрү жөнүндө Java Array жөнүндө бул макаладан окуңуз . Бorмиңизди бекемдөө үчүн сиз бул жыйнактан бир нече маселелерди чече аласыз .

3. Коллекциялардын иерархиясын түшүндүрүңүз

Коллекциялар маалыматтар менен иштөөдө ийкемдүүлүк керек болгон учурларда колдонулат. Коллекциялар элементти кошуп, элементти алып салышы жана башка көптөгөн операцияларды аткарышы мүмкүн. Javaда көптөгөн ар кандай ишке ашыруулар бар жана биз учурдагы кырдаалга туура коллекцияны тандап алышыбыз керек. Адатта, сиз Collection интерфейси жөнүндө сөз кылганда , сизден анын айрым ишке ашырууларын жана анын Карта менен болгон байланышын тизмектеп берүү суралат . Мейли, бorп алалы. Ошентип, Коллекция жана Карта маалымат структуралары үчүн эки башка иерархия. Коллекция иерархиясы кандай көрүнөт : КоллекцияИнтервью учурунда алар эмнени сурашы мүмкүн: Javaдагы маалымат структуралары - 3 интерфейси негизги ыкмалардын тизмеси менен негизги жогорку шилтеме болуп саналат, алардан маалымат структураларынын үч негизги түрү пайда болот - Set , List , Queue . Set<T> - бул ар бир an object уникалдуу болгон an objectтердин жыйындысын билдирген интерфейс. List<T> – бул тизме деп аталган an objectтердин иреттелген ырааттуулугун билдирген интерфейс. Queue<T> - кезек катары уюштурулган структуралар үчүн жооптуу интерфейс (элементтердин ырааттуу сакталышы). Мурда айтылгандай, Карта өзүнчө иерархия: Карта<K, V> - бул сөздүктү билдирген интерфейс, анда элементтер ачкыч-маани жуптары катары камтылган. Мындан тышкары, бардык баскычтар (K) Map an objectинин ичинде уникалдуу болуп саналат . Коллекциянын бул түрү, эгерде биз ачкычты билсек, элементти табууну жеңилдетет - an objectтин уникалдуу идентификатору.Интервью учурунда алар эмнени сурашы мүмкүн: Javaдагы маалымат структуралары - 4

4. Сиз Set жөнүндө эмне билесиз?

Жогоруда айтылгандай, бул коллекция көптөгөн уникалдуу элементтерди камтыйт. Башкача айтканда, бир эле an object Java топтомунда бир нече жолу пайда болушу мүмкүн эмес. Мен дагы белгилегим келет, биз сан боюнча топтомдон (индекс) элементти чыгара албайбыз - катаал күч менен гана. Маанилүү нерсе, ар кандай Set ишке ашырууда маалыматтарды структуралаштыруунун ар кандай жолдору бар. Биз мындан ары конкреттүү ишке ашырууларды карап чыгабыз. Ошентип, Setтин негизги ишке ашырылышы : HashSet - бул хэш tableсына негизделген топтом, ал өз кезегинде издөөгө жардам берет. Издөө жана киргизүү учурунда иштөөнү жакшыртуучу хэш функциясын колдонот. Элементтердин санына карабастан, жалпысынан киргизүү жана издөө (кээде өчүрүү) туруктуу убакытка жакын убакытта - О(1) аткарылат. Хэш функциясын бир аздан кийин кененирээк карап чыгабыз. Ошондой эле HashSetте HashMap бар экенин белгилегим келет , ал жерде бардык сыйкырлар болот. Бул жерде Javaдагы HashSet жөнүндө кеңири макала . LinkedHashSet - бул класс HashSetти жаңы ыкмаларды кошпостон кеңейтет. LinkedList сыяктуу , бул класс топтомдун элементтеринин шилтемеленген тизмесин алар киргизилген тартипте сактайт. Бул берилген Set ишке ашырууда керектүү тартипти уюштурууга мүмкүндүк берет . TreeSet классы элементтерди сактоо структурасын уюштуруу үчүн кызыл-кара даракка негизделген топтомду түзөт. Башкача айтканда, берилген топтомдо биз элементтерди өсүү тартибинде иреттей алабыз. Эгерде биз "кутудагы" кээ бир стандарттуу an objectтерди колдонсок, мисалы, Integer , анда бүтүн сандардын жыйындысын өсүү тартибинде жайгаштыруу үчүн эч нерсе кылуунун кереги жок:
TreeSet set = new TreeSet<>();
set.add(4);
set.add(2);
set.add(3);
set.add(1);

System.out.println(set);
Ал эми консолдо биз жыйынтыкты алабыз:
[1, 2, 3, 4]
Башкача айтканда, бул топтомдо сандар иреттелген түрдө сакталат. Эгер TreeSet ичинде String элементтерин колдонсок , алар иргелет, бирок алфавит боюнча. Эгер бизде кандайдыр бир стандарттуу класс болсочу? Бул класстын an objectтери TreeSetти кантип түзүшөт ? Эгерде биз бул топтомго ыктыярдуу an objectти дайындоого аракет кылсак :
TreeSet set = new TreeSet<>();
set.add(new Cat(4, "Murzik"));
set.add(new Cat(2, "Barsik"));
set.add(new Cat(3, "Гарфилд"));

System.out.println(set);
Биз ClassCastException алабыз , анткени TreeSet бул түрдөгү an objectтерди кантип сорттоо керектигин билбейт. Бул учурда, Салыштырылуучу интерфейсти жана анын салыштыруу ыкмасын ишке ашыруу үчүн бизге ыңгайлаштырылган an object керек :
public class Cat implements Comparable {
    int age;
    String name;

   public Cat(int age, String name) {
       this.age = age;
       this.name = name;
   }

   @Override
   public int compareTo(Cat cat) {
       return age > cat.age ? 1 : -1;
   }

   @Override
   public String toString() {
       return "Cat{" +
               "age=" + age +
               ", name='" + name + '\'' +
               '}';
   }
}
Сиз байкагандай, compareTo ыкмасы int кайтарат :
  • 1 эгерде учурдагы (бул) an object ири деп эсептелсе;
  • -1 эгерде учурдагы an object аргумент катары келген an objectиден кичине деп эсептелсе;
  • 0 an objectтер бирдей болсо (биз муну бул учурда колдонбойбуз).
Бул учурда, биздин TreeSet туура иштеп, натыйжаны көрсөтөт:
[Мышык{жаш=2, аты='Барсик'}, Мышык{жаш=3, аты='Гарфилд'}, Мышык{жаш=4, аты='Мурзик'}]
Дагы бир жолу - компаратор интерфейсин жана анын салыштыруу ыкмасын ишке ашырган өзүнчө сорттоо классын түзүү :
public class CatComparator implements Comparator {

   @Override
   public int compare(Cat o1, Cat o2) {
       return o1.age > o2.age ? 1 : -1;
   }
}
Бул учурда, аны колдонуу үчүн, биз TreeSet конструкторуна ушул класстын an objectисин коюшубуз керек :
TreeSet set = new TreeSet<>(new CatComparator());
Андан кийин, TreeSetке кирген Cat классынын бардык an objectтери Cat Comparator классынын жардамы менен иргелет . Бул макаладан Javaдагы Comparator жана Comparable жөнүндө көбүрөөк биле аласыз .

5. Кезек жөнүндө айтып бериңиз

Кезек кезек катары уюштурулган структураларга жооптуу интерфейс - элементтерди ырааттуу сактоочу маалымат структурасы. Маселен, кезекте турган адамдардын ичинен башкаларга караганда эрте келген биринчи, ал эми баарынан кеч келген эң акыркысы кирет. Бул ыкма FIFO деп аталат , башкача айтканда, Биринчи кирген биринчи чыгат . Уникалдуу кезек ыкмалары биринчи же акыркы элемент менен иштөөгө багытталган, мисалы:
  • кошуу жана сунуш - кезектин аягына элементти киргизет,
  • алып салуу - бул кезектин башын чыгарат жана жок кылат,
  • peek - Кабыл алат, бирок кезектин башын алып салbyte.
2 БӨЛҮК
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION