September 4, 2023

Interview questions

1. Java-da ma'lumotlar turlari ikkita asosiy guruhga bo'linadi: Primitive ma'lumotlar turlari va non-primitive ma'lumotlar turlari. Bu ikki toifa o'rtasidagi farqlarning umumiy ko'rinishi:

Primitive:

- Primitiv ma'lumotlar turlari oddiy qiymatlarni ifodalaydi va butun sonlar, kasr sonlar, belgilar va mantiqiy qiymatlar kabi asosiy ma'lumotlar turlarini saqlash uchun ishlatiladi.

- Ular Java tili tomonidan oldindan belgilangan va hech qanday Class yoki ob'ektdan kelib chiqmaydi.

- Primitiv ma'lumot turlari: byte, short, int, long, float, double, char, boolean

Non-Primitive:

- Non-Primitiv ma'lumotlar turlari murakkab ma'lumotlar tuzilmalari, ob'ektlar va classlar misollarini saqlash uchun ishlatiladi.

- Ular Java tili tomonidan oldindan belgilanmagan, lekin classlar yoki interfeyslarni belgilash orqali yaratilgan. Ushbu classlarning misollari ob'ektlardir.

- Non-Primitiv ma'lumotlar turlari haqiqiy ma'lumotlarni saqlamaydi, lekin xotiradagi ob'ektlarga havolalarni (xotira manzillarini) saqlaydi.

- Non-Primitiv ma'lumotlar turlariga misollar classlar, interfeyslar, massivlar va foydalanuvchi tomonidan aniqlangan turlarni o'z ichiga oladi.

Xulosa qilib aytganda, Java-da Primitiv va Non-Primitiv ma'lumotlar turlari o'rtasidagi asosiy farq shundan iboratki, Primitiv ma'lumotlar turlari oddiy qiymatlarni ifodalaydi va til tomonidan oldindan belgilanadi, Non-Primitivma'lumotlar turlari esa murakkabroq ma'lumotlar tuzilmalarini ifodalash uchun ishlatiladi va ular tomonidan belgilanadi. classlar yoki interfeyslar orqali dasturchi. Bundan tashqari, non-primitiv ma'lumotlar turlari ob'ektlarga havolalarni xotirada saqlaydi, primitiv ma'lumotlar turlari esa haqiqiy ma'lumotlar qiymatlarini saqlaydi.

2. Ob'ektga yo'naltirilgan dasturlash (OOP) ishlab chiquvchilarga texnik xizmat ko'rsatadigan, qayta foydalanish mumkin bo'lgan va tartibga solinadigan dasturiy ta'minot tizimlarini yaratish uchun o'z kodlarini loyihalash va tuzishda yordam beradigan bir nechta asosiy printsiplarga asoslanadi. Ushbu tamoyillar ko'pincha "OOPning to'rtta ustuni" yoki "OOPning to'rtta printsipi" deb nomlanadi. Ular:

Encapsulation: Ushbu tamoyil ma'lumotlar (atributlar yoki xususiyatlar) va ushbu ma'lumotlarda ishlaydigan metodlarni (funktsiyalar yoki xatti-harakatlar) class deb ataladigan yagona birlikka birlashtirishga urg'u beradi. Inkapsulyatsiya ob'ektning ichki holatiga kirishni nazorat qilishda yordam beradi va ruxsatsiz kirish yoki o'zgartirishni oldini oladi. Bu ma'lumotlarni yashirish va mavhumlikni targ'ib qiladi.

Inheritance: Meros bir classga subclass boshqa classning superclass xossalari va xatti-harakatlarini meros qilib olish imkonini beradi. Bu kodni qayta ishlatish va class tuzilmangizda ierarxiyalarni yaratishga yordam beradi. subclass lar superclass ning funksionalligini kengaytirishi yoki override qilish mumkin.

Polymorphism: Polimorfizm "ko'p shakllar" degan ma'noni anglatadi. Bu turli classlar ob'ektlarini umumiy superclass ob'ektlari sifatida ko'rishga imkon beradi. Polimorfizm sizning kodingizda moslashuvchanlik va kengayish imkonini beradi. Bunga Java-dagi usullarni override qilish va interfeyslar orqali erishish mumkin.

