پوشش دقیق حوزههای آزمون
این منبع آزمون تمرینی به دقت حول محور دامنههای مهندسی هستهای طراحی شده است که در مصاحبههای مهندسی جاوا در سطح سازمانی مورد ارزیابی قرار میگیرند.
اینترفیس List (۲۰٪): توازن عملکرد، مکانیسمهای تغییر اندازه داخلی آرایه و استراتژیهای لینک کردن گرهها در ArrayList، LinkedList، Vector، Stack و متدهای ساختاری پایه List.
اینترفیس Set (۱۵٪): تضمین یکتا بودن، حل تصادمهای هشینگ و مکانیسمهای ترتیب مرتب شده در HashSet، TreeSet، LinkedHashSet به همراه عملیاتهای جبری پایه Set.
اینترفیس Map (۲۰٪): باکتهای داخلی، آستانههای تبدیل به درخت (Treeifying)، فرمولهای هشینگ، فاکتورهای بار (Load Factors) و تفاوتهای معماری بین HashMap، TreeMap، LinkedHashMap و Hashtable.
Queue و Dequeue (۱۰٪): معماریهای FIFO، ساختارهای Priority Heap و پیادهسازیهای قراردادهای مسدودکننده رشته (Thread-blocking) در Queue، Dequeue، PriorityQueue و گونههای BlockingQueue.
Iterator و ListIterator (۵٪): پیمایش متوالی عناصر، پارامترهای دوجهته، تغییرات در حین حلقهها و وضعیتهای رفتاری fail-fast در مقابل fail-safe.
کالکشنهای همروند یا Concurrent (۱۰٪): قفلگذاری در سطح سگمنت/باکت، کپیهای تکرار ایمن (Thread-safe)، تغییرات اتمیک مپ و گلوگاههای عملیاتی در ConcurrentHashMap، CopyOnWriteArrayList و کالکشنهای Wrapper Synchronized.
سلسلهمراتب چارچوب کالکشن (۱۰٪): الگوهای طراحی ساختاری، قراردادهای Collection Interface و Iterable Interface و قوانین کلی درخت ارثبری چارچوب.
مفاهیم هستهای متفرقه (۱۰٪): مکانیسمهای کپی (Shallow Copy در مقابل Deep Copy)، رفتارهای کامپایلر مانند Method Hiding و علامتگذاری نوع با استفاده از Marker Interface (مانند Serializable, Cloneable).
درباره این دوره
موفقیت در یک مصاحبه پیشرفته مهندسی بک-اند جاوا بسیار فراتر از دانستن نحوه نمونهسازی از یک ArrayList است. توسعهدهندگان ارشد و معماران فنی به طور مداوم بر اساس درک عمیق آنها از ساختارهای داده، پیچیدگی الگوریتمی، مصرف حافظه و ایمنی رشتهها تحت بارهای همروندی بالا ارزیابی میشوند. من این دیتابیس ۵۵۰ سوالی را دقیقاً برای این طراحی کردم که شکاف بین دانش کدنویسی پایه و موارد خاص معماری (Edge-cases) را که مصاحبهکنندگان باتجربه از شما میپرسند، پر کند.
هر سوال در این بانک سوالات به طور عمیق به مکانیسمهای ساختاری، رفتارهای کامپایلر و انتخابهای مربوط به عملکرد میپردازد. من از سوالات ساده سینتکسی پرهیز کردهام تا روی رفتارهای زمان اجرا، ساختارهای داده پیچیده، قراردادهای مرتبسازی و شرایط چندرشتهای تمرکز کنم. هر سوال شامل یک توضیح جامع است که مفاهیم مهندسی زیربنایی را کالبدشکافی کرده و دقیقاً نشان میدهد چرا یک گزینه صحیح است و چرا گزینههای جایگزین در یک محیط عملیاتی (Production) شکست میخورند. چه در حال آماده شدن برای مصاحبه توسعهدهنده ارشد جاوا باشید، چه بخواهید دانش کالکشنهای همروند خود را برای ارزیابیهای فنی داخلی بازسازی کنید و چه در حال ساخت سیستمهای مهندسی پلتفرم هسته باشید، این مطالب تستهای عملی لازم برای قبولی در مصاحبههای فنی را در اولین تلاش فراهم میکند.
پیشنمایش نمونه سوالات تمرینی
برای مشاهده عمق اطلاعات و تحلیلهای فنی ارائه شده در این منبع آمادهسازی، این سه نمونه سوال با کیفیت بالا را بررسی کنید.
سوال ۱: تغییر اندازه ساختاری داخلی و استراتژی تصادم در مپهای مبتنی بر هش
در طول یک عملیات درج انبوه متمرکز در یک java.util.HashMap استاندارد که روی جاوا ۸ یا نسخههای جدیدتر اجرا میشود، چندین کلید یکتا به طور اتفاقی به یک ایندکس باکت اولیه یکسان ارجاع داده میشوند. اگر تعداد کل ورودیهای متصادم در این باکت خاص به ۸ برسد و ظرفیت کل مپ در حال حاضر ۳۲ باشد، چه انتقال ساختاری دقیقی رخ میدهد؟
الف) باکت مربوطه به طور خودکار فرمت ذخیرهسازی داخلی خود را از ساختار لیست لینکشده تکجهته به یک چیدمان درخت قرمز-سیاه متوازن تبدیل میکند.
ب) کل مپ یک توالی تغییر اندازه اضطراری را فعال کرده و چیدمان آرایه باکت خود را دو برابر میکند، بدون اینکه ساختار گره لیست لینکشده را تغییر دهد.
ج) مپ به دلیل وضعیت بارگذاری ساختاری ناپایدار، یک ConcurrentModificationException پرتاب میکند.
د) ورودی متصادم جایگزین قدیمیترین عنصر در آن باکت خاص میشود تا از سرریز ذخیرهسازی داخلی جلوگیری شود.
ه) ساختار هش مپ به طور خودکار به یک چیدمان Synchronized Hashtable تبدیل میشود تا ماندگاری دادهها تضمین شود.
و) ساختار باکت به صورت یک لیست لینکشده تکجهته باقی میماند تا زمانی که اندازه کلی مپ از حد حداکثر ظرفیت پیشفرض ۱۶ تجاوز کند.
پاسخ صحیح و توضیح:
پاسخ صحیح: ب
دلیل صحت: در جاوا ۸ و بالاتر، یک باکت HashMap زمانی از لیست لینکشده به درخت قرمز-سیاه (treeification) تبدیل میشود که تعداد آیتمهای باکت به آستانه ۸ (TREEIFY_THRESHOLD) برسد. با این حال، این انتقال مستلزم آن است که ظرفیت کلی مپ حداقل ۶۴ (MIN_TREEIFY_CAPACITY) باشد. چون ظرفیت مپ در این سناریو تنها ۳۲ است، مپ تصمیم میگیرد با دو برابر کردن اندازه آرایه باکتهای خود تغییر اندازه دهد، به جای اینکه باکت را به درخت تبدیل کند.
دلیل عدم صحت گزینههای دیگر:
گزینه الف نادرست است: تبدیل به درخت در اینجا نادیده گرفته میشود زیرا ظرفیت مپ هنوز به حداقل نیاز ۶۴ باکت نرسیده است.
گزینه ج نادرست است: تغییر اندازه ساختاری یک ویژگی استاندارد زمان اجرا است و استثناهای ساختاری یا تغییرات پرتاب نمیکند.
گزینه د نادرست است: HashMapها در طول عملیات استاندارد آیتمهای قدیمی را حذف نمیکنند؛ این رفتار مختص ساختارهای حافظه پنهان تخصصی مانند LRU است.
گزینه ه نادرست است: یک HashMap هرگز نوع کلاس یا معماری خود را در زمان اجرا به Hashtable قدیمی تغییر نمیدهد.
گزینه و نادرست است: ساختار باکت از طریق تغییر اندازه تغییر میکند زیرا وجود ۸ عنصر در یک باکت نشاندهنده سطح بالای تراکم تصادم است.
سوال ۲: خطاهای تغییر همزمان و رفتارهای رشتهای در تکرارکنندههای کالکشن
یک توسعهدهنده در حال تحلیل یک روتین ردیابی قدیمی است که در آن یک java.util.ArrayList مشترک توسط چندین رشته (Thread) دسترسی دارد. در حالی که رشته A به طور سیستماتیک کالکشن را با استفاده از یک Iterator استاندارد پیمایش میکند، رشته B یک ورودی جدید را مستقیماً وارد ساختار لیست میکند. نتیجه فوری زمان اجرا هنگام تلاش رشته A برای گام تکرار بعدی چیست؟
الف) تکرارکننده ردیابی، عنصر جدید اضافه شده را بلافاصله و بدون پرتاب خطا میخواند.
ب) کالکشن به حالت fail-safe تغییر وضعیت داده و بافر آرایه خود را کلون میکند تا از خطاهای خواندن داده جلوگیری شود.
ج) تکرارکننده در فراخوانی بعدی متد next() یک ConcurrentModificationException پرتاب میکند.
د) رشته A مسدود میشود تا زمانی که رشته B قفل عملیاتی خود را روی نمونه لیست پشتیبان آزاد کند.
ه) ماشین مجازی زمان اجرا بلافاصله با یک خطای بحرانی کمبود حافظه (Out of Memory) متوقف میشود.
و) ورودی اضافه شده توسط رشته B در یک بافر حافظه پنهان موقت نگه داشته میشود تا حلقه تکرار به طور کامل به پایان برسد.
پاسخ صحیح و توضیح:
پاسخ صحیح: ج
دلیل صحت: تکرارکننده استاندارد برای ArrayList به طور صریح fail-fast است. این تکرارکننده یک شمارنده تغییرات ساختاری به نام modCount را ردیابی میکند. اگر هر رشتهای ساختار لیست را (با افزودن، حذف یا بهروزرسانی عناصر) در حالی که یک تکرارکننده فعالانه در حال حلقه زدن روی آن است تغییر دهد، تکرارکننده متوجه تغییر در modCount مورد انتظار شده و بلافاصله یک ConcurrentModificationException پرتاب میکند.
دلیل عدم صحت گزینههای دیگر:
گزینه الف نادرست است: یک تکرارکننده fail-fast اجازه نمیدهد تغییرات ساختاری در طول یک حلقه زنده بدون جریمه باقی بمانند.
گزینه ب نادرست است: یک ArrayList نمیتواند خود را در زمان اجرا به یک سیستم fail-safe تبدیل کند؛ برای این رفتار به ابزارهای همروندی مانند CopyOnWriteArrayList نیاز دارید.
گزینه د نادرست است: ArrayList همگامسازی نشده (Unsynchronized) است؛ قفلهای داخلی برای مسدود کردن رشتههای رقیب ندارد که منجر به Race Condition و استثناها میشود.
گزینه ه نادرست است: این عدم تطابق ساختاری یک استثنای استاندارد زمان اجرا ایجاد میکند، نه یک کرش حافظه مهلک در ماشین مجازی.
گزینه و نادرست است: لیستهای همگامسازی نشده دارای حافظههای پنهان مرحلهبندی یا مناطق ذخیرهسازی موقت برای نوشتنهای همزمان نیستند.
سوال ۳: تضمینهای ترتیب عناصر و مرتبسازی در پیادهسازیهای تخصصی Set
یک توسعهدهنده نیاز دارد یک چارچوب حذف تکرار (Deduplication) بسازد که عناصر دادهای نامرتب و غیر null را دریافت کند، تمام ورودیهای تکراری را حذف کند و تضمین کند که آیتمها دقیقاً به همان ترتیبی که در ابتدا درج شده بودند، قابل خواندن باشند. کدام گزینه از چارچوب کالکشن این نیاز عملیاتی را برآورده میکند؟
الف) java.util.HashSet
ب) java.util.TreeSet
ج) java.util.LinkedHashSet
د) java.util.PriorityQueue
ه) java.util.Vector
و) java.util.ConcurrentHashMap
پاسخ صحیح و توضیح:
پاسخ صحیح: ج
دلیل صحت: یک LinkedHashSet از ترکیبی از یک جدول هش و یک لیست لینکشده دوجهته که از میان عناصر آن میگذرد، استفاده میکند. این ساختار دوگانه به آن اجازه میدهد تا مزایای عملکردی یک Set (تضمین یکتایی مطلق عناصر) را حفظ کرده و در عین حال ترتیب درج قابل پیشبینی را برای پیمایش حفظ کند.
دلیل عدم صحت گزینههای دیگر:
گزینه الف نادرست است: یک HashSet استاندارد هیچ تضمینی در مورد ترتیب عناصر خود ارائه نمیدهد؛ توالی ردیابی میتواند با تغییر اندازه باکتهای جدید در طول زمان تغییر کند.
گزینه ب نادرست است: یک TreeSet عناصر را با استفاده از ترتیب طبیعی آنها یا یک Comparator سفارشی مرتب میکند، نه اینکه توالی درج اولیه آنها را حفظ کند.
گزینه د نادرست است: یک PriorityQueue یک ساختار صف است که اجازه تکرار میدهد و عناصر را بر اساس قوانین اولویت سفارشی پردازش میکند، نه بر اساس ترتیب درج.
گزینه ه نادرست است: یک Vector ترتیب درج را حفظ میکند اما اجازه ورودیهای تکراری را میدهد، بنابراین نیاز حذف تکرار را برآورده نمیکند.
گزینه و نادرست است: ConcurrentHashMap یک ساختار Map بدون ترتیب است و یک پیادهسازی مجزای Set نیست.
چه انتظاراتی داشته باشید
به آزمونهای سوالات مصاحبهای خوش آمدید تا شما را برای پاسخ به سوالات مصاحبه جاوا کالکشنز آماده کنیم.
شما میتوانید هر تعداد بار که بخواهید در آزمونها شرکت کنید.
این یک بانک سوالات عظیم و اورجینال است.
اگر سوالی داشته باشید، از پشتیبانی مدرسان بهرهمند میشوید.
هر سوال دارای یک توضیح دقیق است.
با اپلیکیشن Udemy کاملاً سازگار با موبایل است.
امیدواریم تا الان متقاعد شده باشید! سوالات بسیار بیشتری در داخل دوره وجود دارد.
Interview Questions Tests
مربی در Udemy
نمایش نظرات