{
  "assessmentTests": {
    "java_test": {
      "name": "آزمون Java",
      "desc": "30 سوال سناریویی درباره نحوی اساسی، انواع، متدها، مجموعه‌ها و استثناها — بفهمید مهارت‌های Java شما با آنچه یک فرصت شغلی منظور دارد چقدر مطابقت دارد.",
      "recommendation": "ارزیابی مهارت‌های Java شما",
      "results": {
        "beginner": {
          "name": "مبتدی",
          "desc": "می‌توانید یک کلاس Java ساده بنویسید و متدهایی را فراخوانی کنید، اما تفاوت‌های متدهای کلیدی و رفتار مقایسه مخفی شما را سردرگم می‌کنند. بسیاری از سوالات از دست‌رفته درباره == و .equals()، خودکاری Integer، یا اینکه یک finally block چه می‌کند — نه نحو. یک String را با == مقایسه کنید و آن فقط بر اساس reference کار می‌کند، نه محتوا. Integer را از آن جعبه autobox کنید و == کار می‌کند برای مقادیر کوچک و شکست می‌خورد برای بزرگ‌ها. هیچ‌کدام این موارد درباره بدبود برای Java نیستند؛ این قوانین خاصی هستند که افرادی که Java را از طریق دوره‌ها آموخته‌اند را سردرگم می‌کند. در کار اهمیت دارند زیرا هر یک جایی است که کد با صوت خاموش رفتار متفاوتی دارد.",
          "recommendation": "با سه چیز شروع کنید، به ترتیب: چرا == String محتوا را مقایسه نمی‌کند و .equals() ضروری است، چگونه Integer autoboxing در نطاق ±127 کار می‌کند، و اینکه یک finally block همیشه اجرا می‌شود حتی وقتی return را ببینید. جلسات Java و مستندات Oracle هر دو این سه‌تایی را با نمونه‌های قابل اجرا پوشش می‌دهند."
        },
        "intermediate": {
          "name": "متوسط",
          "desc": "شما روزمره کد Java را راحت‌انه نوشته‌اید — کلاس‌ها، متدها، collections — و از کار interfaces یا generics کند نمی‌شوید. شکاف بین اینجا و Advanced بیشتر درباره آن است که چه اتفاقی می‌افتد نه تنها یک ویژگی انجام می‌دهد، بلکه زمانی که متدها و generics با یکدیگر تعامل دارند. یک ArrayList که شرایط خودکاری را ترک می‌دهد، generics که برای runtime type checking رد می‌شوند، یا یک exception که در جایی دیگر مخفی‌ای شود. این نوع bugs هستند که یک نگاه سریع را پاس می‌کنند و فقط زمانی ظاهر می‌شوند که کسی خروجی واقعی را اجرا کند.",
          "recommendation": "روی اینکه runtime اجرا شده که compile time چیست تمرکز کنید: generics که type اطلاعات را پاک می‌کنند، autoboxing که NULL-ها کند می‌شود، و چرا شکاف بین آنچه interface تعریف می‌کند و آنچه overriding متد واقعی نتیجه دهد اهمیت دارد. سپس exception hierarchy، زیرا catch order اهمیت دارد و غیبت throws clause می‌تواند compile کند اما شکست بخورد زمانی که کسی آن را فراخوانی کند."
        },
        "advanced": {
          "name": "پیشرفته",
          "desc": "این سطحی است که بیشتر فرصت‌های شغلی منظور دارند \"Java قوی\". یک متد overloading را می‌خوانید و می‌دانید کدام نسخه واقعی در compile time انتخاب خواهد شد، می‌دانید چرا یک generics type error ظاهر شد نه تنها اینکه ظاهر شد، و می‌توانید Stream یا concurrent collection behavior را پیش‌بینی کنید. آنچه این band را از top جدا می‌کند سمت defensive کار است: دانستن کدام exception شده می‌تواند throw، اینکه volatile واقعاً چه تضمینی دارد، و زمانی‌که ConcurrentModificationException و متى آن را bypass می‌کند.",
          "recommendation": "به سمتی بروید که داده‌های دیگران را محافظت می‌کند: overload resolution اصول و مراحل، generics type erasure و آنچه آن برای runtime instanceof معنی می‌دهد، و visibility و scope در context overriding. سپس concurrency: volatile vs synchronized، what happens to a listener set روی Stream parallelism، و ممیز بین defensive copy و unmodifiable view. Effective Java یا Java Concurrency in Practice برای deep dives استفاده کنید."
        },
        "expert": {
          "name": "متخصص",
          "desc": "شما در هر بخش بالاترین نمره را گرفتید — syntax/types، methods/scope، collections/generics، exceptions/concurrency. عملاً، این یعنی شما می‌توانید یک کد Java که نوشته‌شده‌ای از قبل نمی‌دیده‌اید را بخوانید و پیش‌بینی کنید آنچه درست زمانی‌که اجرا می‌شود، نه فقط آنچه compile‌کننده می‌گوید باید اتفاق بیفتد — مهارتی است که سخت‌تر و ارزشمندتر است. در این سطح نحو Java نادرتاً عامل محدود کننده است؛ محدودیت معمولاً طراحی متد، memory visibility، یا concurrency strategy زیرینش است.",
          "recommendation": "بازگشت‌ها اکنون در concurrency و architecture هستند: profiler output را قبل از فرض اینکه کد آهسته است بخوانید، synchronized vs volatile vs CAS در context یک واقعی race condition، و تصمیمات data structure که موقع رشد load پابرجا می‌مانند. اگر برای یک نقش غربالگری می‌شوید، یک bug را توصیف کنید که در production پیدا کردید — مثل Integer cache edge case یا generics casting danger یا ConcurrentModificationException race — نه تنها vocabulary."
        }
      },
      "questions": [
        {"question": "شما دو String object ایجاد می‌کنید: String a = new String(\"cat\"); String b = new String(\"cat\"); آیا a == b برابر چه تقسیم می‌شود؟", "options": [{"icon": "", "label": "درست — String literals با کاراکترهای یکسان همیشه یک object هستند"}, {"icon": "", "label": "درست — new String(...) از string pool استفاده می‌کند، پس متن یکسان همیشه یک object را به اشتراک می‌گذارد"}, {"icon": "", "label": "یک خطای compile — == نمی‌تواند برای مقایسه String objects استفاده شود"}, {"icon": "", "label": "نادرست — new String(...) همیشه یک object جدید روی heap تخصیص می‌دهد، بنابراین == دو reference متفاوت را مقایسه می‌کند حتی اگر .equals(b) برای true برگردد"}]},
        {"question": "Integer x = 100; Integer y = 100; System.out.println(x == y); سپس Integer x2 = 200; Integer y2 = 200; System.out.println(x2 == y2); این دو خط چه چاپ می‌کنند؟", "options": [{"icon": "", "label": "درست سپس درست — autoboxed Integer objects بدون توجه به مقدار همیشه کش می‌شوند"}, {"icon": "", "label": "نادرست سپس نادرست — == روی Integer objects همیشه یک مقایسه reference است، بنابراین مقادیر برابر هرگز match نمی‌شوند"}, {"icon": "", "label": "درست سپس نادرست، اما فقط به این دلیل که 200 از یک byte سرریز می‌کند — حد کش ربطی به -128..127 ندارد"}, {"icon": "", "label": "درست سپس نادرست — autoboxed Integer values از -128 تا 127 کش و به اشتراک گذاشته می‌شوند، بنابراین 100 یک object مشترک استفاده می‌کند، اما 200 خارج از محدوده کش است و به دو object جدا autobox می‌شود"}]},
        {"question": "int max = Integer.MAX_VALUE; System.out.println(max + 1); چه اتفاقی می‌افتد؟", "options": [{"icon": "", "label": "یک ArithmeticException برای integer overflow throw می‌کند"}, {"icon": "", "label": "Integer.MAX_VALUE دوباره چاپ می‌کند، زیرا Java در حداکثر مقدار type کلمپ می‌کند"}, {"icon": "", "label": "Integer.MIN_VALUE چاپ می‌کند — int arithmetic بی‌صدا بر روی overflow wrap می‌کند به‌جای throw"}, {"icon": "", "label": "یک compile error است — compiler overflow را از قبل تشخیص می‌دهد"}]},
        {"question": "System.out.println(0.1 + 0.2 == 0.3); این خط چه چاپ می‌کند، و چرا؟", "options": [{"icon": "", "label": "نادرست — 0.1، 0.2 و 0.3 نمی‌توانند دقیق در binary floating point نمایش داده شوند، بنابراین جمع دارای rounding error است که باعث می‌شود bit-for-bit برابر 0.3 نباشد"}, {"icon": "", "label": "درست — Java double arithmetic را به نزدیک‌ترین decimal نمایش پذیر round می‌کند قبل از مقایسه"}, {"icon": "", "label": "درست — جمع دو double همیشه دقیق است برای مقادیری با دو رقم اعشار"}, {"icon": "", "label": "یک exception throw می‌کند، زیرا == برای double در Java تعریف نشده است"}]},
        {"question": "یک کلاس دو instance field بدون initializer اعلام می‌کند: int count; و Integer total; قبل از اجرای constructor، مقادیر پیش‌فرض آن‌ها چیست؟", "options": [{"icon": "", "label": "هر دو پیش‌فرض 0 هستند، زیرا Integer در field initialization به int autobox می‌شود"}, {"icon": "", "label": "count 0 است و total نیز 0 است، خودکار boxed دفعه اول خواندن"}, {"icon": "", "label": "count 0 و total null است — primitive numeric fields پیش‌فرض zero دارند، اما یک uninitialized wrapper reference field مثل هر object reference دیگر پیش‌فرض null دارد"}, {"icon": "", "label": "هر دو تا زمان assign صریح null هستند، زیرا Java numeric defaults ضمنی ندارد"}]},
        {"question": "یک loop 1000 بار اجرا می‌شود، هر بار result += \"x\"; روی یک String result انجام می‌دهد. واقعاً هر iteration زیر پوست چه اتفاقی می‌افتد؟", "options": [{"icon": "", "label": "character array داخلی String موجود درجا extended می‌شود"}, {"icon": "", "label": "Java خودکار concatenations را batch می‌کند و فقط یک final String object تخصیص می‌دهد"}, {"icon": "", "label": "به یک single StringBuilder.append() call compile می‌شود که در تمام 1000 iterations به اشتراک گذاشته می‌شود، بدون extra object allocation هر iteration"}, {"icon": "", "label": "یک String object جدید ایجاد می‌شود و result نقطه آن را تغییر می‌دهد — String قبلی دور انداخته می‌شود، زیرا String immutable است و += نمی‌تواند آن را درجا تغییر دهد"}]},
        {"question": "final List<String> names = new ArrayList<>(); کدام یک از اینها درست است؟", "options": [{"icon": "", "label": "names.add(\"Ana\") compile می‌شود و خوب کار می‌کند — final فقط جلوی reassign کردن خود reference names را می‌گیرد، نه mutating object"}, {"icon": "", "label": "names.add(\"Ana\") یک compile error است، زیرا final خود list را unmodifiable می‌کند"}, {"icon": "", "label": "list thread-safe برای concurrent writes است زیرا final اعلام شده است"}, {"icon": "", "label": "final روی local variable تاثیری ندارد مگر type خود immutable اعلام شود"}]},
        {"question": "int[] a = {1, 2, 3}; int[] b = {1, 2, 3}; System.out.println(a == b); System.out.println(Arrays.equals(a, b)); این دو خط چه چاپ می‌کنند؟", "options": [{"icon": "", "label": "نادرست سپس درست — == array references را مقایسه می‌کند (دو array object جدا)، در حالی که Arrays.equals elements را مقایسه می‌کند"}, {"icon": "", "label": "درست سپس درست — arrays با محتوای یکسان در Java یک object هستند"}, {"icon": "", "label": "نادرست سپس نادرست — Arrays.equals فقط برای object arrays کار می‌کند، نه primitive int arrays"}, {"icon": "", "label": "درست سپس نادرست — == روی arrays محتوا را مقایسه می‌کند، و Arrays.equals بیشتر است"}]},
        {"question": "void show(Object o) { print(\"Object\"); } void show(String s) { print(\"String\"); } Object ref = \"hello\"; show(ref); کدام overload اجرا می‌شود، و چرا؟", "options": [{"icon": "", "label": "show(String) اجرا می‌شود، زیرا Java actual runtime class object را قبل انتخاب overload بررسی می‌کند"}, {"icon": "", "label": "show(Object) اجرا می‌شود — overload resolution در compile time با declared type variable انجام می‌شود، نه actual runtime type object"}, {"icon": "", "label": "یک compile error است — Object جایی منتقل نمی‌شود که یک more specific overload وجود دارد"}, {"icon": "", "label": "هر دو متد اجرا می‌شوند، یکبار، زیرا Java overloads را با trying هر match حل می‌کند"}]},
        {"question": "Base class دارای static void greet() { print(\"Base\"); }. Derived extends Base و اعلام می‌کند static void greet() { print(\"Derived\"); }. نوشته می‌شود: Base ref = new Derived(); ref.greet(); چه چاپ می‌شود؟", "options": [{"icon": "", "label": "Derived — static methods مثل instance methods override می‌شوند، actual object runtime type دنبال می‌کند"}, {"icon": "", "label": "یک compile error است — static methods نمی‌توانند از طریق instance reference فراخوانی شوند"}, {"icon": "", "label": "Base — static methods polymorphic نیستند؛ فراخوانی یکی از طریق reference در compile time با declared type reference حل می‌شود، نه object runtime type"}, {"icon": "", "label": "Base و Derived هر دو چاپ می‌شوند، زیرا call هم hidden و هم hiding versions را حل می‌کند"}]},
        {"question": "یک متد درون، نوشته‌اید int count = 0; سپس سعی کنید count را از داخل lambda منتقل شده به متد دیگر reference کنید. برای compile این count باید چه باشد؟", "options": [{"icon": "", "label": "count باید effectively final باشد — هرگز reassigned نه بعد initial value — زیرا lambda یک snapshot می‌گیرد، نه live reference مutable local variable"}, {"icon": "", "label": "هیچ چیز — هر local variable از داخل lambda آزادانه خوانده و reassigned می‌شود"}, {"icon": "", "label": "count باید volatile اعلام شود پس lambda همیشه latest value آن را می‌بیند"}, {"icon": "", "label": "count باید field باشد، نه local variable — lambdas نمی‌توانند locals را capture کنند"}]},
        {"question": "void rename(StringBuilder sb) { sb = new StringBuilder(\"new\"); } فراخوانی شود StringBuilder original = new StringBuilder(\"old\"); rename(original); بعد از فراخوانی original چیست؟", "options": [{"icon": "", "label": "می‌شود \"new\" — objects در Java با reference منتقل می‌شوند، بنابراین reassigning parameter caller variable تغییر می‌دهد"}, {"icon": "", "label": "می‌شود \"new\" فقط برای mutable types مثل StringBuilder، اما نه برای immutable"}, {"icon": "", "label": "هنوز \"old\" است — Java reference خود را by value منتقل می‌کند، بنابراین reassigning parameter درون متد فقط local copy reference را repoint می‌کند، leaving caller original untouched"}, {"icon": "", "label": "Runtime exception throw می‌کند، زیرا sb reassigned شد درون متد"}]},
        {"question": "یک کلاس دارای یک static initializer block، یک instance initializer block، و یک constructor، در آن source order. شما دو objects این class را یکی بعد دیگری ایجاد می‌کنید. این سه چه ترتیبی اجرا می‌شوند؟", "options": [{"icon": "", "label": "static block دقیقاً یکبار اجرا می‌شود، اول‌بار class load؛ سپس هر object، instance block و سپس constructor body اجرا می‌شود"}, {"icon": "", "label": "هر سه، fresh، source order، هر یک object ایجاد شده اجرا می‌شود"}, {"icon": "", "label": "constructor اول هر object، سپس instance block، سپس static block یکبار بسیار آخر اجرا می‌شود"}, {"icon": "", "label": "static block یکبار هر object، درست قبل instance block اجرا می‌شود"}]},
        {"question": "یک کلاس دارای void log(String s) و void log(String... args). فراخوانی log(\"hi\"). کدام یک اجرا می‌شود؟", "options": [{"icon": "", "label": "log(String... args) — varargs overloads همیشه preferred هستند زمانی هر دو applicable باشند"}, {"icon": "", "label": "یک compile error است — فراخوانی ambiguous بین دو overloads"}, {"icon": "", "label": "log(String s) — زمانی یک fixed-arity overload دقیق match کند، Java همیشه آن را over یک varargs overload prefer می‌کند، که فقط last resort است"}, {"icon": "", "label": "هرکدام source file اول declare شود اجرا می‌شود"}]},
        {"question": "constructor اول line this(0); را فراخوانی می‌کند برای delegate به constructor دیگر در same class. اینجا this() اجرا شدن مجاز است؟", "options": [{"icon": "", "label": "هرجای constructor body، تا زمانی که object returned شود اجرا شود"}, {"icon": "", "label": "فقط very first statement constructor — this() (یا super()) باید first line باشد، و constructor نمی‌تواند هر دو this() و super() را فراخوانی کند"}, {"icon": "", "label": "فقط last statement، بعد از تمام field initialization complete"}, {"icon": "", "label": "فقط constructors explicitly marked delegating، استفاده delegate keyword"}]},
        {"question": "شما نیاز دارید list داشته باشید که elements در front بسیار اغلب درج می‌شوند، و random-access reads نادر هستند. کدام یک structural fit بهتر است، و چرا؟", "options": [{"icon": "", "label": "ArrayList — contiguous backing array هر operation سریع‌تر می‌سازد، شامل front-insertion، از یک linked structure"}, {"icon": "", "label": "آنها identical perform می‌کنند، زیرا هر دو List interface implement می‌کنند با same time guarantees"}, {"icon": "", "label": "LinkedList — inserting در front O(1) است زیرا فقط یک node relinks، در حالی که ArrayList باید هر existing element shift کند up، O(n) front-insertion"}, {"icon": "", "label": "LinkedList، زیرا random access O(1) در آن support می‌کند در حالی که ArrayList نه"}]},
        {"question": "شما پنج entries به یک plain HashMap درج می‌کنید یک specific order، سپس آن را با یک for-each loop iterate می‌کنید. entries چه ترتیبی بیرون می‌آیند؟", "options": [{"icon": "", "label": "same order entries inserted، زیرا Java maps همیشه insertion order preserve می‌کنند"}, {"icon": "", "label": "هیچ guaranteed order نیست — HashMap iteration order hash bucket placement بستگی دارد، نه insertion، و حتی بین runs تغییر می‌کند؛ LinkedHashMap چیزی است insertion order preserve می‌کند"}, {"icon": "", "label": "خودکار sorted by key، same way TreeMap آن را عمل می‌کند"}, {"icon": "", "label": "reverse insertion order، زیرا HashMap درون‌stack استفاده می‌کند"}]},
        {"question": "چند null keys یک plain java.util.HashMap می‌تواند یکی‌بار hold کند، و چند null values؟", "options": [{"icon": "", "label": "هیچ null keys و null values در هیچ Map implementation هرگز allowed نیستند"}, {"icon": "", "label": "یک null key حداکثر، و هر تعداد null values — HashMap یک single null key اجازه می‌دهد، unlike Hashtable که نه"}, {"icon": "", "label": "unlimited null keys و unlimited null values، زیرا null مثل هر key دیگری treat می‌شود"}, {"icon": "", "label": "یک null key و یک null value maximum، دونه capped at یک"}]},
        {"question": "شما یک List را با یک for-each loop iterate می‌کنید و list.remove(item) را مستقیم روی list loop body درون فراخوانی می‌کنید، برخی اما نه تمام elements. چه اتفاقی می‌افتد؟", "options": [{"icon": "", "label": "صحیح کار می‌کند و دقیقاً intended elements حذف می‌شود"}, {"icon": "", "label": "سعی سایز در loop، اما بقیه بدون error complete می‌شود"}, {"icon": "", "label": "IndexOutOfBoundsException throw می‌کند زمانی loop old size list می‌رسد"}, {"icon": "", "label": "ConcurrentModificationException throw می‌کند — modifying list structure مستقیم در حالی implicit iterator walking آن detected و rejected؛ Iterator.remove() استفاده شدن باید"}]},
        {"question": "Runtime در، یک List<String> list داده شده، واقعاً می‌توانید چه generic type parameter آن را بدست بیاورید via reflection یا instanceof؟", "options": [{"icon": "", "label": "می‌توانید list.getElementType() فراخوانی کنید String.class retrieve برای runtime"}, {"icon": "", "label": "instanceof List<String> compile می‌شود و درست element type را check می‌کند"}, {"icon": "", "label": "JVM type parameter را hidden metadata store می‌کند accessible via list.getGenericType()"}, {"icon": "", "label": "هیچ چیز — generic type information compile time erased است، بنابراین runtime object فقط یک List است، و کوئی راه نیست recover String یا Integer list declare شده چی"}]},
        {"question": "switch (day) { case 1: case 2: print(\"Weekday\"); break; case 6: print(\"Saturday\"); case 7: print(\"Sunday\"); break; default: print(\"?\"); } اگر day 6 باشد، چه چاپ می‌شود؟", "options": [{"icon": "", "label": "فقط Saturday — هر case block switch همیشه بعد print statement خود متوقف می‌شود"}, {"icon": "", "label": "فقط Sunday — matching case 6 شروع می‌شود اما فقط آخرین matching label قبل break execute می‌شود"}, {"icon": "", "label": "هیچ چاپ نمی‌شود، زیرا day 6 هیچ case matching نیست direct break اش زیر"}, {"icon": "", "label": "Saturday سپس Sunday — case 6 هیچ break ندارد، پس execution falls through next case code قبل following break"}]},
        {"question": "یک Product class نیاز دارد یک single، واضح \"natural\" sort order by price، بعلاوه ability برای sort name یا stock level در جاهای مختلف codebase. کدام combination right design؟", "options": [{"icon": "", "label": "Comparable<Product> سه بار separate implement، یک per ordering، و let caller انتخاب کند کدام compareTo اجرا"}, {"icon": "", "label": "Comparable<Product> برای natural price ordering implement کنید، و نوشته جدا Comparator<Product> instances برای name و stock-level orderings استفاده جاهای دیگر"}, {"icon": "", "label": "فقط Comparator استفاده هر ordering، شامل price، زیرا Comparable اینجا advantage ندارد"}, {"icon": "", "label": "فقط Comparable استفاده با سه overloaded compareTo methods، یک per ordering"}]},
        {"question": "یک متد فراخوانی می‌کند new FileReader(path)، که throws IOException اعلام کند. IOException extends Exception، نه RuntimeException. این compile کردن چه باید کنید؟", "options": [{"icon": "", "label": "هیچ — compiler فقط این enforce می‌کند exceptions که RuntimeException extend"}, {"icon": "", "label": "یا IOException catch کنید try/catch یا throws IOException اعلام کنید خود متد — checked exceptions باید handle یا propagate صریح، unlike unchecked RuntimeException subclasses"}, {"icon": "", "label": "wrap کنید فراخوانی try/catch برای RuntimeException، زیرا IOException خودکار unchecked modern Java"}, {"icon": "", "label": "متد اعلام کنید static — static methods exempt checked exception handling"}]},
        {"question": "try (Resource a = new Resource(\"A\"); Resource b = new Resource(\"B\")) { ... } استفاده می‌کند دو resources implementing AutoCloseable. اگر try block normally finish کند، چه ترتیبی closed؟", "options": [{"icon": "", "label": "A closed اول، سپس B، matching declaration order"}, {"icon": "", "label": "B closed اول، سپس A — try-with-resources resources reverse order closed declare شدند"}, {"icon": "", "label": "هر دو simultaneously closed، زیرا try-with-resources cleanup parallelizes"}, {"icon": "", "label": "فقط B automatically closed — A باید دستی finally block باقی closed"}]},
        {"question": "int getValue() { try { return 1; } finally { return 2; } } فراخوانی getValue() چه برمی‌گرداند؟", "options": [{"icon": "", "label": "1 — try block return value پیش از finally runs committed، پس finally نمی‌تواند آن را change"}, {"icon": "", "label": "Runtime exception throw می‌کند، زیرا متد نمی‌تواند دو جای برگردد"}, {"icon": "", "label": "2 — یک return statement finally داخل overrides و replaces هر return در حال progress از try block، discarding value 1 کاملاً"}, {"icon": "", "label": "یک compile error است — finally allowed نیست return statement داشته باشد"}]},
        {"question": "try { ... } catch (IOException e) { ... } catch (FileNotFoundException e) { ... }، و FileNotFoundException extends IOException. جمع compile کردن این، چه اتفاق می‌افتد؟", "options": [{"icon": "", "label": "یک compile error — FileNotFoundException catch block unreachable، زیرا earlier، more general IOException catch block پیش‌تر هر FileNotFoundException match"}, {"icon": "", "label": "دقیق compile، و more specific FileNotFoundException block اجرا هر زمان دقیق type throw شود"}, {"icon": "", "label": "دقیق compile، و هر دو catch blocks order، برای FileNotFoundException اجرا"}, {"icon": "", "label": "compile time خوب اما runtime error throw دفعه اول یک FileNotFoundException واقعی رخ دهد"}]},
        {"question": "یک کلاس دارای یک synchronized instance method process() و یک synchronized static method configure(). دقیقاً هر یک چه lock می‌کند؟", "options": [{"icon": "", "label": "process() monitor specific object instance lock می‌گیرد فراخوانی، در حالی configure() monitor Class object خود lock می‌گیرد — shared هر instance"}, {"icon": "", "label": "هر دو یک single global lock برای تمام JVM lock، بدون توجه instance یا class"}, {"icon": "", "label": "process() Class object lock، و configure() هر instance اتفاقاً فراخوانی کند"}, {"icon": "", "label": "نه واقعاً کوئی چیز lock نمی‌کند مگر synchronized block درون method body نیز استفاده"}]},
        {"question": "یک field برای volatile int counter = 0; اعلام می‌شود، و multiple threads counter++ روی آن concurrent اجرا کنند. volatile lost updates جلوگیری می‌کند؟", "options": [{"icon": "", "label": "بلی — volatile هر operation روی field atomic می‌کند، شامل increments"}, {"icon": "", "label": "نه — volatile فقط guarantee می‌کند reads دیگر threads آخرین write می‌بینند (visibility)؛ counter++ یک read-modify-write است با multiple steps، و volatile هیچ کاری atomic کردن آن steps نمی‌کند"}, {"icon": "", "label": "بلی، اما فقط int و long fields specifically، به‌خاطر چگونه JVM handles 64-bit values"}, {"icon": "", "label": "نه، و volatile نیز visibility guarantee نمی‌کند primitive types مثل int"}]},
        {"question": "Interface A و interface B هر یک یک default method describe() اعلام کند. یک کلاس هر دو A و B implement و خود describe() override نمی‌کند. چه اتفاق می‌افتد؟", "options": [{"icon": "", "label": "compiler خودکار interface A version انتخاب، زیرا اول implements clause لیست شده"}, {"icon": "", "label": "هر دو versions اجرا، یک بعد دیگری، هر زمان describe() فراخوانی شود"}, {"icon": "", "label": "compile time خوب اما AmbiguousMethodException throw دفعه اول describe() فراخوانی شود"}, {"icon": "", "label": "یک compile error — زمانی دو interfaces یک same default method contribute، implementing class باید خود override ambiguity حل، زیرا Java guess نمی‌کند کدام منظور"}]},
        {"question": "list.stream().filter(x -> x > 0).map(x -> x * 2); نوشته می‌شود اما نتیجه هرگز یک terminal operation مثل .collect() یا .forEach() assign نمی‌شود. واقعاً این line execute زمانی چه اتفاق می‌افتد؟", "options": [{"icon": "", "label": "هیچ اتفاق list elements برای نمی‌افتد — filter و map lazy intermediate operations هستند که فقط یک pipeline description build؛ بدون یک terminal operation، هیچ pipeline execute نمی‌شود"}, {"icon": "", "label": "هر element filtered و mapped فوری، دقیقاً اگر یک terminal operation فراخوانی شود"}, {"icon": "", "label": "فقط filter فوری اجرا؛ map deferred تا یک terminal operation ظاهر"}, {"icon": "", "label": "یک IllegalStateException throw، زیرا یک stream pipeline compile نیاز یک terminal operation"}]}
      ],
      "optionOrderVersion": "0154f9576054ad6f"
    }
  }
}