Abstraction: bu ob'ektlarning muhim xususiyatlariga asoslangan classlarni modellashtirish orqali murakkab haqiqatni soddalashtirish jarayoni. Bu amalga oshirish tafsilotlarini yashirgan holda classlar uchun aniq va ixcham interfeysni aniqlashni o'z ichiga oladi. Abstraktsiya murakkablikni pasaytiradi va ob'ektlar bilan yuqori darajadagi ishlashni osonlashtiradi.

Ushbu to'rtta tamoyil ob'ektga yo'naltirilgan dasturlashning asosini tashkil qiladi va ular ishlab chiquvchilarga modulli, barqaror va moslashuvchan dasturiy ta'minot tizimlarini yaratishda yordam beradi

3. Java-da konstruktor - bu ob'ektlar yaratilganda ularni ishga tushirish uchun ishlatiladigan maxsus turdagi metod. Konstruktorlar ob'ektni qanday ishga tushirish kerakligini aniqlash, uning boshlang'ich holatini o'rnatish va foydalanishga tayyorlash uchun zarurdir. Java-dagi konstruktorlarning ba'zi asosiy xususiyatlari:

Konstruktor nomi: Konstruktorlar o'zlari e'lon qilingan class bilan bir xil nomga ega.

Qaytish turi yo'q: Konstruktorlarda qaytarish turi yo'q. Buning sababi shundaki, ob'ekt yaratilganda konstruktorlar avtomatik ravishda chaqiriladi va ularning asosiy maqsadi ob'ektni ishga tushirishdir.

Initializatsiya: Konstruktorlar ob'ektning namuna o'zgaruvchilari (atributlari yoki xususiyatlari) ni ishga tushirish uchun javobgardir. Ushbu o'zgaruvchilar uchun boshlang'ich qiymatlarni o'rnatish uchun kodni konstruktorga kiritishingiz mumkin.

Overloading: Oddiy usullar singari, siz classda bir nechta konstruktorlarni belgilashingiz mumkin, ularning har biri boshqa parametrlar to'plamiga ega. Bu konstruktorning Overloading deb ataladi. Java ob'ekt yaratishda taqdim etilgan argumentlar asosida tegishli konstruktorni tanlaydi.

Konstruktorlar ob'ektlarning to'g'ri ishga tushirilishini ta'minlashda hal qiluvchi rol o'ynaydi va ular Java ob'ektga yo'naltirilgan dasturlash paradigmasida asosiy tushunchadir.

4. Java-da asosan uch turdagi konstruktorlar mavjud:

No-Arg Constructors: Metodlarga o'xshab, Java konstruktori parametrlarga (argumentlarga) ega bo'lishi yoki bo'lmasligi mumkin. Agar konstruktor hech qanday parametrni qabul qilmasa, u argumentsiz konstruktor sifatida tanilgan.

Parameterized Constructor: Java konstruktori bir yoki bir nechta parametrlarni ham qabul qilishi mumkin. Bunday konstruktorlar parametrlangan konstruktorlar (parametrli konstruktor) deb nomlanadi.

Default Constructor: Agar biz hech qanday konstruktor yaratmasak, Java kompilyatori dasturni bajarish jarayonida avtomatik ravishda No-Arg Constructorsini yaratadi. Ushbu konstruktor standart konstruktor deb ataladi.

5. Java-da access modifikatorlari dastur ichidagi classlar, metodlar va o'zgaruvchilarning ko'rinishi va foydalanish imkoniyatini boshqarish uchun ishlatiladigan kalit so'zlardir. Java-da to'rtta asosiy kirish modifikatorlari mavjud:

Public: Agar class, metod yoki o'zgaruvchi public deb e'lon qilingan bo'lsa, unga dasturning istalgan joyidan, u bir xil paket ichida yoki boshqa paketda bo'ladimi, kirish mumkin.

Private: Agar class a'zosi (metod yoki o'zgaruvchi) private deb e'lon qilingan bo'lsa, unga faqat bitta class ichida kirish mumkin. U classdan tashqarida, hatto bitta paket ichida ham ko'rinmaydi yoki unga kirish mumkin emas.

