JavaRush /Блоги Java /Random-TG /Онҳо дар мусоҳиба чӣ мепурсанд: Сохторҳои маълумот дар Ja...

Онҳо дар мусоҳиба чӣ мепурсанд: Сохторҳои маълумот дар Java. Қисми 1

Дар гурӯҳ нашр шудааст
Салом! Новобаста аз он ки шумо чӣ гуна ба он нигоҳ мекунед, шумо наметавонед бидуни бомуваффақият аз мусоҳибаи дохилшавӣ техникӣ таҳиякунанда шавед. Он чизе ки онҳо дар мусоҳиба мепурсанд: сохторҳои маълумот дар Java - 1Технологияҳои зиёди марбут ба Java вуҷуд доранд ва ҳама чизро омӯхтан ғайриимкон аст. Одатан, ҳангоми мусоҳиба танҳо як чизи мушаххас пурсида мешавад, агар онҳо дар ҷустуҷӯи таҳиякунанда бо таҷрибаи хуб дар баъзе чаҳорчӯбаи барои лоиҳа муҳим бошанд. Агар ин тавр бошад, шумо дар атрофи ин чаҳорчӯба бо суръати тамом таъқиб карда мешавед, шумо ба ин шубҳа надоред. Он чизе ки онҳо ҳангоми мусоҳиба мепурсанд: Сохторҳои додаҳо дар Java - 2Аммо ҳоло мо дар бораи базае гап мезанем, ки ҳар як таҳиягари Java бояд донад. Дар бораи он дониши классикӣ, ки ҳамааш аз он оғоз мешавад. Имрӯз ман мехоҳам ба яке аз мавзӯъҳои асосии ҳама гуна мусоҳиба - сохторҳои додаҳо дар Java дахл кунам . Пас, ба ҷои он ки дар атрофи бутта задан, биёед оғоз кунем. Рӯйхати саволҳоеро пайдо кунед, ки ҳангоми мусоҳиба ба шумо дар бораи ин мавзӯъ дода мешаванд.

1. Дар бораи сохторҳои додаҳо ба мо каме нақл кунед

Сохтори додаҳо як анбори додаҳоест, ки дорои маълумотест, ки ба таври муайян сохта шудааст. Ин сохторҳо барои иҷрои самараноки амалиётҳои муайян пешбинӣ шудаанд. Намунаҳои маъмулии сохторҳои додаҳо инҳоянд:
  • массивҳо,
  • стеллажьо,
  • навбатҳо,
  • рӯйхатҳои алоқаманд,
  • графикҳо,
  • дарахтон,
  • дарахтони префикс,
  • ҷадвали ҳаш.
