Java Collections Framework - Java’da obyektlar to‘plami bilan ishlash uchun tayyor kutubxona.
Oddiy qilib aytganda, bu:
ro‘yxat saqlash;
takrorlanmas qiymatlar saqlash;
kalit-qiymat ko‘rinishida data saqlash;
navbat bilan ishlash;
saralash;
qidirish;
aylanish;
uchun kerak bo‘ladigan tayyor class va interfacelar to‘plami.
Bu mavzu alohida bo‘lim sifatida berilgan: List, Set, Map, Queue, ArrayList vs LinkedList, HashSet, TreeSet, HashMap, TreeMap, Collections, Comparable, Comparator.
1. Nega Collections kerak?
Masalan, sizda foydalanuvchilar ro‘yxati bor:
String user1 = "Ali";
String user2 = "Vali";
String user3 = "Hasan";Bu yomon usul. Chunki foydalanuvchilar soni 3 ta emas, 3000 ta bo‘lishi mumkin.
Array ishlatsak:
String[] users = new String[3];
users[0] = "Ali";
users[1] = "Vali";
users[2] = "Hasan";Lekin array’da muammo bor:
hajmi oldindan beriladi;
element qo‘shish/noqulay;
o‘chirish/noqulay;
qidirish uchun tayyor imkoniyat kam;
real loyihalarda moslashuvchan emas.
Shuning uchun Java’da Collections Framework ishlatiladi.
List<String> users = new ArrayList<>();
users.add("Ali");
users.add("Vali");
users.add("Hasan");Bu ancha qulay.
2. Collection hierarchy oddiy ko‘rinishda
Java Collections ichida asosiy turlar:
Collection
├── List
├── Set
└── Queue
MapE’tibor bering: Map Collection ichiga kirmaydi, lekin Collections Framework’ning muhim qismi hisoblanadi.
3. List
List - tartibli ro‘yxat.
Asosiy xususiyatlari:
elementlar tartib bilan saqlanadi;
duplicate qiymatga ruxsat beradi;
index orqali murojaat qilish mumkin;
0dan boshlanadi.
Misol:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("Ali");
names.add("Vali");
names.add("Ali");
System.out.println(names);
}
}Natija:
[Ali, Vali, Ali]Bu yerda "Ali" ikki marta bor. List bunga ruxsat beradi.
3.1 List ichidan element olish
List<String> names = new ArrayList<>();
names.add("Ali");
names.add("Vali");
names.add("Hasan");
String firstName = names.get(0);
System.out.println(firstName);Natija:
Ali3.2 List ichidagi elementni o‘zgartirish
names.set(1, "Sardor");Oldin:
[Ali, Vali, Hasan]Keyin:
[Ali, Sardor, Hasan]3.3 List ichidan element o‘chirish
names.remove("Ali");Yoki index orqali:
names.remove(0);Ehtiyot bo‘lish kerak:
List<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.remove(1);Bu yerda 1 qiymatini emas, 1-indexdagi elementni o‘chiradi. Ya’ni 20 o‘chadi.
Agar qiymat bo‘yicha o‘chirmoqchi bo‘lsak:
numbers.remove(Integer.valueOf(10));4. ArrayList
ArrayList - List interface’ining eng ko‘p ishlatiladigan implementation’i.
Ichkarida array ishlatadi.
List<String> users = new ArrayList<>();ArrayList kuchli tomonlari:
index orqali tez o‘qiydi;
oddiy ro‘yxatlar uchun eng yaxshi default tanlov;
ko‘p holatda
Listkerak bo‘lsa,ArrayListishlatiladi.
Kamchiliklari:
o‘rtasidan element qo‘shish yoki o‘chirish sekinroq;
ichki array to‘lsa, yangi kattaroq array yaratadi va eski elementlarni ko‘chiradi.
5. LinkedList
LinkedList - elementlarni zanjir shaklida saqlaydi.
Har bir element keyingi va oldingi elementga link saqlaydi.
List<String> names = new LinkedList<>();LinkedList kuchli tomoni:
boshidan yoki o‘rtasidan qo‘shish/o‘chirish ayrim holatlarda qulay.
Kamchiliklari:
index orqali o‘qish sekin;
ko‘proq xotira ishlatadi;
real backend loyihalarda
ArrayListga qaraganda kamroq ishlatiladi.
5.1 ArrayList vs LinkedList
Holat | Yaxshiroq tanlov |
|---|---|
Ko‘p o‘qish kerak bo‘lsa |
|
Index orqali tez olish kerak bo‘lsa |
|
Oddiy ro‘yxat kerak bo‘lsa |
|
Boshidan ko‘p qo‘shish/o‘chirish bo‘lsa |
|
Queue sifatida ishlatilsa |
|
Junior uchun qoida:
Default holatda
ArrayListishlating.LinkedListni faqat aniq sabab bo‘lsa ishlating.
6. Set
Set - takrorlanmas qiymatlar to‘plami.
Asosiy xususiyatlari:
duplicate qiymat saqlamaydi;
index yo‘q;
tartib har doim kafolatlanmaydi.
Misol:
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<String> names = new HashSet<>();
names.add("Ali");
names.add("Vali");
names.add("Ali");
System.out.println(names);
}
}Natija taxminan:
[Vali, Ali]Ali ikki marta qo‘shildi, lekin faqat bittasi saqlandi.
7. HashSet
HashSet - Setning eng ko‘p ishlatiladigan implementation’i.
Kuchli tomoni:
tez qo‘shadi;
tez qidiradi;
duplicate qiymatlarni avtomatik olib tashlaydi.
Misol:
Set<Integer> ids = new HashSet<>();
ids.add(101);
ids.add(102);
ids.add(101);
System.out.println(ids);Natija:
[101, 102]Tartib kafolatlanmaydi.
8. LinkedHashSet
LinkedHashSet - duplicate qiymat saqlamaydi, lekin qo‘shilgan tartibni saqlaydi.
Set<String> names = new LinkedHashSet<>();
names.add("Ali");
names.add("Vali");
names.add("Hasan");
System.out.println(names);Natija:
[Ali, Vali, Hasan]Qachon kerak?
Masalan, siz duplicate’larni olib tashlamoqchisiz, lekin eski tartib saqlanib qolsin.
List<String> list = List.of("Ali", "Vali", "Ali", "Hasan");
Set<String> uniqueNames = new LinkedHashSet<>(list);
System.out.println(uniqueNames);Natija:
[Ali, Vali, Hasan]9. TreeSet
TreeSet - elementlarni saralangan holda saqlaydi.
Set<Integer> numbers = new TreeSet<>();
numbers.add(30);
numbers.add(10);
numbers.add(20);
System.out.println(numbers);Natija:
[10, 20, 30]String bilan:
Set<String> names = new TreeSet<>();
names.add("Vali");
names.add("Ali");
names.add("Hasan");
System.out.println(names);Natija:
[Ali, Hasan, Vali]TreeSet tartiblab beradi, lekin HashSetga qaraganda sekinroq bo‘lishi mumkin.
10. Map
Map - kalit va qiymat saqlaydi.
key -> valueMasalan:
username -> password
userId -> user
phone -> customerMisol:
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<Integer, String> users = new HashMap<>();
users.put(1, "Ali");
users.put(2, "Vali");
users.put(3, "Hasan");
System.out.println(users.get(1));
}
}Natija:
Ali10.1 Map’da key unique bo‘ladi
Map<Integer, String> users = new HashMap<>();
users.put(1, "Ali");
users.put(1, "Vali");
System.out.println(users);Natija:
{1=Vali}Bitta key ikki marta qo‘yildi. Eski qiymat yangisiga almashtirildi.
11. HashMap
HashMap - Mapning eng ko‘p ishlatiladigan implementation’i.
Kuchli tomoni:
key orqali tez topadi;
ko‘p real loyihalarda default tanlov;
cache, lookup, mapping uchun qulay.
Misol:
Map<String, Integer> productPrices = new HashMap<>();
productPrices.put("apple", 10_000);
productPrices.put("banana", 15_000);
Integer applePrice = productPrices.get("apple");
System.out.println(applePrice);Natija:
1000011.1 containsKey
if (productPrices.containsKey("apple")) {
System.out.println("Apple mavjud");
}Bu key bor-yo‘qligini tekshiradi.
11.2 getOrDefault
int price = productPrices.getOrDefault("orange", 0);
System.out.println(price);Agar "orange" key bo‘lmasa, 0 qaytaradi.
11.3 putIfAbsent
productPrices.putIfAbsent("apple", 20_000);Agar "apple" oldindan mavjud bo‘lsa, qiymatni almashtirmaydi.
12. LinkedHashMap
LinkedHashMap - HashMapga o‘xshaydi, lekin qo‘shilgan tartibni saqlaydi.
Map<Integer, String> users = new LinkedHashMap<>();
users.put(3, "Hasan");
users.put(1, "Ali");
users.put(2, "Vali");
System.out.println(users);Natija:
{3=Hasan, 1=Ali, 2=Vali}Qo‘shilgan tartib saqlanadi.
13. TreeMap
TreeMap - key bo‘yicha saralab saqlaydi.
Map<Integer, String> users = new TreeMap<>();
users.put(3, "Hasan");
users.put(1, "Ali");
users.put(2, "Vali");
System.out.println(users);Natija:
{1=Ali, 2=Vali, 3=Hasan}Qachon ishlatiladi?
keylar tartibli bo‘lishi kerak bo‘lsa;
range query kerak bo‘lsa;
eng kichik/eng katta key bilan ishlash kerak bo‘lsa.
14. Queue
Queue - navbat.
Birinchi kirgan birinchi chiqadi.
Ali -> Vali -> HasanBu FIFO deyiladi:
First In, First OutMisol:
Queue<String> queue = new LinkedList<>();
queue.add("Ali");
queue.add("Vali");
queue.add("Hasan");
System.out.println(queue.poll());
System.out.println(queue.poll());Natija:
Ali
Vali14.1 Queue methodlari
Method | Ma’nosi |
|---|---|
| Navbatga qo‘shadi, xato bo‘lsa exception |
| Navbatga qo‘shadi, xato bo‘lsa false |
| Birinchi elementni olib tashlab qaytaradi |
| Birinchi elementni ko‘rsatadi, lekin o‘chirmaydi |
Misol:
Queue<String> queue = new LinkedList<>();
queue.offer("Ali");
queue.offer("Vali");
System.out.println(queue.peek());
System.out.println(queue.poll());
System.out.println(queue.poll());Natija:
Ali
Ali
Vali15. ArrayDeque
Queue uchun ko‘p holatda ArrayDeque yaxshi tanlov.
Queue<String> queue = new ArrayDeque<>();
queue.offer("Ali");
queue.offer("Vali");
System.out.println(queue.poll());Junior uchun qoida:
Oddiy queue kerak bo‘lsa,
ArrayDequeishlating.
FaqatListham kerak bo‘lsa,LinkedListishlatish mumkin.
16. Collections utility class
Collections - collectionlar bilan ishlash uchun yordamchi class.
16.1 Sort qilish
List<Integer> numbers = new ArrayList<>();
numbers.add(30);
numbers.add(10);
numbers.add(20);
Collections.sort(numbers);
System.out.println(numbers);Natija:
[10, 20, 30]16.2 Reverse qilish
Collections.reverse(numbers);Natija:
[30, 20, 10]16.3 Min va max
int min = Collections.min(numbers);
int max = Collections.max(numbers);17. Comparable
Comparable - obyekt o‘zini qanday sort qilishni biladi.
Masalan, Userni age bo‘yicha sort qilamiz.
public class User implements Comparable<User> {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(User other) {
return Integer.compare(this.age, other.age);
}
@Override
public String toString() {
return name + " - " + age;
}
}Ishlatish:
List<User> users = new ArrayList<>();
users.add(new User("Ali", 25));
users.add(new User("Vali", 20));
users.add(new User("Hasan", 30));
Collections.sort(users);
System.out.println(users);Natija:
[Vali - 20, Ali - 25, Hasan - 30]Bu yerda sort age bo‘yicha bo‘ldi.
18. Comparator
Comparator - tashqaridan sort qilish qoidasi beriladi.
Masalan, name bo‘yicha sort:
users.sort((u1, u2) -> u1.getName().compareTo(u2.getName()));Buning uchun getName() kerak:
public String getName() {
return name;
}Yaxshiroq ko‘rinish:
users.sort(Comparator.comparing(User::getName));Age bo‘yicha:
users.sort(Comparator.comparing(User::getAge));Teskarisiga sort qilish:
users.sort(Comparator.comparing(User::getAge).reversed());19. Comparable vs Comparator
Tushuncha | Ma’nosi |
|---|---|
| Class o‘zining tabiiy sort tartibini belgilaydi |
| Tashqaridan sort qoidasi beriladi |
Misol:
Userdoim age bo‘yicha sort qilinsin desak -Comparable;ba’zida name, ba’zida age, ba’zida createdDate bo‘yicha sort kerak bo‘lsa -
Comparator.
Real loyihalarda Comparator ko‘proq moslashuvchan.
20. Real backend misol
Tasavvur qiling, productlar ro‘yxati bor.
public class Product {
private Long id;
private String name;
private int price;
public Product(Long id, String name, int price) {
this.id = id;
this.name = name;
this.price = price;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
}Productlarni id bo‘yicha tez topish kerak bo‘lsa:
Map<Long, Product> productMap = new HashMap<>();
Product product = new Product(1L, "Laptop", 500);
productMap.put(product.getId(), product);
Product found = productMap.get(1L);Bu real backend’da juda ko‘p uchraydi.
Masalan:
Map<Long, User> usersById;
Map<String, User> usersByPhone;
Map<String, Product> productsByCode;
Set<Long> blockedUserIds;
List<Order> orders;21. Qaysi collectionni qachon ishlatamiz?
Vaziyat | Collection |
|---|---|
Oddiy ro‘yxat kerak |
|
Duplicate bo‘lmasin |
|
Duplicate bo‘lmasin, tartib saqlansin |
|
Duplicate bo‘lmasin, sort bo‘lsin |
|
Key-value kerak |
|
Key-value, tartib saqlansin |
|
Key-value, key bo‘yicha sort kerak |
|
Navbat kerak |
|
Stack kabi ishlatish kerak |
|
22. Eng ko‘p ishlatiladiganlari
Junior backend uchun eng keraklilari:
List
ArrayList
Set
HashSet
Map
HashMap
Comparator
CollectionsKeyinroq:
LinkedHashMap
TreeMap
Queue
ArrayDeque
TreeSetKamroq:
LinkedList
Vector
Stack
HashtableVector, Stack, Hashtable eski classlar. Yangi kodda kam ishlatiladi.
23. Juniorlar qiladigan xatolar
Xato 1: ArrayList o‘rniga hamma joyda LinkedList ishlatish
Ko‘p holatda ArrayList yaxshiroq.
Xato 2: HashMap.get() null qaytarishini unutish
User user = users.get(10L);
user.getName();Agar user topilmasa, NullPointerException bo‘ladi.
Yaxshiroq:
User user = users.get(10L);
if (user != null) {
System.out.println(user.getName());
}Xato 3: Set tartibini kutish
Set<String> names = new HashSet<>();HashSet tartibni kafolatlamaydi.
Tartib kerak bo‘lsa:
Set<String> names = new LinkedHashSet<>();Xato 4: Objectlarda equals() va hashCode() yozmaslik
Masalan:
Set<User> users = new HashSet<>();Agar User classida equals() va hashCode() noto‘g‘ri bo‘lsa, duplicate muammosi chiqadi.
Bu alohida muhim mavzu.
24. Kichik amaliy mashq
Vazifa: Student Management
Student class yarating:
public class Student {
private Long id;
private String name;
private int age;
private int score;
}Quyidagilarni bajaring:
List<Student>yarating.5 ta student qo‘shing.
Studentlarni
scorebo‘yicha kamayish tartibida sort qiling.Studentlarni
agebo‘yicha o‘sish tartibida sort qiling.Map<Long, Student>yarating.Studentlarni
idbo‘yicha mapga joylang.Bitta studentni
idorqali toping.Duplicate name’larni
Set<String>orqali olib tashlang.
25. Xulosa
Java Collections Framework - Java developer uchun eng muhim mavzulardan biri.
Asosiy eslab qolish kerak:
List- tartibli ro‘yxat;Set- duplicate yo‘q;Map- key-value;Queue- navbat;ArrayList- default ro‘yxat tanlovi;HashSet- unique qiymatlar uchun;HashMap- key orqali tez topish uchun;Comparator- sort qilish uchun.