// 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
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)
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
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
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
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
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