Protected: protected deb e'lon qilingan a'zolar bir xil paketda bo'ladimi yoki yo'qmi, bir xil class ichida, bir paketdagi classlar ichida va subclasses lar ichida (ya'ni, protected a'zoni o'z ichiga olgan classdan meros bo'lib qolgan classlar) kirish mumkin.

Default: Hech qanday kirish modifikatori ko'rsatilmagan bo'lsa (ya'ni, public, private yoki protected kalit so'z ishlatilmasa), a'zo "standart" yoki "package-private" kirish huquqiga ega deb hisoblanadi. Bu shuni anglatadiki, unga faqat bitta paket ichida kirish mumkin.

Tegishli kirish modifikatorini tanlash sizning dizayningiz va inkapsulyatsiya maqsadlaringizga bog'liq. Dasturingizning toʻgʻri va xavfsiz ishlashi uchun zarur boʻlgan kirish darajasiga ruxsat berish bilan birga, aʼzolarni imkon qadar cheklab qoʻyishingiz kerak.

6. Java tilidagi polimorfizm turli sinflar ob'ektlarining umumiy supersinf ob'ektlari kabi muomala qilish qobiliyatini anglatadi. Polimorfizm ob'ektga yo'naltirilgan dasturlashning asosiy tushunchasi bo'lib, u yanada moslashuvchan va kengaytiriladigan kodni yaratishga imkon beradi.

Polimorfizmga ko'pincha meros va usulni bekor qilish orqali erishiladi. Agar pastki sinf o'zining yuqori sinfining usulini bekor qilsa, u ushbu usulni o'zi amalga oshirishni ta'minlashi mumkin. Bu kichik sinf ob'ektlariga ular har xil xatti-harakatlarga ega bo'lishi mumkin bo'lsa ham, ular yuqori sinf ob'ektlari kabi muomala qilish imkonini beradi.

Java-da polimorfizmdan qanday foydalanish mumkinligiga misol:

umumiy sinf hayvon {
    public void makeSound() {
      System.out.println("Hayvon ovoz chiqaradi");
    }
}

umumiy sinf It hayvonni kengaytiradi {
    public void makeSound() {
      System.out.println("It hurmoqda");
    }
}

umumiy sinf Mushuk hayvonni kengaytiradi {
    public void makeSound() {
      System.out.println("Mushuk miyovlaydi");
    }
}

umumiy sinf Asosiy {
    umumiy statik void main(String[] args) {
      Hayvon hayvon1 = yangi it();
      Hayvon hayvon2 = yangi mushuk();
      hayvon1.makeSound(); // "It huryapti" deb chiqadi animal2.makeSound(); // "Mushuk miyovlaydi" chiqishi
    }
}

Ushbu misolda Animal sinfida makeSound() deb nomlangan usul mavjud. Dog va Cat sinflari Animal sinfidan meros bo'lib, makeSound() usulini o'z ilovalari bilan bekor qiladi. Asosiy usulda ikkita hayvon obyekti yaratiladi, ulardan biri Dog tipidagi va biri Cat tipidagi. Ushbu ob'ektlarda makeSound() usuli chaqirilganda, Dog va Cat sinflaridagi usulning bekor qilingan versiyasi chaqiriladi, natijada har bir ob'ekt uchun turli xil chiqishlar olinadi.

Polimorfizm ko'proq moslashuvchan va qayta foydalanish mumkin bo'lgan kodni yaratishga imkon beradi, chunki turli sinflar ob'ektlari umumiy supersinf ob'ektlari kabi ko'rib chiqilishi mumkin.

7. Java-da overloading va b overriding classlardagi metodlar bilan bog'liq ikki xil tushunchadir. Ular turli maqsadlarga xizmat qiladi va o'ziga xos qoidalar va xatti-harakatlarga ega. Usulni overloading va overriding o'rtasidagi asosiy farqlar:

Method Overloading:

1. Ta'rif: Metod overloading - bu bir xil nomga ega, lekin turli parametrlarga ega (turli metod) bir xil classdagi bir nechta metodlarni aniqlash amaliyotidir. Ushbu metodlar bir xil nomga ega, ammo ularning parametrlarining soni yoki turlari bilan ajralib turadi.

2. Meros: overloading meros bilan bog'liq emas; bitta classda sodir bo'ladi.

3. Qaytish turi: overloading metodlar bir xil yoki turli xil qaytarish turlariga ega bo'lishi mumkin. Qaytish turining o'zi overloaded metodlarni farqlamaydi.

4. Example:

public class Calculator {

public int add(int a, int b) {

return a + b;

}

public double add(double a, double b) {

return a + b;

}

}

Method Overriding:

1. Ta'rif: Overriding - bu o'zining subclass allaqachon aniqlangan subeerclassdagi metod uchun maxsus amalga oshirishni ta'minlash amaliyotidir. Subklassdagi metod superclassdagi metod bilan bir xil nomga, qaytarish turiga va parametrlarga ega bo'lishi kerak.

2. Meros: Overriding meros bilan bog'liq; u subclass superclass munosabatlarini o'z ichiga oladi.

3. Qaytish turi: overriding ular overriding metodlar bilan bir xil qaytish turiga ega bo'lishi kerak.

4. Example:

class Animal {

void makeSound() {

System.out.println("Some generic animal sound");

}

}

class Dog extends Animal {

@Override

void makeSound() {

System.out.println("Bark");

}

}

8. Java-da interfeyslar ham, mavhum sinflar ham o'zlarining kichik sinflari tomonidan amalga oshirilishi kerak bo'lgan usullar to'plamini aniqlash uchun ishlatiladi. Biroq, ikkalasi o'rtasida bir nechta asosiy farqlar mavjud:

  1. Mavhum sinflar metodlarni amalga oshirishga ega bo'lishi mumkin, interfeyslarda esa mumkin emas. Mavhum sinf standart usullarni amalga oshirish va maydonlarni taqdim etishi mumkin, interfeys esa faqat mavhum usullarni (amalga oshirishsiz usullar) va konstantalarni (yakuniy maydonlar) e'lon qilishi mumkin.
  2. Sinf bir nechta interfeyslarni amalga oshirishi mumkin, lekin u faqat bitta mavhum sinfni kengaytirishi mumkin. Bu interfeyslar mavhum sinflarga qaraganda ancha moslashuvchan ekanligini anglatadi, chunki ular sinfga bir nechta manbalardan xatti-harakatlarni meros qilib olish imkonini beradi.
  3. Abstrakt sinflarda konstruktorlar bo'lishi mumkin, interfeyslarda esa bo'lmaydi. Bu shuni anglatadiki, mavhum sinf umumiy maydonlarni ishga tushirish yoki uning pastki sinflari uchun umumiy holatni o'rnatish uchun ishlatilishi mumkin, interfeys esa mumkin emas.
  4. Mavhum sinflar o'z a'zolari uchun kirish modifikatorlariga ega bo'lishi mumkin (masalan, ommaviy, shaxsiy, himoyalangan), interfeysning barcha a'zolari sukut bo'yicha ochiqdir.
  5. Interfeyslar bir-biriga bog'liq bo'lmagan sinflar bo'ylab umumiy xatti-harakatlarni aniqlash uchun ishlatilishi mumkin, mavhum sinflar odatda tegishli sinflar to'plamida umumiy xatti-harakatni aniqlash uchun ishlatiladi.

Xulosa qilib aytadigan bo'lsak, ikkala interfeys va mavhum sinflar o'zlarining kichik sinflari tomonidan amalga oshirilishi kerak bo'lgan usullar to'plamini aniqlash uchun ishlatiladi, lekin ular bir nechta asosiy jihatlarda farqlanadi. Interfeyslar mavhum sinflarga qaraganda ancha moslashuvchan va bir-biriga bog'liq bo'lmagan sinflar bo'ylab umumiy xatti-harakatlarni aniqlash uchun ishlatilishi mumkin, mavhum sinflar odatda tegishli sinflar to'plamida umumiy xatti-harakatni aniqlash uchun ishlatiladi va usullarni amalga oshirish va konstruktorlarga ega bo'lishi mumkin.

9. Java-dagi Collection Framework - bu ob'ektlar to'plamini boshqarish va saqlash uchun Java API (Application Programming Interface) tomonidan taqdim etilgan keng qamrovli va standartlashtirilgan classlar va interfeyslar to'plami.

- Interfeyslar: Collection Framework bir nechta asosiy interfeyslarni o'z ichiga oladi, jumladan Collection , List, Set, Queue va Map. Ushbu interfeyslar umumiylikni belgilaydi

- Classlar: Java ushbu interfeyslarni amalga oshiradigan bir nechta aniq classlarni taqdim etadi, masalan, ArrayList, LinkedList, HashSet, HashMap va boshqalar. Ushbu classlar turli xil foydalanish holatlariga mos keladigan turli xil ma'lumotlar tuzilmalari va ishlash xususiyatlarini taklif qiladi.

- Algoritmlar: Collection Framework java.util.Collections classidagi to'plamlarda saralash, qidirish, aralashtirish va boshqalar kabi operatsiyalarni bajarish uchun yordamchi metodlar va algoritmlarni o'z ichiga oladi.

- Iteratorlar: iteratorlar to'plam elementlarini birma-bir bosib o'tish uchun ishlatiladi. Java to'plamlar bo'yicha takrorlashni soddalashtirish uchun iteratorlar va takomillashtirilgan har bir tsiklni taqdim etadi.

- Generics: Generics to'plamga sig'ishi mumkin bo'lgan elementlar turini ko'rsatib, turdagi xavfsiz to'plamlarni aniqlash imkonini beradi. Bu kompilyatsiya vaqti turini tekshirishni ta'minlaydi va aniq turdagi kastingga ehtiyojni yo'q qiladi.

Java Collection Framework-dagi umumiy to'plam turlariga quyidagilar kiradi:

List: takroriy elementlarga ruxsat beruvchi tartiblangan to'plamlar. Umumiy ilovalar qatoriga ArrayList va LinkedList kiradi.

Set: Ikki nusxadagi elementlarga ruxsat bermaydigan va hech qanday aniq tartibni kafolatlamaydigan to'plamlar. Umumiy ilovalar orasida HashSet va TreeSet mavjud.

Queue: birinchi kelgan, birinchi chiqadi (FIFO) tartibini ifodalovchi to'plamlar. Umumiy ilovalar orasida LinkedList (standart navbat uchun) va PriorityQueue (ustivor navbat uchun) mavjud.

Map: kalit-qiymat juftlarini saqlaydigan to'plamlar, bu erda kalitlar noyobdir. Umumiy dasturlarga HashMap va TreeMap kiradi.

Java Collection Framework keng ko'lamli ilovalarda qo'llanilishi mumkin bo'lgan izchil va qayta foydalanish mumkin bo'lgan sinflar va interfeyslar to'plamini ta'minlab, to'plamlar bilan ishlash jarayonini soddalashtiradi. U ob'ektlar to'plamini boshqarish va manipulyatsiya qilishning yagona usulini taqdim etish orqali kodni qayta ishlatishni targ'ib qiladi va kodni o'qishni yaxshilaydi.

10. Java-da ikkalasi ArrayListham LinkedListinterfeysning amalga oshirilishidir List, lekin ular ichki amalga oshirish va ishlash xususiyatlari bilan farqlanadi.

An ArrayListdinamik ravishda o'zgartiriladigan massiv yordamida amalga oshiriladi. U indeks bo'yicha elementlarga tezkor kirishni ta'minlaydi va ro'yxatdagi elementlarni samarali iteratsiya qilish imkonini beradi. Biroq, ro'yxatning o'rtasidan elementlarni qo'shish yoki olib tashlash sekinroq bo'lishi mumkin, chunki qo'shish yoki o'chirish nuqtasidan keyingi elementlar ro'yxat tartibini saqlash uchun xotirada siljishi kerak.

A LinkedList, boshqa tomondan, tugunlarning ikki marta bog'langan ro'yxati yordamida amalga oshiriladi. Bu ro'yxatning istalgan pozitsiyasiga elementlarni tezda kiritish va olib tashlashni ta'minlaydi, chunki faqat tugunlar orasidagi aloqalarni o'zgartirish kerak. Biroq, indeks bo'yicha elementlarga kirish sekinroq bo'lishi mumkin, chunki kerakli elementga erishish uchun ro'yxat boshidan yoki oxiridan o'tish kerak.

ArrayListJava o'rtasidagi asosiy farqlardan ba'zilari LinkedList:

  • Kirish vaqti: ArrayListelementlarga indeks bo'yicha tezkor kirish vaqtini ta'minlaydi, shu bilan birga LinkedListelementlarga indeks bo'yicha kirish uchun ro'yxat bo'ylab o'tishni talab qiladi.
  • Qo'shish va o'chirish vaqti: LinkedListayniqsa, ro'yxatning o'rtasida tez kiritish va o'chirish vaqtini ta'minlaydi, shu bilan birga ArrayListxotiradagi elementlarni almashtirish zarurati tufayli sekinroq bo'lishi mumkin.
  • Xotiradan foydalanish: ArrayListuning elementlarini saqlash uchun qo'shni xotira blokidan foydalanadi, shu bilan birga LinkedListxotira samaradorligi kamroq bo'lishi mumkin bo'lgan tugunlarning ikki marta bog'langan ro'yxatidan foydalanadi.
  • Iteratsiya: ArrayListhar bir tsikldan foydalangan holda uning elementlari bo'yicha tez takrorlashni ta'minlaydi, LinkedListro'yxatni samarali o'tkazish uchun iteratordan foydalanishni talab qiladi.

Umuman olganda, ArrayListelementlarga tasodifiy kirish zarur bo'lganda va ro'yxat tez-tez o'zgartirilmasa, LinkedListyaxshi tanlov bo'lsa, elementlarni tez-tez kiritish yoki o'chirish kerak bo'lganda, ayniqsa ro'yxatning o'rtasida yaxshi tanlovdir. Biroq, o'rtasidagi tanlov ArrayListva LinkedListoxir-oqibat, dasturning o'ziga xos talablariga va saqlanadigan ma'lumotlarning tabiatiga bog'liq.

ArrayListJava va Java o'rtasidagi ba'zi qo'shimcha farqlar LinkedList:

  • Imkoniyat: ArrayListqo'shimcha elementlarni joylashtirish uchun kerak bo'lganda oshirish mumkin bo'lgan quvvatga ega, LinkedListsig'imga ega emas va elementlar qo'shilishi yoki olib tashlanishi natijasida o'sishi yoki qisqarishi mumkin.
  • Saralash: usuli yoki moslamasi ArrayListyordamida samarali saralanishi mumkin , lekin o'rnatilgan tartiblash usulini ta'minlamaydi va qo'lda saralanishi kerak.Collections.sort()ComparatorLinkedList
  • Tasodifiy kirish va ketma-ket kirish: ArrayListelementlarga tasodifiy kirish uchun eng mos keladi, shu bilan birga LinkedListketma-ket kirish yoki elementlarni qidirish yoki o'zgartirish kabi ro'yxat bo'ylab harakatlanishni o'z ichiga olgan operatsiyalar uchun eng mos keladi.
  • Xotiraning bo'linishi: ArrayListxotira parchalanishidan aziyat chekishi mumkin, ayniqsa ko'p elementlar tez-tez qo'shilsa va o'chirilsa, LinkedListbu muammodan aziyat chekmaydi, chunki har bir tugun mustaqil ravishda ajratilishi va ajratilishi mumkin.
  • Serializatsiya: ArrayListo'rnatilgan Java seriyali mexanizmi yordamida ketma-ketlashtirilishi mumkin, lekin LinkedListto'g'ridan-to'g'ri ketma-ketlashtirib bo'lmaydi va avval qatorga yoki boshqa seriyali to'plamga aylantirilishi kerak.

ArrayListXulosa qilib aytganda , LinkedListJava-da turli xil kuchli va zaif tomonlar mavjud va ulardan qaysi birini tanlash dasturning o'ziga xos talablariga bog'liq. Umumiy qoida sifatida, ArrayListelementlarga tasodifiy kirishni yoki ro'yxatni kamdan-kam o'zgartirishni talab qiladigan stsenariylar uchun ko'proq mos keladi, LinkedListelementlarni tez-tez kiritish yoki o'chirish yoki ro'yxatga ketma-ket kirishni talab qiladigan stsenariylar uchun yaxshiroqdir.

11. Java-da Stack va Queue ikkalasi ham ob'ektlar to'plamini belgilaydigan interfeyslardir, lekin ular asosiy xususiyatlari va qo'llab-quvvatlaydigan operatsiyalari bilan farqlanadi.

  1. Buyurtma:
  • Stack - oxirgi kiruvchi birinchi chiqish (LIFO) ma'lumotlar tuzilmasi, ya'ni stekga qo'shilgan oxirgi element birinchi bo'lib o'chiriladi. Bundan farqli o'laroq, Navbat birinchi bo'lib birinchi chiqadi (FIFO) ma'lumotlar tuzilmasi bo'lib, navbatga qo'shilgan birinchi element birinchi bo'lib o'chiriladi.
  1. Operatsiyalar:
  • Stack stekning yuqori qismiga elementlar qo'shish uchun push() ni va stekdan yuqori elementni olib tashlash uchun pop() ni qo'llab-quvvatlaydi. Navbat, aksincha, navbat oxiriga elementlar qo'shish uchun add() ni va navbatdan birinchi elementni olib tashlash uchun remove() ni qo'llab-quvvatlaydi.
  1. Qidiruv:
  • Stack va Queue ikkalasi ham peek() usuli yordamida elementlarni olish imkonini beradi, bu esa stekning yuqori elementini yoki navbatning birinchi elementini olib tashlamasdan qaytaradi. Bundan tashqari, Stack yuqoridan sanab o'tilgan elementning stekdagi o'rnini qaytaradigan search() usulini taqdim etadi. Navbat hech qanday ekvivalent usulni taqdim etmaydi.
  1. Amalga oshirish:
  • Stack interfeysi Java-da faqat bitta dasturga ega, bu java.util.Stack sinfidir. Queue interfeysi Java-da LinkedList, PriorityQueue va ArrayDeque kabi bir nechta ilovalarga ega, ularning har biri o'ziga xos xususiyatlar va ishlash xususiyatlariga ega.

Xulosa qilib aytganda, Stack - bu push() va pop() operatsiyalarini qo'llab-quvvatlaydigan LIFO ma'lumotlar tuzilmasi, navbat esa add() va olib tashlash() operatsiyalarini qo'llab-quvvatlaydigan FIFO ma'lumotlar tuzilmasi. Muayyan foydalanish holatiga qarab, biri boshqasidan ko'ra ko'proq mos kelishi mumkin. Misol uchun, agar siz elementlarni qo'shilgan tartibda qayta ishlashingiz kerak bo'lsa, Navbat yaxshiroq tanlov bo'lishi mumkin. Agar orqaga qaytish yoki operatsiyalarni bekor qilish kerak bo'lsa, Stack yaxshiroq tanlov bo'lishi mumkin.

12. Java-da ikkalasi HashMapham TreeMapinterfeysning amalga oshirilishidir Map, lekin ular ichki amalga oshirish va ishlash xususiyatlari bilan farqlanadi.

A HashMapxesh-jadval yordamida amalga oshiriladi, u tezkor kalit-qiymatni qidirish vaqtini ta'minlaydi, lekin kalitlar yoki qiymatlarni biron bir tartibda saqlamaydi. Xesh-jadvaldagi o'rnini aniqlash va mos ravishda tenglikni tekshirish uchun kalitlarining HashMapva hashCode()usullaridan foydalanadi .equals()

TreeMapBoshqa tomondan, A o'z-o'zidan muvozanatlashuvchi ikkilik qidiruv daraxti yordamida amalga oshiriladi, bu kalitlarni tartiblangan tartibda saqlaydi. Daraxtdagi o'rnini aniqlash va tenglikni tekshirish uchun kalitlari usulidan TreeMapfoydalanadi .compareTo()

