Java asoslari 7-qism. Java Collections Framework

30.06.2026 | Muallif: Jaxongir a.k.a | Kategoriya: Java tili | 21 daqiqa o'qish

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

Map

E’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;

  • 0 dan 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:

Ali

3.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 List kerak bo‘lsa, ArrayList ishlatiladi.

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

ArrayList

Index orqali tez olish kerak bo‘lsa

ArrayList

Oddiy ro‘yxat kerak bo‘lsa

ArrayList

Boshidan ko‘p qo‘shish/o‘chirish bo‘lsa

LinkedList

Queue sifatida ishlatilsa

LinkedList yoki ArrayDeque

Junior uchun qoida:

Default holatda ArrayList ishlating. 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 -> value

Masalan:

username -> password
userId   -> user
phone    -> customer

Misol:

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:

Ali

10.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:

10000

11.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 -> Hasan

Bu FIFO deyiladi:

First In, First Out

Misol:

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
Vali

14.1 Queue methodlari

Method

Ma’nosi

add()

Navbatga qo‘shadi, xato bo‘lsa exception

offer()

Navbatga qo‘shadi, xato bo‘lsa false

poll()

Birinchi elementni olib tashlab qaytaradi

peek()

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
Vali

15. 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, ArrayDeque ishlating.
Faqat List ham kerak bo‘lsa, LinkedList ishlatish 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

Comparable

Class o‘zining tabiiy sort tartibini belgilaydi

Comparator

Tashqaridan sort qoidasi beriladi

Misol:

  • User doim 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

ArrayList

Duplicate bo‘lmasin

HashSet

Duplicate bo‘lmasin, tartib saqlansin

LinkedHashSet

Duplicate bo‘lmasin, sort bo‘lsin

TreeSet

Key-value kerak

HashMap

Key-value, tartib saqlansin

LinkedHashMap

Key-value, key bo‘yicha sort kerak

TreeMap

Navbat kerak

ArrayDeque

Stack kabi ishlatish kerak

ArrayDeque


22. Eng ko‘p ishlatiladiganlari

Junior backend uchun eng keraklilari:

List
ArrayList
Set
HashSet
Map
HashMap
Comparator
Collections

Keyinroq:

LinkedHashMap
TreeMap
Queue
ArrayDeque
TreeSet

Kamroq:

LinkedList
Vector
Stack
Hashtable

Vector, 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:

  1. List<Student> yarating.

  2. 5 ta student qo‘shing.

  3. Studentlarni score bo‘yicha kamayish tartibida sort qiling.

  4. Studentlarni age bo‘yicha o‘sish tartibida sort qiling.

  5. Map<Long, Student> yarating.

  6. Studentlarni id bo‘yicha mapga joylang.

  7. Bitta studentni id orqali toping.

  8. 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.