Шумо метавонед бештар дар бораи онҳо дар ин ҷо ва дар ин ҷо пайдо кунед . Маълумот ҷузъи калидии барнома мебошад ва сохторҳо имкон медиҳанд, ки ин маълумот дар шакли мушаххаси сохторбандишуда нигоҳ дошта шаванд. Новобаста аз он ки барномаи шумо чӣ кор кунад, ин ҷанба ҳамеша дар он мавҷуд хоҳад буд: агар он веб-мағоза бошад, пас маълумот дар бораи маҳсулот нигоҳ дошта мешавад, агар он шабакаи иҷтимоӣ бошад, маълумот дар бораи корбарон ва файлҳо ва ғайра.

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, массивҳо an objectҳо мебошанд, ба таври динамикӣ сохта мешаванд ва метавонанд ба тағирёбандаҳои навъи Object таъин карда шаванд. Ҳама усулҳои синфи Objectро дар массив даъват кардан мумкин аст. Ҳамин тавр, мо ҳатто метавонем нависем:
Object arr = new int[]{7,5,4,3};
System.out.println(arr.toString());
Ҳангоми баромад ба консол шумо метавонед чизе ба даст оред:
[I@4769b07b
Маълумоти бештарро дар бораи хусусиятҳои массивҳо дар Java дар ин мақола дар бораи Java Array хонед . Барои мустаҳкам кардани дониши худ, шумо метавонед якчанд масъалаҳоро аз ин маҷмӯа ҳал кунед .

3.Иерархияи коллексияҳоро шарҳ диҳед

Маҷмӯаҳо дар ҳолатҳое истифода мешаванд, ки ба шумо ҳангоми кор бо маълумот чандир лозим аст. Коллексияҳо метавонанд элементро илова кунанд, элементро хориҷ кунанд ва бисёр амалҳои дигарро иҷро кунанд. Дар Java бисёр татбиқҳои гуногун мавҷуданд ва мо танҳо бояд коллексияи дурустро барои вазъияти кунунӣ интихоб кунем. Одатан, вақте ки шумо интерфейси Коллексияро зикр мекунед , аз шумо хоҳиш карда мешавад, ки баъзе аз татбиқи он ва робитаи онро бо Map номбар кунед . Хуб, биёед фаҳмем. Ҳамин тавр, Коллексия ва Харита ду иерархияи гуногун барои сохторҳои додаҳо мебошанд. Иерархияи Коллексия чӣ гуна менамояд : Он чизе ки онҳо ҳангоми мусоҳиба мепурсанд: Сохторҳои маълумот дар Java - 3Интерфейси Коллексия пайванди калидии боло бо рӯйхати усулҳои асосӣ мебошад, ки аз онҳо се намуди асосии сохторҳои додаҳо сарчашма мегиранд - Set , List , Queue . Set<T> интерфейсест, ки маҷмӯи an objectҳоро ифода мекунад, ки дар онҳо ҳар як an object беназир аст. Рӯйхати<T> интерфейсест, ки пайдарпаии тартибёфтаи an objectҳоро, ки рӯйхат номида мешавад, ифода мекунад. Queue<T> интерфейсест, ки барои сохторҳое масъул аст, ки ҳамчун навбат ташкил карда мешаванд (нигаҳдории пайдарпайи элементҳо). Тавре ки қаблан зикр гардид, Харита иерархияи алоҳида аст: Он чизе ки онҳо ҳангоми мусоҳиба мепурсанд: Сохторҳои маълумот дар Java - 4Map<K, V> интерфейсест, ки луғатро ифода мекунад, ки дар он элементҳо ҳамчун ҷуфтҳои калид-арзишҳо мавҷуданд. Ғайр аз он, ҳамаи калидҳо (K) дар an objectи Map беназиранд . Ин намуди коллексия ёфтани элементро осонтар мекунад, агар мо калид - идентификатори ягонаи an objectро донем.

4. Шумо дар бораи Set чиро медонед?

Тавре ки қаблан гуфта шуд, ин коллексия дорои бисёр унсурҳои беназир мебошад. Ба ибораи дигар, ҳамон як an object наметавонад дар маҷмӯи Java зиёда аз як маротиба пайдо шавад. Ман инчунин мехоҳам қайд намоям, ки мо наметавонем элементро аз Маҷмӯа аз рӯи адад (индекс) истихроҷ кунем - танҳо бо қувваи бераҳмона. Муҳим он аст, ки татбиқҳои гуногуни Set дорои роҳҳои гуногуни сохтори додаҳо мебошанд. Мо минбаъд татбиқи мушаххасро баррасӣ хоҳем кард. Ҳамин тавр, татбиқи асосии Set : HashSet маҷмӯаест, ки ба ҷадвали hash асос ёфтааст, ки дар навбати худ дар ҷустуҷӯ кӯмак мекунад. Функсияи хэшро истифода мебарад, ки иҷрои онро ҳангоми ҷустуҷӯ ва воридкунӣ беҳтар мекунад. Сарфи назар аз шумораи элементҳо, умуман дохилкунӣ ва ҷустуҷӯ (баъзан несткунӣ) дар наздикии вақти доимӣ - O(1) анҷом дода мешаванд. Мо каме баъдтар функсияи hash-ро муфассалтар дида мебароем. Ман инчунин мехоҳам қайд намоям, ки HashSet дорои HashMap мебошад , ки дар он ҷо ҳама ҷодугарӣ рӯй медиҳад. Ин аст мақолаи муфассал дар бораи HashSet дар Java . LinkedHashSet - ин синф HashSet-ро бе илова кардани усулҳои нав васеъ мекунад. Мисли LinkedList , ин синф рӯйхати алоқаманди унсурҳои маҷмӯаро бо тартиби ворид кардани онҳо нигоҳ медорад. Ин ба шумо имкон медиҳад, ки тартиби заруриро дар татбиқи маҷмӯи додашуда ташкил кунед . Синфи TreeSet маҷмӯаеро месозад, ки барои ташкor сохтори нигоҳдории элементҳо ба дарахти сурху сиёҳ асос ёфтааст. Ба ибораи дигар, дар маҷмӯи додашуда мо метавонем элементҳоро бо тартиби афзоиш ҷудо кунем. Агар мо баъзе 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]
Яъне дар ин маҷмӯа рақамҳо дар шакли мураттаб нигоҳ дошта мешаванд. Агар мо элементҳои String -ро дар TreeSet истифода барем , онҳо мураттаб карда мешаванд, аммо аз рӯи алифбо. Хуб, агар мо ягон синфи стандартӣ (муштарӣ) дошта бошем? Объектҳои ин синф 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;
   }
}
Дар ин ҳолат, барои истифодаи он, мо бояд an objectи ин синфро ба созандаи TreeSet гузорем :
TreeSet set = new TreeSet<>(new CatComparator());
Пас аз ин, ҳама an objectҳои синфи Cat , ки ба TreeSet дохил мешаванд, бо истифода аз синфи Cat Comparator мураттаб карда мешаванд . Шумо метавонед дар бораи муқоиса ва муқоисашаванда дар Java аз ин мақола маълумоти бештар гиред .

5. Дар бораи навбат ба мо бигӯед

Навбат интерфейсест, ки барои сохторҳое масъул аст, ки ҳамчун навбат ташкил карда мешаванд - сохтори додаҳо, ки унсурҳоро пайдарпай нигоҳ медорад. Масалан, аз навбати одамон аввалин касе мешавад, ки аз дигарон пештар омада бошад ва охирин касе бошад, ки аз ҳама дертар омадааст. Ин усул FIFO номида мешавад , яъне Аввал дар аввал баромад . Усулҳои беназири навбат ба кор бо унсури якум ё охирин тамаркуз мекунанд, масалан:
  • илова кардан ва пешниҳод кардан - элементро дар охири навбат ворид мекунад,
  • хориҷ кардан - сарлавҳаи ин навбатро дарёфт ва хориҷ мекунад,
  • peek - Сарлавҳаи навбатро дарёфт мекунад, аммо нест намекунад.
КИСМИ 2
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION