مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت آخر

سلام و خسته نباشید خدمت همه
قسمت سیزدهم ( آخر ) از مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید رو در پیش داریم که میتونید از طریق لینک های زیر به توضیحات و قسمت های قبلی دسترسی داشته باشید ، امروز میریم سراغ دوازده سوال آخر...
مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت اول
مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوم
مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت سوم
مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت چهارم
مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت پنجم
مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت ششم
مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت هفتم
مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت هشتم
مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت نهم
مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دهم
مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت یازدهم
مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوازدهم


۱۲۱. درخت دودویی ( binary tree ) :

نوعی درخت که هر المان آن حداکثر دو شاخه ( فرزند ) دارد که به اسم شاخه راست و چپ شناخته می شوند را درخت دودویی می گویند
مقدار شاخه چپ همیشه کم تر از مقدار والد است.
مقدار شاخه راست همیشه بزرگتر یا مساوی مقدار والد است.
اگر دو شرط فوق برقرار باشند می گویند که درخت در حالت تعادل است.

مزیت های درخت دودویی نسبت به فهرست پیوندی : در فهرست پیوندی موارد تنها با یک اشاره گر next به هم متصل هستند اما در درخت دودویی تا وقتی که درخت در تعادل باشد همیشه مسیر کوتاه تری برای جستجو طی می شود

نقطه ضعف آن ها هم این است که گاهی اوقات از نظر کارآمد بودن به اندازه فهرست پیوندی نزول پیدا می کنند.


۱۲۲. پشته ها ( Stack ) :

پشته ها مجموعه هایی هستند که از سیاست LIFO ( مخفف Last Input First Output ) استفاده می کنند.
از توابع اساسی آن ها می توان موارد زیر را نام برد :

  • تابع Push : موجودی جدیدی به بالای پشته می افزاید
  • تابع Pop : یک موجودی از بالای پشته حذف می کند

پشته ها محدودیت اندازه دارند و اگر پشته ای پر باشد و ما مقدار جدید push کنیم در این حالت می گوییم که overflow در پشته رخ داده است
اگر پشته خالی باشد و سعی کنیم مقداری را pop کنیم این کار انجام نمی شود و در این حالت می گوییم که underflow در پشته رخ داده است.
از نظر کارآمدی : زمان اجرای توابع پشته به تعداد مقادیر درون آن ربطی ندارند به همین علت بسیار کار آمد است و اُ بزرگ آن ۱ است.


۱۲۳. صف ها ( Queues ) :

صف ها مجموعه هایی هستند که از سیاست FIFO استفاده می کنند. از توابع اساسی آن ها می توان موارد زیر را نام برد :

  • تابع enqueue : یک مورد جدید به انتهای صف اضافه می کند
  • تابع dequeue : یک مورد جدید از جلوی صف حذف می کند
  • تابع front : جلو ترین مقدار صف را باز میگرداند

صف ها محدودیت اندازه دارند و اگر پشته ای پر باشد و ما مقدار جدید enqueue کنیم در این حالت می گوییم که overflow در صف رخ داده است اگر صف خالی باشد و سعی کنیم مقداری را dequeue کنیم این کار انجام نمی شود و در این حالت می گوییم که underflow در صف رخ داده است.

از نظر کارآمدی : زمان اجرای توابع صف به تعداد مقادیر درون آن ربطی ندارند به همین علت بسیار کار آمد است و اُ بزرگ آن ۱ است.

صف دوطرفه : نوعی از صف است که می توان مورد جدید را به انتها یا ابتدای آن اضافه کرد یا مورد جدیدی را از انتها یا ابتدای آن حذف کرد.

صف دو طرفه با محدودیت ورودی : نوعی صف دو طرفه است که در آن حذف از دو طرف قابل انجام است اما اضافه کردن فقط در یک طرف قابل انجام شدن است

صف دو طرفه با محدودیت خروجی : نوعی صف دو طرفه است که در آن اضافه کردن از دو طرف قابل انجام است اما حذف فقط در یک طرف قابل انجام شدن است

صف الویت دار : نوعی صف است که در آن موارد علاوه بر مقدار با الویت افزوده می شوند و هنگام خروج بر اساس الویت خارج می شوند.


۱۲۴. Blocking Queue :

نوعی صف است که هنگامی که شما می خواهید در هنگام خالی بودن آن چیزی از آن حذف کنید یا در هنگامی که شما می خوهید در هنگام پر بودن آن چیزی به آن اضافه کنید thread شما را بلاک می کند تا زمانی که توسط یک بلاک دیگر پر شود ( اگر خالی بود ) یا خالی شود ( اگر پر بود )

مثال برای پیاده سازی Blocking Queue


۱۲۵. تفاوت های صف و پشته چیست :

  • سیاست کاری صف LIFO است اما سیاست صف FIFO است
  • برای افزودن یا حذف در پشته از یک انتها استفاده می شود اما در صف یک انتها برای حذف و انتهای دیگر برای افزودن استفاده می شود
  • در صف از یک اشاره گر استفاده می شود اما در یک صف ساده از دو اشاره گر استفاده می شود
  • عملیات های push و pop در پشته وجود دارند و معادل آن ها در صف enqueue و dequeue را داریم
  • شرط خالی بودن پشته top == -1 است اما در صف یا front == -1 باشد یا front == rear + 1
  • شرط پر بودن در پشته top == max -1 است اما در صف rear == max -1
  • تنها یک نوع پشته وجود دارد اما انواع صف وجود دارد مانند صف دایره ای ، صف دو طرفه ، صف الویت دار
  • پیاده سازی پشته در مقایسه با صف ساده تر است


۱۲۵ـ DeadLock در جاوا چیست ؟

هنگامی که یک thread منبعی از سیستم درخواست می کند و آن منبع در روند انتظار دیگری درگیر است یک DeadLock رخ می دهد و Thread منتظر تمام شدن روند انتظار و دریافت منبع از سیستم می ماند.
مثال برای مواقعی که DeadLock رخ می دهد
مثال برای جلوگیری از رخ دادن DeadLock


۱۲۶ـ List Interface و Set Interface چیست ؟

List Interface مجموعه ای از اشیاء که ممکن است تکرار داشته باشند را پشتیبانی می کند و Set Interface یک روش ریاضی برای دسترسی به عناصر موجود در مجموعه را برای جلوگیری از تکرار در اختیار شما می گذارد.


۱۲۷. فرق ArrayList و Vector چیست ؟

وکتور ها بر خلاف ArrayList ها Thread safe یا همان Synchronized هستند. به همین علت کارایی ArrayList ها بهتر از Vector هاست.
در ArrayList برای جستجو باید از عنصر ابتدایی شروع به جستجو کنید اما در وکتور ها می توانید از یک موقعیت مشخص شروع به جستجو کنید. به همین علت عملیات جستجو در وکتور ها سریع تر انجام می شود.
وکتور ها دارای اندازه پیش فرض ۱۰ هستند در حالی که ArrayList ها می توانند اندازه های متغیر داشته باشند.


۱۲۸. چرا عملیات افزودن و حذف کردن در ArrayList کند تر از فهرست های پیوندی است؟

ساختار ArrayList ها به شکلی است که در درون خود آرایه ای برای نگهداری داده ها دارند و هر زمانی که این آرایه پر شد آرایه ی جدیدی به اندازه ۱.۵ برابر آرایه قبلی ساخته می شود و داده های قبلی در آرای جدید کپی می شوند.
هنگام عملیات حذف باید تمامی عناصر آرایه یک خانه به عقب کشیده شوند تا جای خالی عنصری که پاک شده است را پر کنند. در فهرست پیوندی داده ها در گره های متصل به هم ذخیره می شوند و عملیات حذف تنها با تغییر دو اشاره گر امکان پذیر است و عملیات افزودن در آن ها تنها با ساخت یک گره جدید و تغییر دو اشاره گر سریع تر انجام می شود.


۱۲۹. انواع پیاده سازی برای Map ها :

  • پیاده سازی TreeMap : ذخیره سازی در آن بر اساس کلید ها به صورت صعودی می باشد. برای افزودن ،‌ حذف و یافتن عناصر بهترین جایگزین برای آن HashMap است.
  • پیاده سازی HashTable : مقادیر null را پشتیبانی نمی کند . fail-safe نیست sychronized است در صورتی که hashmap مقادیر null را پشتیبانی می کند . fail-safe است و synchronized نیست.
  • پیاده سازی LinkedHashMap : یک زیر کلاس از HashMap است با این تفاوت که ترتیب عناصر را از حالت LinkedList حفظ می کند.


۱۳۰. فرق Enumeration و Iterator ها چیست ؟

Enumeration متد remove ندارند در صورتی که iterator ها دارند. رفتار Enumerator ها به صورتی است که تنها عملیات خواندن را انجام می دهند.

ـ ListIterator : مانند Iterator ها هستند با این تفاوت که اجازه دسترسی به مجموعه را به صورت پیش رونده یا عقب رونده را می دهند.


۱۳۱. HashMap در جاوا چگونه فعالیت می کنند؟

HashMap ها با سیاسیت Hash کردن کار میکنند. یک ساختمان داده است که به ما اجازه می دهد به داده در زمانی ثابت دسترسی داشته باشیم ( اگر کلید آن را بدانیم )
وقتی که ما از تابع put استفاده می کنیم متد hashcode بر روی آبجکت کلیدی فراخوانی می شود تا تابع hash در map بتواند سطلی برای ذخیره سازی مقدار پیدا کند.

وقتی دو شئ مختلف دارای hashcode یکسان باشند یک فهرست پیوندی در آن سطل ساخته می شود و مقدار دوم به مقدار اول متصل می شود. در هنگام جستجو بعد از پیدا کردن سطل مربوط به hashMap از تابع key.equals برای تشخیص گره درست در فهرست پیوندی استفاده می کنیم و مقدار آن گره را باز میگردانیم.


۱۳۲. ژنتیک در جاوا :

با استفاده از ژنتیک در جاوا می توان برنامه نویس را مجبور کرد تا تنها انوع مشخصی از مقادیر را ذخیره سازی کند.
نوع Type-Safety : تنها می توانیم یک نوع خاص از مقادیر را ذخیره کنیم و نمی توانیم مقادیر جدید را نگه داریم

نوع مشخص نشده : نوعی مشخص نشده و می توانیم هر نوعی را ذخیره سازی کنیم

بررسی در هنگام کامپایل : این موارد در هنگام کامپایل بررسی می شوند و دیگر کار به زمان اجرا نخواهد رسید که از نظر حرفه ای بسیار بهتر است.

برای مثال قبل از ژنتیک باید از cast کردن انواع استفاده می کردیم :

List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0); //typecasting

اما بعد از ژنتیک دیگر نیازی به cast کردن انواع نبود :

List<String> list = new ArrayList<String>();
list.add("hello");
String s = list.get(0);

کلاسی که به همه انواع ارجاع دارد به عنوان کلاس generic شناخته می شود. ما اینجا از پارامتر T استفاده کردیم. پارامتر T به هر نوعی اشاره دارد به عنوان مثال : String و Double و Strudent و ...

علامت‌ ؟ ( علامت سوال ) به عنوان المان whildcard شناخته می شود. این علامت به معنی هر نوعی می باشد برای مقال اگر ما نوشتیم <extends Number ? > به معنی این است که هر زیر کلاسی از کلاس Number به عنوان مثال Integer یا Double یا Float.



حرف آخر :
دم همتون گرم که تا اینجا این مقله سریالی رو دنبال کردید ،‌ مطمئنا خودتون سود کردید و نتیجه اش هم می بینید
با نوشتن این ترجمه خیلی انتقاد بهم شد ، خیلی هاشون واقعا انتقاد درست و حسابی بودن و خیلی هاشون هم فقط بهونه یا حسادت یا ...
ولی من نه هدفم بزرگ کردن اسمم بود و نه چیز مشابهی...
صرفا خودمم میخواستم این مقاله ی بلند و بالا رو بخونم ، خوندن ۵۰ صفحه مقاله انگلیسی برام واقعا حوصله سر بر بود ولی نیازش داشتم ، دلم نمیخواست بعد از من کسی وجود داشته باشه که حوصله ی خوندن ۵۰ صفحه مقاله انگلیسی رو نداشته باشه ، خواستم همه از این اطلاعات استفاده کنن و تنها راهی که به ذهنم می رسید تا خیلی ها رو تشویق کنم برای خوندن همچین مقاله ای ترجمه اش به فارسی بود
تشکر از Anitaa Murthy بابت مقاله فوق العاده خفنش.
لینک نسخه انگلیسی مقاله هم براتون پایین میذارم استفاده ببرید

قسمت اول برگه تقلب مصاحبه برنامه نویسی اندروید
قسمت دوم برگه تقلب مصاحبه برنامه نویسی اندروید



تشکر بابت مطالعه پست
لایک و حمایت یادتون نره
سوالی بود درخدمتم
نوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)))