// Yo'l xaritasi — Java Backend
Blok 1:
Java Core
JVM dan Stream API gacha — chuqur nazariy bilim
6 bo'lim
24 mavzu
80+ kichik tema
0 / 0 o'rganildi
⊞ Barchasini oч / yop
01
JVM Arxitekturasi
4 modul
ClassLoader
ClassLoader turlari va ierarxiyasi
Bootstrap ClassLoader — JDK core classlarni yuklaydi
Extension (Platform) ClassLoader — ext/ papkasidagi classlar
Application ClassLoader — classpath dagi classlar
Parent Delegation Model
Delegation qanday ishlaydi (yuqoriga so'raydi, pastga tushadi)
Nima uchun kerak? (security, consistency)
ClassNotFoundException vs NoClassDefFoundError farqi
Custom ClassLoader yozish
loadClass() vs findClass() — qaysinisini override qilish kerak
Hot reload qanday amalga oshiriladi
Real misol: Plugin tizimi (JAR dan class yuklash)
💡 Spring, Tomcat, OSGi — barchasi custom ClassLoader ishlatadi
Memory Areas (JVM xotira tuzilishi)
Heap xotira
Young Generation: Eden + Survivor S0/S1
Old Generation (Tenured) — uzoq yashaydigan objectlar
Object qanday Eden dan Old Gen ga ko'chadi (promotion)
-Xmx va -Xms flaglari nima qiladi
Stack, Metaspace, boshqalar
Stack — har bir thread uchun alohida, method frame nima
StackOverflowError qachon chiqadi
Metaspace — class metadata, Java 8 dan PermGen o'rniga
PC (Program Counter) Register
Native Method Stack
⚠️ Heap vs Stack: primitiv va reference qayerda saqlanadi?
Garbage Collection
🔥 muhim
GC Algoritmlari
Mark-Sweep: belgilash, tozalash, fragmentatsiya muammosi
Mark-Compact: tozalash + compaction (fragmentatsiya yo'q)
Copying algorithm: Eden → Survivor (Young Gen uchun)
GC Turlari — qaysi birini tanlash
Serial GC — kichik applar, single thread
Parallel GC — throughput uchun, default (Java 8)
G1 GC — region-based, low pause, default (Java 9+)
ZGC — ultra-low latency, < 1ms pause
Shenandoah GC — RedHat, concurrent compaction
GC Roots va Reachability
GC Roots nima: Stack variables, static fields, JNI refs
Strong, Soft, Weak, Phantom reference farqlari
WeakHashMap qachon ishlatiladi
Minor / Major / Full GC va Stop-the-World
Minor GC — faqat Young Gen, tez ishlaydi
Major GC — Old Gen, sekin
Full GC — hamma joy, eng sekin (production da xavfli)
Stop-the-World nima va nima uchun muammo
GC log o'qish: -Xlog:gc*
💡 Production da: GC pause > 200ms bo'lsa, muammo bor degani
JIT Compiler
Interpretation vs JIT compilation farqi
C1 (Client) compiler — tez ishga tushishi uchun
C2 (Server) compiler — asta, lekin kuchli optimizatsiya
Tiered Compilation (Java 8+) — C1 + C2 birgalikda
Method inlining — kichik metodlarni inline qilish
Escape Analysis — Stack allocation optimizatsiyasi
Warm-up muammosi — Spring Boot sekin ishga tushishi sababi
02
Java Memory Model (JMM)
3 modul
Visibility va Happens-Before
💜 qiyin
Visibility muammosi
CPU cache va main memory farqi
Thread A yozgan qiymatni Thread B ko'ra olmasligi
Real misol: boolean flag bilan infinite loop
Happens-Before qoidalari
Program order rule
Monitor lock rule (synchronized)
Volatile variable rule
Thread start/join rule
💡 Happens-before = "A dan keyin B bajariladigan kafolat"
volatile kalit so'zi
volatile nima kafolat beradi (visibility, not atomicity)
volatile nima kafolat bermaydi (i++ thread-safe emas)
Memory barrier (fence) nima
volatile vs synchronized — qachon qaysi birini ishlatish
Double-checked locking pattern (singleton)
Instruction Reordering
Compiler reordering nima uchun qiladi
CPU out-of-order execution
Reordering qanday buglarga olib keladi (real misol)
03
Generics
4 modul
Type Erasure
🔑 asosiy
Type erasure nima — compile time dan runtime gacha nima o'zgaradi
List<String> va List<Integer> runtime da bir xil
instanceof Generics bilan ishlamasligi sababi
Bridge methods nima (compiler yaratadi)
Wildcard va Bounded Types
PECS Prinsipi
Producer Extends: <? extends T> — faqat o'qish uchun
Consumer Super: <? super T> — faqat yozish uchun
Unbounded wildcard: <?> — faqat null qo'shish mumkin
Real misol: Collections.copy(dest, src) signature
💡 Collections.sort() da <? super T> nima uchun ishlatilgan?
Bounded Type Parameters
<T extends Comparable<T>> — T ni cheklash
Multiple bounds: <T extends A & B>
Recursive generic: <T extends Enum<T>>
Generic Methods va Raw Types
Generic method yozish: <T> T methodName()
Type inference — compiler T ni o'zi aniqlashi
Raw types nima va nima uchun xavfli (ClassCastException)
@SuppressWarnings("unchecked") — qachon va nima uchun
04
Collections Internals
5 modul
HashMap ichki tuzilishi
🔥 eng ko'p so'raladigan
put() operatsiyasi qanday ishlaydi
hashCode() → index hisoblash: (n-1) & hash
Collision: bir bucket da bir nechta element
Linked list (Java 7) vs TreeNode (Java 8+)
equals() va hashCode() birgalikda ishlashi
Rehashing va Treeify
Load factor 0.75 — nima uchun aynan shu qiymat
Rehashing: capacity * 2, barcha elementlarni qayta joylash
Treeify: 8 ta element → linked list → Red-Black Tree
Untreeify: 6 ta elementga tushsa, qayta listga
💡 initialCapacity to'g'ri berish rehashingni kamaytiradi → performance oshadi
Thread Safety muammosi
HashMap multi-thread da: infinite loop (Java 7) yoki data loss
Hashtable — synchronized, lekin sekin
ConcurrentHashMap — segment locking → CAS (Java 8)
List implementatsiyalari
ArrayList: dynamic array, add() O(1) amortized
ArrayList capacity oshishi: 1.5x (oldCapacity + oldCapacity >> 1)
LinkedList: doubly-linked, get(i) O(n) — ehtiyot bo'l
ArrayList vs LinkedList: qachon qaysinisini ishlatish
CopyOnWriteArrayList — write da copy qiladi, read thread-safe
Set va Map variantlari
LinkedHashMap: insertion order saqlanadi, LRU cache uchun
TreeMap: Red-Black Tree, sorted order, O(log n)
WeakHashMap: GC key ni o'chirishi mumkin (cache uchun)
EnumMap: enum key uchun, array-based, tez
TreeSet: sorted, NavigableSet imkoniyatlari
Queue va Deque
ArrayDeque — stack va queue uchun, LinkedList dan tez
PriorityQueue — min-heap asosida, O(log n) add/poll
BlockingQueue: ArrayBlockingQueue, LinkedBlockingQueue
offer() vs add(), poll() vs remove() farqi
05
Stream API
4 modul
Lazy Evaluation
🔑 asosiy
Intermediate operatsiyalar hech narsa qilmaydi (filter, map, flatMap)
Terminal operatsiya ishlaganda hamma narsa bajariladi (collect, forEach)
Short-circuit: findFirst(), anyMatch() — kerak bo'lganda to'xtaydi
Stream bir marta ishlatiladi — ikkinchi marta IllegalStateException
Operatsiyalar turlari
Intermediate: filter, map, flatMap, sorted, distinct, limit, skip
Terminal: collect, forEach, reduce, count, min, max, findFirst
flatMap vs map farqi — Stream<Stream<T>> ni yoyish
reduce() — akkumulator bilan yig'indi/mahsulot hisoblash
Collectors va Grouping
toList(), toSet(), toMap() — asosiylar
groupingBy() — Map<Key, List<T>> hosil qilish
partitioningBy() — true/false ga bo'lish
joining() — Stringlarni birlashtirish
counting(), summingInt(), averagingInt()
Custom Collector yozish — Collector.of()
Parallel Streams va Spliterator
parallelStream() — ForkJoinPool.commonPool() ishlatadi
Parallel stream qachon tezroq, qachon sekinroq
Spliterator — Collection ni parallel bo'limlarga ajratish
Thread-safe bo'lmagan operatsiyalar parallel da xavfli
⚠️ parallel() har doim tez emas! Kichik ma'lumotlarda overhead ko'p bo'ladi
06
Reflection & Annotations
4 modul
Reflection API
Class object olish: .class, getClass(), Class.forName()
getDeclaredMethods() vs getMethods() farqi
setAccessible(true) — private ga kirish
method.invoke() — runtime da method chaqirish
Constructor orqali object yaratish
Reflection ning kamchiligi: sekin, type-safety yo'q
Custom Annotation yaratish
Meta-annotatsiyalar
@Retention: SOURCE, CLASS, RUNTIME
@Target: METHOD, FIELD, TYPE, PARAMETER
@Inherited — subclassga o'tishi
@Repeatable — bir joyga bir necha marta
Runtime Annotation Processing
getAnnotation() bilan annotatsiya o'qish
isAnnotationPresent() tekshirish
Real misol: custom @Validate annotatsiyasi
💡 Spring @Autowired, @Transactional — barchasi shu mexanizm ustida
APT — Compile-time Processing
AbstractProcessor nima va qanday yoziladi
Lombok qanday ishlaydi (AST manipulation)
MapStruct — compile-time mapper generation
Runtime vs Compile-time: qaysi birini tanlash
MethodHandles va VarHandle
MethodHandles.lookup() — Reflection alternativi, tez
invokedynamic — lambda va String concatenation asosi
VarHandle — field ga atomic operatsiyalar
Reflection vs MethodHandles performance farqi