{
  "assessmentTests": {
    "java_test": {
      "name": "Java Testi",
      "desc": "Asosiy sintaksis va turlar, metodlar/overloading/scope, koleksiyalar/generikalar/kontrol oqimi, va istisnolar/concurrency boʻyicha 30 ta stsenariyli savol — Java bilimingiz ish eʼlonidagi \"kuchli Java\" degani bilan mos keladimi, bilib oling.",
      "recommendation": "Sizning Java koʻnikmalari profili",
      "results": {
        "beginner": {
          "name": "Boshlangiches",
          "desc": "Siz ishlaydigan klass va metodlar yoza olasiz, lekin xato qilgan savollaringiz sintaksisga emas, koʻproq identifikatsiya va standart qiymatlarga toʻplangan — String uchun == va .equals farqi, nega new String(\"x\") hech qachon string poolni qayta ishlatmaydi, sonli maydon bilan wrapper maydonning standart qiymati qanday farq qilishi. Bu Java-ni yomon bilishingiz degani emas; bular tilni sinov-xato yoʻli bilan oʻrgangan odamlarni chalgʻitadigan aniq qoidalar, chunki ular havolalar va primitivlarning ichki ishlash mexanizmidan kelib chiqmaydi. Bular ishda muhim, chunki har biri kod kompilyatsiya boʻladigan, ishga tushadigan, ammo sezdirmasdan notoʻgʻri natija beradigan joydir.",
          "recommendation": "Shu tartibda uchta narsadan boshlang: nega ikkita String obyektida == belgilarni emas, havolalarni solishtiradi (va deyarli har doim .equals kerak boʻladi), int overflow qanday qilib xatolik tashlamasdan jimgina aylanib ketishi, va nega ishga tushirilmagan Integer maydoni null, int maydoni esa 0 boʻlib qoladi. Oracle-ning rasmiy Java qoʻllanmalari va Baeldung uchalasini ham ishlaydigan misollar bilan tushuntiradi."
        },
        "intermediate": {
          "name": "Oʻrta daraja",
          "desc": "Kundalik amaliy kodni bemalol boshqarasiz — klasslar, koleksiyalar, oddiy kontrol oqimi — va oddiy feature ishi sizni sekinlashtirmaydi. Advanced darajasigacha boʻlgan farq asosan Java qoidalari concurrency va generikalar bilan toʻqnashganda yuzaga keladi: static metodning kutilgan obyekt emas, eʼlon qilingan tur boʻyicha aniqlanishi, sizni sezmasdan tayangan HashMap iteratsiya tartibi, tsikl ichida elementni oʻchirishdan kelib chiqadigan ConcurrentModificationException. Bular tezkor koʻrikdan oʻtib ketadigan, faqat maʼlum bir runtime sharoitida namoyon boʻladigan xato turlari.",
          "recommendation": "Kompilyatorning kodingizga statik nuqtai nazari bilan aslida ishga tushadigan narsa oʻrtasidagi farqqa eʼtibor bering: overload resolution va static metodlarning runtime turi emas, eʼlon qilingan tur boʻyicha yashiringan boʻlishi, nega HashMap hech qanday iteratsiya tartibi kafolatini bermasligi, va nega roʻyxatni iteratsiya qilayotganda toʻgʻridan-toʻgʻri oʻzgartirish ConcurrentModificationException tashlashi. Keyin generics erasure-ga oʻting, chunki bu koleksiyalarni alohida-alohida bilgan odamlarni ham chalgʻitadi."
        },
        "advanced": {
          "name": "Ilg'or",
          "desc": "Bu koʻpchilik ish eʼlonlari \"kuchli Java\" deganda nazarda tutadigan daraja. Siz static bloklar, instance bloklar va bir nechta konstruktorga ega klassni oʻqib, ularning aniq qaysi tartibda ishga tushishini bashorat qila olasiz, finally blokining try blokining qaytarish qiymatini sezdirmasdan bekor qilishi mumkinligini bilasiz, va qoʻlda finally-close yozish oʻrniga try-with-resources-ni tanlaysiz, chunki u beradigan tartib kafolatini bilasiz. Bu darajani eng yuqorisidan ajratib turadigan narsa — concurrency va interfeys darajasidagi ishlar: synchronized aslida nimani lock qilishi, volatile nimani kafolatlab, nimani kafolatlamasligi, va default-metod ziddiyatlari qanday hal qilinishi.",
          "recommendation": "Boshqa threadlar va boshqa interfeyslar ham tegadigan kodni himoya qiladigan qismlarga chuqurroq kiring: synchronized instance metodi nimani lock qilishi bilan synchronized static metodi nimani lock qilishi oʻrtasidagi farq, nega volatile faqat visibility berib, counter++ uchun atomiklikni bermasligi, va Java default-metod diamond muammosini qoʻlda hal qilishni qanday majbur qilishi. Baeldung va \"Java Concurrency in Practice\" kitobining Java Memory Model boʻyicha materiallari ikkalasi uchun ham tabiiy keyingi qadamdir."
        },
        "expert": {
          "name": "Mutaxassis",
          "desc": "Siz har bir boʻlimda eng yuqori ballga erishdingiz — asosiy sintaksis va turlar, OOP mexanikasi va scope, koleksiyalar va generikalar, hamda istisnolar, concurrency va idiomalar. Amalda bu shuni bildiradiki, sizga notanish odamning klassi berilsa, kompilyatsiya xatosi, runtime istisnosi yoki sezdirmasdan notoʻgʻri qiymat nega yuzaga kelishini tushuntira olasiz — sintaksis nima qilishi kerakligini aytishdan koʻra qiyinroq va qimmatliroq koʻnikma shu. Bu darajada tilning oʻzi kamdan-kam cheklovchi omil boʻladi; chegara odatda concurrency dizayni yoki uning ostidagi maʼlumot tuzilishidir.",
          "recommendation": "Endi foyda dizayn va diagnostikada: hang holatini deadlock deb hisoblashdan oldin thread dump-ni oʻqish, synchronized, java.util.concurrent lock-lari va atomiklar orasida standart tanlov emas, balki oʻzaro kelishuv sifatida tanlov qilish, va stream-pipeline-ni tasodifan emas, ataylab lazy qolishi uchun loyihalash. Agar rolga screening qilinayotgan boʻlsangiz, Java xususiyatlarining nomini aytish oʻrniga, production-da topgan happens-before xatosi yoki ConcurrentModificationException kabi concurrency xatosini tasvirlab bering — bu faqat lugʻatni emas, fikrlashni namoyish qiladi."
        }
      },
      "questions": [
        {
          "question": "Ikkita String obyekti yaratasiz: String a = new String(\"cat\"); String b = new String(\"cat\"); a == b nimaga teng boʻladi?",
          "options": [
            {
              "icon": "",
              "label": "true — bir xil belgilardan iborat String literallari har doim bitta obyekt hisoblanadi"
            },
            {
              "icon": "",
              "label": "true — new String(...) string pooldan qayta foydalanadi, shuning uchun bir xil matn har doim bitta obyektni bahamiga oladi"
            },
            {
              "icon": "",
              "label": "Kompilyatsiya xatosi — == String obyektlarini solishtirish uchun ishlatilmaydi"
            },
            {
              "icon": "",
              "label": "false — new String(...) har doim heap-da yangi obyekt ajratadi, shuning uchun == ikkita turli havolani solishtiradi, garchi .equals(b) true qaytarsa ham"
            }
          ]
        },
        {
          "question": "Integer x = 100; Integer y = 100; System.out.println(x == y); keyin Integer x2 = 200; Integer y2 = 200; System.out.println(x2 == y2); Ikkala qator nima chop etadi?",
          "options": [
            {
              "icon": "",
              "label": "true, keyin true — autobox qilingan Integer obyektlari qiymatidan qatʼi nazar har doim keshlanadi"
            },
            {
              "icon": "",
              "label": "false, keyin false — Integer obyektlarida == har doim havolani solishtiradi, shuning uchun teng qiymatlar hech qachon mos kelmaydi"
            },
            {
              "icon": "",
              "label": "true, keyin false, lekin faqat 200 bayt chegarasidan oshgani uchun — kesh chegarasi -128..127 bilan bogʻliq emas"
            },
            {
              "icon": "",
              "label": "true, keyin false — -128 dan 127 gacha boʻlgan autobox qilingan Integer qiymatlari keshlanadi va baham koʻriladi, shuning uchun 100 bitta obyektni qayta ishlatadi, lekin 200 kesh chegarasidan tashqarida qolib, ikkita alohida obyektga autobox qilinadi"
            }
          ]
        },
        {
          "question": "int max = Integer.MAX_VALUE; System.out.println(max + 1); Nima sodir boʻladi?",
          "options": [
            {
              "icon": "",
              "label": "Integer overflow uchun ArithmeticException tashlaydi"
            },
            {
              "icon": "",
              "label": "Integer.MAX_VALUE-ni yana chop etadi, chunki Java turning maksimal qiymatida toʻxtatib qoladi"
            },
            {
              "icon": "",
              "label": "Integer.MIN_VALUE-ni chop etadi — int arifmetikasi overflow paytida xatolik tashlash oʻrniga sezdirmasdan aylanib ketadi"
            },
            {
              "icon": "",
              "label": "Kompilyatsiya xatosi — kompilyator overflow-ni oldindan aniqlaydi"
            }
          ]
        },
        {
          "question": "System.out.println(0.1 + 0.2 == 0.3); Bu nima chop etadi va nega?",
          "options": [
            {
              "icon": "",
              "label": "false — 0.1, 0.2 va 0.3 ikkilik floating point-da aniq ifodalanmaydi, shuning uchun yigʻindida yumaloqlash xatosi boʻladi va u 0.3 bilan bit-baʼbit teng boʻlmaydi"
            },
            {
              "icon": "",
              "label": "true — Java solishtirishdan oldin double arifmetikasini eng yaqin ifodalanadigan oʻnlik songa yumaloqlaydi"
            },
            {
              "icon": "",
              "label": "true — ikkita double qoʻshilishi ikki xonali oʻnlik qiymatlar uchun har doim aniq boʻladi"
            },
            {
              "icon": "",
              "label": "Istisno tashlaydi, chunki Java-da double uchun == aniqlanmagan"
            }
          ]
        },
        {
          "question": "Klass ikkita instance maydonini initsializatorsiz eʼlon qiladi: int count; va Integer total; Konstruktor ishga tushishidan oldin ularning standart qiymatlari qanday boʻladi?",
          "options": [
            {
              "icon": "",
              "label": "Ikkalasi ham 0 ga teng, chunki Integer maydon initsializatsiyasida int-ga autobox qilinadi"
            },
            {
              "icon": "",
              "label": "count 0, total esa birinchi marta oʻqilganda avtomatik box qilinib 0 boʻladi"
            },
            {
              "icon": "",
              "label": "count 0, total esa null — primitiv sonli maydonlar standart holda nolga teng boʻladi, lekin ishga tushirilmagan wrapper havola maydoni boshqa har qanday obyekt havolasi kabi null boʻlib qoladi"
            },
            {
              "icon": "",
              "label": "Aniq qiymat berilmaguncha ikkalasi ham null boʻladi, chunki Java-da yashirin sonli standart qiymatlar yoʻq"
            }
          ]
        },
        {
          "question": "Tsikl 1000 marta ishga tushadi, har safar String result ustida result += \"x\"; bajaradi. Har bir iteratsiyada aslida nima sodir boʻladi?",
          "options": [
            {
              "icon": "",
              "label": "Mavjud String obyektining ichki belgilar massivi joyida kengaytiriladi"
            },
            {
              "icon": "",
              "label": "Java birlashtirishlarni avtomatik ravishda toʻplab, faqat bitta yakuniy String obyekti ajratadi"
            },
            {
              "icon": "",
              "label": "Bu barcha 1000 ta iteratsiya uchun umumiy boʻlgan bitta StringBuilder.append() chaqiruviga kompilyatsiya qilinadi, har bir iteratsiyada qoʻshimcha obyekt ajratilmaydi"
            },
            {
              "icon": "",
              "label": "Har safar yangi String obyekti yaratiladi va result shu obyektga qayta yoʻnaltiriladi — oldingi String obyekti tashlab yuboriladi, chunki String oʻzgarmas (immutable) va += uni joyida oʻzgartira olmaydi"
            }
          ]
        },
        {
          "question": "final List<String> names = new ArrayList<>(); Quyidagilardan qaysi biri toʻgʻri?",
          "options": [
            {
              "icon": "",
              "label": "names.add(\"Ana\") kompilyatsiya qilinadi va toʻgʻri ishlaydi — final faqat names havolasining oʻzini qayta tayinlashning oldini oladi, u koʻrsatib turgan obyektni oʻzgartirishning emas"
            },
            {
              "icon": "",
              "label": "names.add(\"Ana\") kompilyatsiya xatosi, chunki final roʻyxatning oʻzini oʻzgartirib boʻlmaydigan qiladi"
            },
            {
              "icon": "",
              "label": "final deb eʼlon qilingani uchun roʻyxat concurrent yozishlar uchun thread-safe hisoblanadi"
            },
            {
              "icon": "",
              "label": "Lokal oʻzgaruvchida final hech qanday taʼsir koʻrsatmaydi, agar tur ham oʻzgarmas deb eʼlon qilinmagan boʻlsa"
            }
          ]
        },
        {
          "question": "int[] a = {1, 2, 3}; int[] b = {1, 2, 3}; System.out.println(a == b); System.out.println(Arrays.equals(a, b)); Ikkala qator nima chop etadi?",
          "options": [
            {
              "icon": "",
              "label": "false, keyin true — == massiv havolalarini solishtiradi (ikkita turli massiv obyekti), Arrays.equals esa elementlarni solishtiradi"
            },
            {
              "icon": "",
              "label": "true, keyin true — Java-da bir xil mazmunga ega massivlar bitta obyekt hisoblanadi"
            },
            {
              "icon": "",
              "label": "false, keyin false — Arrays.equals faqat obyekt massivlari uchun ishlaydi, primitiv int massivlari uchun emas"
            },
            {
              "icon": "",
              "label": "true, keyin false — massivlarda == mazmunni solishtiradi va Arrays.equals ortiqcha"
            }
          ]
        },
        {
          "question": "void show(Object o) { print(\"Object\"); } void show(String s) { print(\"String\"); } Object ref = \"hello\"; show(ref); Qaysi overload ishga tushadi va nega?",
          "options": [
            {
              "icon": "",
              "label": "show(String) ishga tushadi, chunki Java overload-ni tanlashdan oldin obyektning haqiqiy runtime klassini tekshiradi"
            },
            {
              "icon": "",
              "label": "show(Object) ishga tushadi — overload resolution kompilyatsiya vaqtida oʻzgaruvchining eʼlon qilingan turi asosida hal qilinadi, u koʻrsatayotgan obyektning haqiqiy runtime turi asosida emas"
            },
            {
              "icon": "",
              "label": "Kompilyatsiya xatosi — aniqroq overload mavjud boʻlgan joyga Object uzatib boʻlmaydi"
            },
            {
              "icon": "",
              "label": "Ikkala metod ham bir martadan ishga tushadi, chunki Java har bir mos kelishni sinab koʻrib overload-larni hal qiladi"
            }
          ]
        },
        {
          "question": "Base klassida static void greet() { print(\"Base\"); } bor. Derived klassi Base-dan extends qiladi va shuningdek static void greet() { print(\"Derived\"); } eʼlon qiladi. Siz shunday yozasiz: Base ref = new Derived(); ref.greet(); Nima chop etiladi?",
          "options": [
            {
              "icon": "",
              "label": "Derived — static metodlar ham xuddi instance metodlar kabi override qilinadi, obyektning haqiqiy runtime turiga ergashadi"
            },
            {
              "icon": "",
              "label": "Kompilyatsiya xatosi — static metodlarni instance havolasi orqali chaqirib boʻlmaydi"
            },
            {
              "icon": "",
              "label": "Base — static metodlar polimorf emas; havola orqali chaqirilganda bu havolaning eʼlon qilingan turi boʻyicha kompilyatsiya vaqtida hal qilinadi, obyektning haqiqiy turi boʻyicha emas"
            },
            {
              "icon": "",
              "label": "Ham Base, ham Derived chop etiladi, chunki chaqiruv ham yashiringan, ham yashiruvchi versiyaga hal qilinadi"
            }
          ]
        },
        {
          "question": "Metod ichida int count = 0; deb yozasiz, keyin boshqa metodga uzatilgan lambda ichidan count-ga murojaat qilishga harakat qilasiz. Bu kompilyatsiya qilinishi uchun count haqida nima toʻgʻri boʻlishi kerak?",
          "options": [
            {
              "icon": "",
              "label": "count effectively final boʻlishi kerak — dastlabki qiymatidan keyin hech qayerda qayta tayinlanmasligi kerak — chunki lambda oʻzgaruvchan lokal oʻzgaruvchiga jonli havolani emas, balki uning bir lahzalik holatini (snapshot) tutib oladi"
            },
            {
              "icon": "",
              "label": "Hech narsa — lambda ichidan istalgan lokal oʻzgaruvchini erkin oʻqish va qayta tayinlash mumkin"
            },
            {
              "icon": "",
              "label": "Lambda har doim eng oxirgi qiymatni koʻrishi uchun count volatile deb eʼlon qilinishi kerak"
            },
            {
              "icon": "",
              "label": "count lokal oʻzgaruvchi emas, maydon boʻlishi kerak — lambdalar lokal oʻzgaruvchilarni umuman tuta olmaydi"
            }
          ]
        },
        {
          "question": "void rename(StringBuilder sb) { sb = new StringBuilder(\"new\"); } quyidagicha chaqiriladi: StringBuilder original = new StringBuilder(\"old\"); rename(original); Chaqiruvdan keyin original nimaga teng?",
          "options": [
            {
              "icon": "",
              "label": "\"new\" boʻlib qoladi — Java-da obyektlar havola orqali uzatiladi, shuning uchun parametrni qayta tayinlash chaqiruvchining oʻzgaruvchisini ham oʻzgartiradi"
            },
            {
              "icon": "",
              "label": "Faqat StringBuilder kabi oʻzgaruvchan (mutable) turlar uchun \"new\" boʻlib qoladi, oʻzgarmas turlar uchun esa yoʻq"
            },
            {
              "icon": "",
              "label": "Hali ham \"old\" — Java havolaning oʻzini qiymat boʻyicha uzatadi, shuning uchun metod ichida parametrni qayta tayinlash faqat havolaning lokal nusxasini boshqa joyga yoʻnaltiradi, chaqiruvchining original oʻzgaruvchisi oʻzgarmay qoladi"
            },
            {
              "icon": "",
              "label": "Runtime istisnosi tashlaydi, chunki sb metod ichida qayta tayinlangan"
            }
          ]
        },
        {
          "question": "Klassda static initializer blok, instance initializer blok va konstruktor mavjud, aynan shu manba tartibida. Shu klassdan ketma-ket ikkita obyekt yaratasiz. Ular qaysi tartibda ishga tushadi?",
          "options": [
            {
              "icon": "",
              "label": "Static blok klass birinchi marta yuklanganda aynan bir marta ishga tushadi; keyin har bir obyekt uchun avval instance blok, soʻng konstruktor tanasi ishga tushadi"
            },
            {
              "icon": "",
              "label": "Har bir yaratilgan obyekt uchun uchalasi ham manba tartibida, qaytadan ishga tushadi"
            },
            {
              "icon": "",
              "label": "Har bir obyekt uchun avval konstruktor, keyin instance blok, va eng oxirida bir marta static blok ishga tushadi"
            },
            {
              "icon": "",
              "label": "Static blok har bir obyekt uchun bir marta, instance blokdan aynan oldin ishga tushadi"
            }
          ]
        },
        {
          "question": "Klassda void log(String s) va void log(String... args) bor. Siz log(\"hi\") deb chaqirasiz. Qaysi biri ishga tushadi?",
          "options": [
            {
              "icon": "",
              "label": "log(String... args) — ikkalasi ham mos kelganda varargs overload doim ustunlik qiladi"
            },
            {
              "icon": "",
              "label": "Kompilyatsiya xatosi — chaqiruv ikkala overload orasida noaniq (ambiguous)"
            },
            {
              "icon": "",
              "label": "log(String s) — qatʼiy sonli (fixed-arity) overload aniq mos kelganda, Java uni doim varargs overload-dan ustun qoʻyadi, varargs esa faqat oxirgi chora sifatida ishlatiladi"
            },
            {
              "icon": "",
              "label": "Manba faylida birinchi eʼlon qilingani ishga tushadi"
            }
          ]
        },
        {
          "question": "Konstruktorning birinchi qatori shu klassdagi boshqa konstruktorga delegatsiya qilish uchun this(0); ni chaqiradi. Bu qayerda joylashishiga ruxsat berilgan?",
          "options": [
            {
              "icon": "",
              "label": "Obyekt qaytarilishidan oldin ishga tushsa, konstruktor tanasining istalgan joyida"
            },
            {
              "icon": "",
              "label": "Faqat konstruktorning aynan birinchi operatori sifatida — this() (yoki super()) birinchi qator boʻlishi shart, va konstruktor this() bilan super()-ni ikkalasini birdek chaqira olmaydi"
            },
            {
              "icon": "",
              "label": "Faqat oxirgi operator sifatida, barcha maydon initsializatsiyasi tugagandan keyin"
            },
            {
              "icon": "",
              "label": "Faqat delegate kalit soʻzi bilan aniq belgilangan delegatsiya konstruktorlarida"
            }
          ]
        },
        {
          "question": "Sizga elementlari juda tez-tez oldiga qoʻshiladigan, tasodifiy-kirish (random-access) oʻqishlari esa kamdan-kam boʻladigan roʻyxat kerak. Qaysi biri strukturaviy jihatdan yaxshiroq mos keladi va nega?",
          "options": [
            {
              "icon": "",
              "label": "ArrayList — uning uzluksiz backing massivi barcha amallarni, jumladan oldiga qoʻshishni ham, bogʻlangan strukturaga qaraganda tezroq qiladi"
            },
            {
              "icon": "",
              "label": "Ikkalasi ham bir xil ishlaydi, chunki ikkalasi ham List interfeysini bir xil vaqt kafolatlari bilan implement qiladi"
            },
            {
              "icon": "",
              "label": "LinkedList — oldiga qoʻshish O(1), chunki u faqat bitta node-ni qayta bogʻlaydi, ArrayList esa mavjud har bir elementni bittaga siljitishi kerak, shuning uchun oldiga qoʻshish O(n) boʻladi"
            },
            {
              "icon": "",
              "label": "LinkedList, chunki u random-access-ni O(1) da qoʻllab-quvvatlaydi, ArrayList esa yoʻq"
            }
          ]
        },
        {
          "question": "Oddiy HashMap-ga aniq tartibda beshta yozuvni kiritasiz, keyin uni for-each tsikli bilan iteratsiya qilasiz. Yozuvlar qaysi tartibda chiqadi?",
          "options": [
            {
              "icon": "",
              "label": "Yozuvlar kiritilgan xuddi shu tartibda, chunki Java map-lari har doim kiritish tartibini saqlaydi"
            },
            {
              "icon": "",
              "label": "Umuman kafolatlangan tartib yoʻq — HashMap-ning iteratsiya tartibi hash bucket joylashuviga bogʻliq, kiritish tartibiga emas, va hatto ishga tushirishlar orasida oʻzgarishi mumkin; kiritish tartibini saqlaydigani LinkedHashMap"
            },
            {
              "icon": "",
              "label": "TreeMap kabi, kalit boʻyicha avtomatik saralangan"
            },
            {
              "icon": "",
              "label": "Kiritish tartibiga teskari, chunki HashMap ichki tomondan stack ishlatadi"
            }
          ]
        },
        {
          "question": "Oddiy java.util.HashMap bir vaqtning oʻzida nechta null kalitni va nechta null qiymatni saqlashi mumkin?",
          "options": [
            {
              "icon": "",
              "label": "Hech qanday Map implementatsiyasida null kalit ham, null qiymat ham hech qachon ruxsat etilmaydi"
            },
            {
              "icon": "",
              "label": "Koʻpi bilan bitta null kalit va istalgan sondagi null qiymat — HashMap bitta null kalitga ruxsat beradi, Hashtable esa ikkalasiga ham ruxsat bermaydi"
            },
            {
              "icon": "",
              "label": "Cheksiz null kalit va cheksiz null qiymat, chunki null boshqa har qanday kalit kabi koʻriladi"
            },
            {
              "icon": "",
              "label": "Koʻpi bilan bitta null kalit va bitta null qiymat, ikkalasi ham bittaga cheklangan"
            }
          ]
        },
        {
          "question": "Siz List-ni for-each tsikli bilan iteratsiya qilasiz va tsikl tanasi ichidan roʻyxatning oʻzida bevosita list.remove(item) chaqirasiz, baʼzi elementlarda, hammasida emas. Nima sodir boʻladi?",
          "options": [
            {
              "icon": "",
              "label": "Toʻgʻri ishlaydi va aynan moʻljallangan elementlarni oʻchiradi"
            },
            {
              "icon": "",
              "label": "Oʻchirilgan elementdan keyingisini sezdirmasdan oʻtkazib yuboradi, lekin aks holda xatosiz tugaydi"
            },
            {
              "icon": "",
              "label": "Tsikl roʻyxatning eski oʻlchamiga yetganda IndexOutOfBoundsException tashlaydi"
            },
            {
              "icon": "",
              "label": "ConcurrentModificationException tashlaydi — yashirin iterator roʻyxat boʻylab yurayotganda uning strukturasini bevosita oʻzgartirish aniqlanadi va rad etiladi; buning oʻrniga Iterator.remove() ishlatilishi kerak"
            }
          ]
        },
        {
          "question": "Runtime-da, List<String> list berilganda, uning generic tur parametri haqida reflection yoki instanceof orqali aslida nimani aniqlay olasiz?",
          "options": [
            {
              "icon": "",
              "label": "Runtime-da String.class-ni olish uchun list.getElementType() ni chaqirishingiz mumkin"
            },
            {
              "icon": "",
              "label": "instanceof List<String> kompilyatsiya qilinadi va element turini toʻgʻri tekshiradi"
            },
            {
              "icon": "",
              "label": "JVM tur parametrini list.getGenericType() orqali kirish mumkin boʻlgan yashirin metamaʼlumot sifatida saqlaydi"
            },
            {
              "icon": "",
              "label": "Hech narsa — generic tur maʼlumoti kompilyatsiya vaqtida oʻchiriladi (erasure), shuning uchun runtime-da obyekt oddiy List, va uning List<String> yoki List<Integer> deb eʼlon qilinganini qayta tiklashning iloji yoʻq"
            }
          ]
        },
        {
          "question": "switch (day) { case 1: case 2: print(\"Weekday\"); break; case 6: print(\"Saturday\"); case 7: print(\"Sunday\"); break; default: print(\"?\"); } Agar day 6 boʻlsa, nima chop etiladi?",
          "options": [
            {
              "icon": "",
              "label": "Faqat Saturday — switch-dagi har bir case bloki oʻzining print operatoridan keyin har doim toʻxtaydi"
            },
            {
              "icon": "",
              "label": "Faqat Sunday — moslik case 6 dan boshlanadi, lekin break-dan oldingi faqat oxirgi mos label bajariladi"
            },
            {
              "icon": "",
              "label": "Hech narsa chop etilmaydi, chunki day 6 uchun toʻgʻridan-toʻgʻri ostida oʻz break-i boʻlgan mos case yoʻq"
            },
            {
              "icon": "",
              "label": "Saturday, keyin Sunday — case 6-da break yoʻq, shuning uchun bajarilish keyingi case kodiga fall through qilib oʻtadi, toki keyingi break-ga yetguncha"
            }
          ]
        },
        {
          "question": "Product klassiga narx boʻyicha yagona, aniq \"natural\" saralash tartibi kerak, shuningdek kodning turli joylarida nom yoki ombordagi miqdor boʻyicha ham saralay olish qobiliyati kerak. Qaysi kombinatsiya toʻgʻri dizayn?",
          "options": [
            {
              "icon": "",
              "label": "Comparable<Product>-ni har bir tartib uchun alohida, uch marta implement qiling va chaqiruvchi qaysi compareTo ishga tushishini tanlasin"
            },
            {
              "icon": "",
              "label": "Natural narx tartibi uchun Comparable<Product>-ni implement qiling, boshqa joylarda ishlatiladigan nom va ombordagi miqdor tartiblari uchun esa alohida Comparator<Product> instance-lari yozing"
            },
            {
              "icon": "",
              "label": "Narx ham kiritilgan holda barcha tartiblar uchun faqat Comparator ishlating, chunki bu yerda Comparable-ning afzalligi yoʻq"
            },
            {
              "icon": "",
              "label": "Har bir tartib uchun uchta overload qilingan compareTo metodi qoʻshib, faqat Comparable ishlating"
            }
          ]
        },
        {
          "question": "Metod new FileReader(path)-ni chaqiradi, u throws IOException deb eʼlon qilingan. IOException Exception-dan extends qiladi, RuntimeException-dan emas. Buni kompilyatsiya qilish uchun nima qilishingiz kerak?",
          "options": [
            {
              "icon": "",
              "label": "Hech narsa — kompilyator buni faqat RuntimeException-dan extends qiladigan istisnolar uchun talab qiladi"
            },
            {
              "icon": "",
              "label": "Yoki IOException-ni try/catch ichida ushlang, yoki oʻz metodingizda throws IOException deb eʼlon qiling — tekshiriluvchi (checked) istisnolar tekshirilmaydigan RuntimeException subklasslaridan farqli oʻlaroq, aniq ushlanishi yoki uzatilishi kerak"
            },
            {
              "icon": "",
              "label": "Chaqiruvni RuntimeException uchun try/catch bilan oʻrang, chunki zamonaviy Java-da IOException avtomatik tekshirilmaydigan boʻlib qoladi"
            },
            {
              "icon": "",
              "label": "Metodni static deb eʼlon qiling — static metodlar tekshiriluvchi istisnolarni boshqarishdan ozod"
            }
          ]
        },
        {
          "question": "try (Resource a = new Resource(\"A\"); Resource b = new Resource(\"B\")) { ... } AutoCloseable-ni implement qiluvchi ikkita resursdan foydalanadi. Agar try bloki normal tugasa, ular qaysi tartibda yopiladi?",
          "options": [
            {
              "icon": "",
              "label": "Avval A, keyin B yopiladi, eʼlon qilish tartibiga mos ravishda"
            },
            {
              "icon": "",
              "label": "Avval B, keyin A yopiladi — try-with-resources resurslarni ular eʼlon qilingan tartibga teskari tartibda yopadi"
            },
            {
              "icon": "",
              "label": "Ikkalasi ham bir vaqtda yopiladi, chunki try-with-resources tozalashni parallellashtiradi"
            },
            {
              "icon": "",
              "label": "Faqat B avtomatik yopiladi — A hali ham finally blokida qoʻlda yopilishi kerak"
            }
          ]
        },
        {
          "question": "int getValue() { try { return 1; } finally { return 2; } } getValue()-ni chaqirish nima qaytaradi?",
          "options": [
            {
              "icon": "",
              "label": "1 — try blokining qaytarish qiymati finally ishga tushishidan oldin allaqachon tasdiqlangan, shuning uchun finally uni oʻzgartira olmaydi"
            },
            {
              "icon": "",
              "label": "Runtime-da istisno tashlaydi, chunki metod ikki joydan qaytara olmaydi"
            },
            {
              "icon": "",
              "label": "2 — finally ichidagi return operatori try blokidan allaqachon boshlangan har qanday return-ni bekor qilib, uning oʻrnini bosadi, 1 qiymatini butunlay tashlab yuboradi"
            },
            {
              "icon": "",
              "label": "Kompilyatsiya xatosi — finally ichida return operatoriga ruxsat berilmaydi"
            }
          ]
        },
        {
          "question": "try { ... } catch (IOException e) { ... } catch (FileNotFoundException e) { ... }, va FileNotFoundException IOException-dan extends qiladi. Buni kompilyatsiya qilishga harakat qilganingizda nima sodir boʻladi?",
          "options": [
            {
              "icon": "",
              "label": "Kompilyatsiya xatosi — FileNotFoundException catch bloki yetib boʻlmaydigan (unreachable), chunki undan oldingi, umumiyroq IOException catch bloki har qanday FileNotFoundException-ga allaqachon mos keladi"
            },
            {
              "icon": "",
              "label": "Muammosiz kompilyatsiya qilinadi va aynan shu tur tashlanganda aniqroq FileNotFoundException bloki ishga tushadi"
            },
            {
              "icon": "",
              "label": "Muammosiz kompilyatsiya qilinadi va FileNotFoundException uchun ikkala catch bloki ham tartib bilan ishga tushadi"
            },
            {
              "icon": "",
              "label": "Kompilyatsiya vaqtida muammo yoʻq, lekin FileNotFoundException birinchi marta aslida yuz berganda runtime xatosi tashlaydi"
            }
          ]
        },
        {
          "question": "Klassda synchronized instance metodi process() va synchronized static metodi configure() bor. Har biri aniq nimani lock qiladi?",
          "options": [
            {
              "icon": "",
              "label": "process() u chaqirilgan aniq obyekt instance-ining monitorini lock qiladi, configure() esa Class obyektining oʻzining monitorini lock qiladi — bu barcha instance-lar uchun umumiy"
            },
            {
              "icon": "",
              "label": "Ikkalasi ham instance yoki klassdan qatʼi nazar, butun JVM uchun bitta umumiy global lock-ni lock qiladi"
            },
            {
              "icon": "",
              "label": "process() Class obyektini lock qiladi, configure() esa uni qaysi instance chaqirsa, shuni lock qiladi"
            },
            {
              "icon": "",
              "label": "Metod tanasi ichida yana synchronized blok ishlatilmasa, ikkalasi ham aslida hech narsani lock qilmaydi"
            }
          ]
        },
        {
          "question": "Maydon volatile int counter = 0; deb eʼlon qilingan, va bir nechta thread ustida bir vaqtda counter++ bajaradi. volatile bu yerda yoʻqolgan yangilanishlarning oldini oladimi?",
          "options": [
            {
              "icon": "",
              "label": "Ha — volatile maydondagi har bir amalni, jumladan increment-ni ham atomik qiladi"
            },
            {
              "icon": "",
              "label": "Yoʻq — volatile faqat oʻqishlar threadlar boʻylab eng oxirgi yozuvni koʻrishini kafolatlaydi (visibility); counter++ esa bir nechta qadamdan iborat read-modify-write amali, va volatile bu qadamlarni atomik qilish uchun hech narsa qilmaydi"
            },
            {
              "icon": "",
              "label": "Ha, lekin faqat int va long maydonlari uchun, JVM 64-bitli qiymatlarni qanday boshqarishi tufayli"
            },
            {
              "icon": "",
              "label": "Yoʻq, va volatile int kabi primitiv turlar uchun visibility-ni ham kafolatlay olmaydi"
            }
          ]
        },
        {
          "question": "Interface A va interface B har biriga default metod describe() ni eʼlon qiladi. Klass ikkalasini ham implement qiladi va describe()-ni oʻzi override qilmaydi. Nima sodir boʻladi?",
          "options": [
            {
              "icon": "",
              "label": "Kompilyator avtomatik ravishda interface A versiyasini tanlaydi, chunki u implements bandida birinchi koʻrsatilgan"
            },
            {
              "icon": "",
              "label": "describe() chaqirilganda har ikkala versiya ham, biri-biridan keyin, ishga tushadi"
            },
            {
              "icon": "",
              "label": "Kompilyatsiya vaqtida muammo yoʻq, lekin describe() birinchi marta chaqirilganda AmbiguousMethodException tashlaydi"
            },
            {
              "icon": "",
              "label": "Kompilyatsiya xatosi — ikkita interfeys bir xil default metodni taqdim etganda, noaniqlikni hal qilish uchun implement qiluvchi klass uni oʻzi override qilishi kerak, chunki Java qaysi birini nazarda tutganingizni taxmin qilmaydi"
            }
          ]
        },
        {
          "question": "list.stream().filter(x -> x > 0).map(x -> x * 2); deb yoziladi, lekin natija hech qachon .collect() yoki .forEach() kabi terminal operatsiyaga tayinlanmaydi. Bu qator bajarilganda aslida nima sodir boʻladi?",
          "options": [
            {
              "icon": "",
              "label": "Roʻyxat elementlariga umuman hech narsa boʻlmaydi — filter va map lazy oraliq (intermediate) operatsiyalar boʻlib, faqat pipeline taʼrifini quradi; terminal operatsiyasiz bu pipeline hech qachon aslida ishga tushmaydi"
            },
            {
              "icon": "",
              "label": "Har bir element xuddi terminal operatsiya chaqirilgandek darhol filtrlanadi va map qilinadi"
            },
            {
              "icon": "",
              "label": "Faqat filter darhol ishga tushadi; map esa terminal operatsiya paydo boʻlgunga qadar kechiktiriladi"
            },
            {
              "icon": "",
              "label": "IllegalStateException tashlaydi, chunki stream pipeline kompilyatsiya qilinishi uchun terminal operatsiya talab qiladi"
            }
          ]
        }
      ],
      "optionOrderVersion": "0154f9576054ad6f"
    }
  }
}