HashMapJava va Java o'rtasidagi ba'zi asosiy farqlar TreeMap:

  • Buyurtma: HashMapo'z kalitlari yoki qiymatlarining hech qanday tartibini saqlamaydi, shu bilan birga TreeMapkalitlarni tabiiy tartib yoki odatiylik asosida tartiblangan tartibda saqlaydi Comparator.
  • Qidiruv vaqti: va usullaridan HashMapfoydalangan holda kalit-qiymat juftliklarini doimiy vaqtda qidirishni ta'minlaydi , va usullari yordamida logarifmik vaqtni qidirishni ta'minlaydi .get()containsKey()TreeMapget()containsKey()
  • Qo'shish va o'chirish vaqti: va usullari HashMapyordamida kalit-qiymat juftlarini doimiy vaqtda kiritish va o'chirishni ta'minlaydi , logarifmik vaqtni kiritish va o'chirishni ta'minlaydi.put()remove()TreeMap
  • Xotiradan foydalanish: HashMapkalit-qiymat juftlarini saqlash uchun xesh-jadvaldan foydalanadi, bu esa tomonidan ishlatiladigan o'z-o'zini muvozanatlashtiruvchi ikkilik qidiruv daraxtiga qaraganda kamroq xotira samaradorligiga ega TreeMap.
  • Maxsus tartiblash: kalitlarni saralashning o'rnatilgan usulini ta'minlamasdan , kalitlarni TreeMapmaxsus yordamida tartiblash imkonini beradi .ComparatorHashMap

Umuman olganda, HashMapkalit-qiymatni tezkor qidirish va kiritish zarur bo'lganda va kalitlar yoki qiymatlar tartibi muhim bo'lmaganda yaxshi tanlovdir. TreeMapkalitlarni tartiblangan tartibda saqlash kerak bo'lganda yoki kalitlarni maxsus tartiblash zarur bo'lganda yaxshi tanlovdir. Biroq, o'rtasidagi tanlov HashMapva TreeMapoxir-oqibat, dasturning o'ziga xos talablariga va saqlanadigan ma'lumotlarning tabiatiga bog'liq.

13. Java-dagi generiklar - bu ishlab chiquvchilarga har xil turlarda ishlashga qodir bo'lgan sinflar, interfeyslar va usullarni yaratishga imkon beruvchi xususiyat bo'lib, ular xavfsizlik turini yo'qotmasdan yoki aniq translyatsiyadan foydalanishni talab qilmaydi.

Java-dagi generiklarning asosiy maqsadi har bir tur uchun alohida dastur yozmasdan, har xil turlarda ishlatilishi mumkin bo'lgan qayta ishlatiladigan kodni yaratish usulini ta'minlashdir. Jeneriklardan foydalangan holda, ishlab chiquvchilar kompilyatsiya vaqtida turdagi xavfsizligini ta'minlagan holda yanada moslashuvchan va umumiy kod yozishlari mumkin.

Java-da generiklar burchakli qavslar ("<" va ">") yordamida aniqlangan va har qanday turni ifodalash uchun ishlatilishi mumkin bo'lgan turdagi parametrlar yordamida amalga oshiriladi. Misol uchun, quyidagi kod T tipi parametrini oladigan va shu turdagi namunani qaytaradigan yagona usulga ega bo'lgan umumiy sinfni belgilaydi:

umumiy sinf Box<T> {
    shaxsiy T qiymati;
    public void setValue (T qiymati) {
        this.value = qiymat;
    }
    umumiy T getValue() {
        qaytish qiymati;
    }
}

Bu ishlab chiquvchilarga , yoki Boxkabi har qanday turdagi qiymatlarni saqlay oladigan sinf misollarini yaratish imkonini beradi .Box<String>Box<Integer>Box<Double>

Jeneriklardan foydalanish, masalan, noto'g'ri turdagi ob'ektni usulga o'tkazish yoki ob'ektlarni noto'g'ri turga o'tkazishga urinish kabi keng tarqalgan xatolarning oldini olishga yordam beradi. Bu, shuningdek, kodni yaxshiroq qayta ishlatish imkonini beradi va yaxshi dizayn amaliyotlarini targ'ib qiladi, chunki u ishlab chiquvchilarni ko'proq modulli va umumiy kod yozishga undaydi.

Umuman olganda, Java-dagi generiklar ishlab chiquvchilarga turli xil kontekstlarda qayta ishlatilishi mumkin bo'lgan moslashuvchan va xavfsiz kod yaratish imkonini beruvchi kuchli xususiyatdir.