CodeGym /Java Blog /এলোমেলো /জাভা কোরের জন্য শীর্ষ 50টি চাকরির ইন্টারভিউ প্রশ্ন ও উত্ত...
John Squirrels
লেভেল 41
San Francisco

জাভা কোরের জন্য শীর্ষ 50টি চাকরির ইন্টারভিউ প্রশ্ন ও উত্তর। অংশ 1

এলোমেলো দলে প্রকাশিত
হ্যালো সবাই, ভদ্রমহিলা এবং ভদ্রলোক, সফটওয়্যার প্রকৌশলী! ইন্টারভিউ প্রশ্ন সম্পর্কে কথা বলা যাক. আপনি কি জন্য প্রস্তুত করতে হবে এবং আপনি কি জানা প্রয়োজন সম্পর্কে. প্রথমবার এই পয়েন্টগুলি পর্যালোচনা বা অধ্যয়ন করার জন্য এটি একটি দুর্দান্ত সময়। জাভা কোরের জন্য শীর্ষ 50টি চাকরির ইন্টারভিউ প্রশ্ন ও উত্তর।  পর্ব 1 - 1 আমি ওওপি, জাভা সিনট্যাক্স, জাভা ব্যতিক্রম, সংগ্রহ এবং মাল্টিথ্রেডিং সম্পর্কে প্রায়শই জিজ্ঞাসিত প্রশ্নগুলির একটি বরং বিস্তৃত সংগ্রহের সাথে শেষ করেছি, যা আমি সুবিধার জন্য কয়েকটি অংশে বিভক্ত করব। একবারে সবকিছু কভার করা কঠিন, কিন্তু আমি আশা করি এই উপাদানটি যারা প্রোগ্রামার হিসেবে তাদের প্রথম চাকরি খোঁজার প্রস্তুতি নিচ্ছে তাদের জন্য একটি ভাল ভিত্তি প্রদান করবে। সর্বোত্তম বোঝাপড়া এবং ধরে রাখার জন্য, আমি অন্যান্য উত্সগুলির মাধ্যমেও আঁচড়ানোর পরামর্শ দিই। আপনি বিভিন্ন কোণ থেকে এটির কাছে গিয়ে একটি ধারণার গভীর উপলব্ধি পেতে পারেন। গুরুত্বপূর্ণ:আমরা শুধুমাত্র 8 সংস্করণের আগে জাভা সম্পর্কে কথা বলব। 9, 10, 11, 12 এবং 13 সংস্করণে আসা সমস্ত উদ্ভাবন এখানে বিবেচনা করা হবে না। উত্তরগুলি কীভাবে উন্নত করা যায় সে সম্পর্কে কোনও ধারণা/মন্তব্য স্বাগত জানাই । আপনার পড়া উপভোগ করুন. চলো যাই!

জাভা ইন্টারভিউ: OOP সম্পর্কে প্রশ্ন

1. জাভার বৈশিষ্ট্য কি?

উত্তর:
  1. OOP ধারণা:

    1. বস্তুর অভিযোজন
    2. উত্তরাধিকার
    3. encapsulation
    4. পলিমরফিজম
    5. বিমূর্ততা
  2. ক্রস-প্ল্যাটফর্ম: একটি জাভা প্রোগ্রাম কোনো পরিবর্তন ছাড়াই যেকোনো প্ল্যাটফর্মে চালানো যেতে পারে। অবশ্যই, এর জন্য একটি ইনস্টল করা JVM (জাভা ভার্চুয়াল মেশিন) প্রয়োজন।

  3. উচ্চ কর্মক্ষমতা: জাস্ট-ইন-টাইম (JIT) কম্পাইলার উচ্চ কার্যক্ষমতা সম্ভব করে তোলে। JIT কম্পাইলার বাইটকোডকে মেশিন কোডে রূপান্তর করে এবং তারপর JVM কার্যকর করা শুরু করে।

  4. মাল্টিথ্রেডিং: JVM এক্সিকিউশনের একটি থ্রেড তৈরি করে যাকে বলা হয় main thread। একজন প্রোগ্রামার থ্রেড ক্লাস থেকে প্রাপ্ত বা Runnableইন্টারফেস বাস্তবায়ন করে একাধিক থ্রেড তৈরি করতে পারে।

2. উত্তরাধিকার কি?

ইনহেরিটেন্স মানে হল এক ক্লাস অন্য ক্লাসের উত্তরাধিকারী হতে পারে ( এক্সটেন্ডস কীওয়ার্ড ব্যবহার করে)। এর মানে হল যে আপনি উত্তরাধিকারসূত্রে প্রাপ্ত ক্লাস থেকে কোড পুনরায় ব্যবহার করতে পারেন। বিদ্যমান ক্লাসটি হিসাবে পরিচিত superclassএবং নতুন তৈরি করা ক্লাসটি হল subclass. লোকেরা আরও বলে অভিভাবক এবং পদগুলি ব্যবহার করুন child

public class Animal {
   private int age;
}

public class Dog extends Animal {

}
কোথায় এবং হয় . Animal_parentDogchild

3. এনক্যাপসুলেশন কি?

এই প্রশ্নটি প্রায়ই জাভা বিকাশকারী পদের জন্য সাক্ষাত্কারে জিজ্ঞাসা করা হয়। এনক্যাপসুলেশন এক্সেস মডিফায়ার, গেটার এবং সেটার্স ব্যবহার করে বাস্তবায়ন লুকিয়ে রাখছে। ডেভেলপাররা যেখানে প্রয়োজন মনে করেন সেখানে বাহ্যিক অ্যাক্সেস রোধ করার জন্য এটি করা হয়। বাস্তব জীবনের একটি সহজ উদাহরণ হল গাড়ি। ইঞ্জিনের অপারেশনে আমাদের সরাসরি প্রবেশাধিকার নেই। আমাদের যা করতে হবে তা হল কীটি ইগনিশনে রাখা এবং ইঞ্জিন চালু করা। হুড অধীনে সঞ্চালিত প্রক্রিয়া যে আমাদের ব্যবসার কেউ না. অধিকন্তু, যদি আমরা ইঞ্জিনের কার্যকলাপে হস্তক্ষেপ করি, তাহলে এটি একটি অপ্রত্যাশিত পরিস্থিতির দিকে নিয়ে যেতে পারে, সম্ভবত গাড়ির ক্ষতি হতে পারে এবং এর ফলে শারীরিক ক্ষতি হতে পারে। ঠিক একই জিনিস প্রোগ্রামিং ঘটবে. এটি উইকিপিডিয়াতে ভালভাবে বর্ণনা করা হয়েছে. কোডজিমে এনক্যাপসুলেশন সম্পর্কে একটি নিবন্ধও রয়েছে ।

4. পলিমরফিজম কি?

পলিমরফিজম হল একটি প্রোগ্রামের ক্ষমতা যা বস্তুর নির্দিষ্ট ধরন সম্পর্কে তথ্য ছাড়াই একই ইন্টারফেসের সাথে বস্তুর সাথে একইভাবে আচরণ করে। কথায় আছে, "এক ইন্টারফেস - অনেক বাস্তবায়ন"। পলিমরফিজমের সাথে, আপনি ভাগ করা আচরণের উপর ভিত্তি করে বিভিন্ন ধরণের বস্তু একত্রিত করতে এবং ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আমাদের একটি প্রাণী শ্রেণী রয়েছে যার দুটি বংশধর রয়েছে: কুকুর এবং বিড়াল। জেনেরিক অ্যানিমেল ক্লাসের একটি আচরণ রয়েছে যা সকলের দ্বারা ভাগ করা হয়, একটি শব্দ করার ক্ষমতা। আমরা পলিমরফিক ক্ষমতা ব্যবহার করি যখন আমাদের অ্যানিম্যাল ক্লাসের উত্তরাধিকারী সমস্ত কিছু সংগ্রহ করতে হবে এবং "মেক সাউন্ড" পদ্ধতিটি কার্যকর করতে হবে। এটি দেখতে কেমন তা এখানে:

List<Animal> animals = Arrays.asList(new Cat(), new Dog(), new Cat());
animals.forEach(animal -> animal.makeSound());
অন্য কথায়, পলিমরফিজম সহায়ক। এবং এটি পলিমরফিক (ওভারলোডেড) পদ্ধতিতেও প্রযোজ্য। পলিমারফিজম কীভাবে ব্যবহার করবেন

জাভা সিনট্যাক্স সম্পর্কে ইন্টারভিউ প্রশ্ন

5. জাভাতে কনস্ট্রাক্টর কি?

কনস্ট্রাক্টরদের নিম্নলিখিত বৈশিষ্ট্য রয়েছে:
  1. যখন একটি নতুন অবজেক্ট তৈরি করা হয়, প্রোগ্রামটি এটি তৈরি করতে উপযুক্ত কনস্ট্রাক্টর ব্যবহার করে।
  2. একটি নির্মাণকারী একটি পদ্ধতির মত। এর স্বতন্ত্র বৈশিষ্ট্যগুলি এই সত্যের মধ্যে রয়েছে যে কোনও রিটার্ন মান নেই (অকার্যকর সহ) এবং এর নামটি ক্লাসের নামের মতোই।
  3. যদি কোনো কনস্ট্রাক্টর স্পষ্টভাবে তৈরি না হয়, তাহলে একটি খালি কনস্ট্রাক্টর স্বয়ংক্রিয়ভাবে তৈরি হয়।
  4. একটি কনস্ট্রাক্টর ওভাররাইড করা যেতে পারে।
  5. আপনি যদি প্যারামিটার সহ একটি কনস্ট্রাক্টর ঘোষণা করেন তবে প্যারামিটার ছাড়া একটির প্রয়োজন হয়, তাহলে আপনাকে অবশ্যই এটি আলাদাভাবে তৈরি করতে হবে, যেহেতু এটি স্বয়ংক্রিয়ভাবে তৈরি হবে না।

6. কোন দুটি শ্রেণী অবজেক্টের উত্তরাধিকারী হয় না?

কৌতুক প্রশ্ন দ্বারা প্রতারিত হবেন না — এই ধরনের কোন ক্লাস আছে. সমস্ত ক্লাস সরাসরি বা পূর্বপুরুষের মাধ্যমে অবজেক্ট ক্লাসের উত্তরাধিকারী হয়!

7. একটি স্থানীয় পরিবর্তনশীল কি?

এটি জাভা বিকাশকারীদের জন্য আরেকটি জনপ্রিয় সাক্ষাৎকার প্রশ্ন। একটি স্থানীয় ভেরিয়েবল হল একটি পরিবর্তনশীল যা একটি পদ্ধতির ভিতরে সংজ্ঞায়িত করা হয় এবং যতক্ষণ পর্যন্ত পদ্ধতিটি কার্যকর করা হচ্ছে ততক্ষণ পর্যন্ত বিদ্যমান থাকে। যত তাড়াতাড়ি মৃত্যুদন্ড শেষ হয়, স্থানীয় ভেরিয়েবলের অস্তিত্ব বন্ধ হয়ে যায়। এখানে একটি প্রোগ্রাম যা main() পদ্ধতিতে helloMessage নামে একটি স্থানীয় ভেরিয়েবল ব্যবহার করে:

public static void main(String[] args) {
   String helloMessage;
   helloMessage = "Hello, World!";
   System.out.println(helloMessage);
}

8. একটি উদাহরণ পরিবর্তনশীল কি?

ইনস্ট্যান্স ভেরিয়েবল হল একটি ভেরিয়েবল যা একটি ক্লাসের ভিতরে ঘোষিত হয়। যতক্ষণ একটি বস্তু বিদ্যমান থাকে ততক্ষণ এটি বিদ্যমান থাকে। উদাহরণস্বরূপ, আমাদের একটি মৌমাছি ক্লাস আছে, যার দুটি উদাহরণ ভেরিয়েবল রয়েছে - নেক্টারলোড এবং ম্যাক্সনেক্টারলোড:

public class Bee {

   /**
    * Current nectar load
    */
   private double nectarLoad;

   /**
    * Maximum nectar that can the bee can collect.
    */
   private double maxNectarLoad = 20.0;
 
  ...
}

9. অ্যাক্সেস মডিফায়ার কি?

অ্যাক্সেস মডিফায়ারগুলি ক্লাস, পদ্ধতি এবং ভেরিয়েবলগুলিতে অ্যাক্সেস কাস্টমাইজ করার জন্য একটি প্রক্রিয়া। নিম্নলিখিত সংশোধক বিদ্যমান, অ্যাক্সেস বাড়ানোর জন্য তালিকাভুক্ত:
  1. private— এই অ্যাক্সেস মডিফায়ারটি পদ্ধতি, ক্ষেত্র এবং কনস্ট্রাক্টরগুলিতে ব্যবহার করা হয়। অ্যাক্সেস সীমাবদ্ধ যে ক্লাসে তারা ঘোষণা করা হয়েছে।
  2. package-private (default)— এটি ক্লাসের জন্য ডিফল্ট অ্যাক্সেস লেভেল। অ্যাক্সেস নির্দিষ্ট প্যাকেজের মধ্যে সীমাবদ্ধ যেখানে একটি ক্লাস, পদ্ধতি, পরিবর্তনশীল বা কনস্ট্রাক্টর ঘোষণা করা হয়।
  3. protected— এই অ্যাক্সেস মডিফায়ারটি মডিফায়ারের package-privateসাথে একটি ক্লাসের উত্তরাধিকারী ক্লাসের জন্য অ্যাক্সেস যোগ করার মতো একই অ্যাক্সেস লেভেল অফার করে ।protected
  4. public— এই অ্যাক্সেস লেভেল ক্লাসের জন্যও ব্যবহার করা হয়। এই অ্যাক্সেস লেভেল মানে পুরো অ্যাপ্লিকেশন জুড়ে সম্পূর্ণ অ্যাক্সেস রয়েছে।
জাভা কোরের জন্য শীর্ষ 50টি চাকরির ইন্টারভিউ প্রশ্ন ও উত্তর।  পর্ব 1 - 2

10. মেথড ওভাররাইডিং কি?

আমরা পদ্ধতিগুলিকে ওভাররাইড করি যখন একটি শিশু শ্রেণী তার অভিভাবক শ্রেণীর আচরণ পরিবর্তন করতে চায়। আমাদেরও যদি প্যারেন্ট পদ্ধতিতে যা করার প্রয়োজন হয়, আমরা চাইল্ডে super.methodName() ব্যবহার করতে পারি, যা প্যারেন্ট পদ্ধতিটি কার্যকর করবে। এর পরে আমরা আমাদের অতিরিক্ত যুক্তি যোগ করতে পারি। প্রয়োজনীয়তা যা অবশ্যই পালন করা উচিত:
  • পদ্ধতি স্বাক্ষর একই হতে হবে
  • রিটার্ন মান একই হতে হবে

11. পদ্ধতি স্বাক্ষর কি?

জাভা কোরের জন্য শীর্ষ 50টি চাকরির ইন্টারভিউ প্রশ্ন ও উত্তর।  পর্ব 1 - 3একটি পদ্ধতি স্বাক্ষর হল পদ্ধতির নাম এবং পদ্ধতিটি যে আর্গুমেন্ট নেয় তার সমন্বয়। পদ্ধতি ওভারলোড করার সময় পদ্ধতি স্বাক্ষর একটি পদ্ধতির অনন্য শনাক্তকারী।

12. পদ্ধতি ওভারলোডিং কি?

পদ্ধতি ওভারলোডিং হল পলিমারফিজমের একটি বৈশিষ্ট্য যেখানে আমরা একই ক্রিয়া সম্পাদন করে এমন একাধিক পদ্ধতি তৈরি করতে পদ্ধতি স্বাক্ষর পরিবর্তন করি:
  • একই নাম
  • বিভিন্ন যুক্তি
  • বিভিন্ন ধরনের রিটার্ন হতে পারে
উদাহরণস্বরূপ, ArrayListক্লাসের add()পদ্ধতিটি ওভারলোড হতে পারে, যা আমাদের ইনপুট আর্গুমেন্টের উপর নির্ভর করে ভিন্ন উপায়ে যোগ করার অনুমতি দেয়:
  • add(Object o)— এই পদ্ধতিটি কেবল একটি বস্তু যোগ করে
  • add(int index, Object o)— এই পদ্ধতিটি একটি নির্দিষ্ট সূচকে একটি বস্তু যোগ করে
  • add(Collection<Object> c)— এই পদ্ধতি অবজেক্টের একটি তালিকা যোগ করে
  • add(int index, Collection<Object> c)— এই পদ্ধতিটি একটি নির্দিষ্ট সূচক থেকে শুরু করে বস্তুর একটি তালিকা যোগ করে।

13. একটি ইন্টারফেস কি?

জাভা একাধিক উত্তরাধিকার সমর্থন করে না। এই সীমাবদ্ধতা কাটিয়ে ওঠার জন্য, ইন্টারফেসগুলি যুক্ত করা হয়েছিল যা আমরা জানি এবং ভালবাসি;) দীর্ঘকাল ধরে, ইন্টারফেসগুলিতে কোনও বাস্তবায়ন ছাড়াই কেবল পদ্ধতি ছিল। এই উত্তর প্রসঙ্গে, আসুন তাদের সম্পর্কে কথা বলি। উদাহরণ স্বরূপ:


public interface Animal {
   void makeSound();
   void eat();
   void sleep();
}
কিছু বিবরণ এটি থেকে অনুসরণ করে:
  • একটি ইন্টারফেসের সমস্ত পদ্ধতি সর্বজনীন এবং বিমূর্ত
  • সমস্ত ভেরিয়েবল সর্বজনীন স্ট্যাটিক চূড়ান্ত
  • ক্লাসগুলি ইন্টারফেসের উত্তরাধিকারী হয় না (অর্থাৎ আমরা প্রসারিত কীওয়ার্ড ব্যবহার করি না)। পরিবর্তে, ক্লাস তাদের বাস্তবায়ন করে (অর্থাৎ আমরা ইমপ্লিমেন্টস কীওয়ার্ড ব্যবহার করি)। তাছাড়া, আপনি যতগুলি চান ততগুলি ইন্টারফেস প্রয়োগ করতে পারেন।
  • একটি ইন্টারফেস বাস্তবায়নকারী ক্লাসগুলিকে অবশ্যই ইন্টারফেসে থাকা সমস্ত পদ্ধতির বাস্তবায়ন প্রদান করতে হবে।
এটার মত:

public class Cat implements Animal {
   public void makeSound() {
       // Method implementation
   }

   public void eat() {
       // Implementation
   }

   public void sleep() {
       // Implementation
   }
}

14. একটি ইন্টারফেসে একটি ডিফল্ট পদ্ধতি কি?

এখন ডিফল্ট পদ্ধতি সম্পর্কে কথা বলা যাক। কি জন্য তারা? তারা কার জন্য? এই পদ্ধতিগুলি "উভয় হাত" পরিবেশন করার জন্য যোগ করা হয়েছিল। আমি কি সম্পর্কে কথা বলছি? ঠিক আছে, একদিকে, নতুন কার্যকারিতা যুক্ত করার প্রয়োজন ছিল: ল্যাম্বডাস এবং স্ট্রিম API। অন্যদিকে, জাভা যা জন্য বিখ্যাত তা ধরে রাখা দরকার ছিল - পিছনের সামঞ্জস্য। এটি করার জন্য, ইন্টারফেসের কিছু নতুন প্রস্তুত সমাধান প্রয়োজন। এইভাবে ডিফল্ট পদ্ধতি আমাদের কাছে এসেছে। একটি ডিফল্ট পদ্ধতি একটি ইন্টারফেসে একটি বাস্তবায়িত পদ্ধতি, যা defaultকীওয়ার্ড দিয়ে চিহ্নিত করা হয়। stream()উদাহরণস্বরূপ, ইন্টারফেসে সুপরিচিত পদ্ধতি Collection। আমাকে বিশ্বাস করুন, এই ইন্টারফেসটি যতটা সহজ মনে হয় ততটা সহজ নয়। বা এছাড়াও সমানভাবে বিখ্যাত forEach()পদ্ধতিIterableইন্টারফেস. ডিফল্ট পদ্ধতি যোগ না হওয়া পর্যন্ত এটি বিদ্যমান ছিল না। যাইহোক, আপনি এখানে CodeGym-এ এটি সম্পর্কে পড়তে পারেন ।

15. তাহলে কিভাবে আমরা দুটি অভিন্ন ডিফল্ট পদ্ধতির উত্তরাধিকারী হব?

একটি ডিফল্ট পদ্ধতি কি সে সম্পর্কে পূর্ববর্তী উত্তর আরেকটি প্রশ্ন জিজ্ঞাসা করে। আপনি যদি ইন্টারফেসে পদ্ধতি প্রয়োগ করতে পারেন, তাহলে তাত্ত্বিকভাবে আপনি একই পদ্ধতিতে দুটি ইন্টারফেস বাস্তবায়ন করতে পারেন। আমরা যে কিভাবে করব? এখানে একই পদ্ধতির সাথে দুটি ভিন্ন ইন্টারফেস রয়েছে:

interface A {
   default void foo() {
       System.out.println("Foo A");
   }
}

interface B {
   default void foo() {
       System.out.println("Foo B");
   }
}
এবং আমরা এই দুটি ইন্টারফেস বাস্তবায়ন যে একটি ক্লাস আছে. কিন্তু কিভাবে আমরা ইন্টারফেস A বা B এ একটি নির্দিষ্ট পদ্ধতি বেছে নেব? নিম্নলিখিত বিশেষ নির্মাণ এটি অনুমতি দেয়: A.super.foo():

public class C implements A, B {
   public void fooA() {
       A.super.foo();
   }

   public void fooB() {
       B.super.foo();
   }
}
সুতরাং, পদ্ধতিটি ইন্টারফেসের fooA()ডিফল্ট পদ্ধতি ব্যবহার করবে , যখন পদ্ধতিটি ইন্টারফেসের পদ্ধতি ব্যবহার করবে । foo()AfooB()foo()B

16. বিমূর্ত পদ্ধতি এবং ক্লাস কি?

জাভাতে, abstractএকটি সংরক্ষিত শব্দ। এটি বিমূর্ত ক্লাস এবং পদ্ধতি বোঝাতে ব্যবহৃত হয়। প্রথমত, আমাদের সংজ্ঞা প্রয়োজন। একটি বিমূর্ত পদ্ধতি হল একটি পদ্ধতি যা abstractএকটি বিমূর্ত ক্লাসে বাস্তবায়ন ছাড়াই কীওয়ার্ড ব্যবহার করে ঘোষণা করা হয়। অর্থাৎ, এটি একটি ইন্টারফেসের মতো একটি পদ্ধতি, তবে একটি কীওয়ার্ড যুক্ত করার সাথে, উদাহরণস্বরূপ:

public abstract void foo();
একটি বিমূর্ত শ্রেণী হল একটি শ্রেণী যা abstractকীওয়ার্ড দিয়ে চিহ্নিত করা হয়েছে:

public abstract class A {

}
একটি বিমূর্ত শ্রেণীর বেশ কয়েকটি বৈশিষ্ট্য রয়েছে:
  • আপনি একটি বিমূর্ত শ্রেণীর একটি বস্তু তৈরি করতে পারবেন না
  • এটা বিমূর্ত পদ্ধতি থাকতে পারে
  • এটিতে বিমূর্ত পদ্ধতিও নাও থাকতে পারে
অ্যাবস্ট্রাকশনের জন্য অ্যাবস্ট্রাক্ট ক্লাসের প্রয়োজন (টাউটোলজির জন্য দুঃখিত) যেখানে সাধারণ আচরণ এবং অবস্থার (অর্থাৎ, পদ্ধতি এবং পরিবর্তনশীল) একটি সেট রয়েছে। বাস্তব জীবন উদাহরণে পূর্ণ। আমাদের চারপাশে সবকিছু। "পশু", "কার", "জ্যামিতিক চিত্র", এবং তাই।

17. String, StringBuilder এবং StringBuffer এর মধ্যে পার্থক্য কি?

Stringমানগুলি একটি ধ্রুবক স্ট্রিং পুলে সংরক্ষণ করা হয়। যত তাড়াতাড়ি একটি স্ট্রিং তৈরি করা হয়, এটি এই পুলে প্রদর্শিত হবে. এবং আপনি এটি মুছে ফেলতে পারবেন না। উদাহরণ স্বরূপ:

String name = "book";
ভেরিয়েবলটি ধ্রুবক স্ট্রিং পুলের দিকে নির্দেশ করবে জাভা কোরের জন্য শীর্ষ 50টি চাকরির ইন্টারভিউ প্রশ্ন ও উত্তর।  পর্ব 1 - 4নামের ভেরিয়েবলটিকে একটি ভিন্ন মান নির্ধারণ করে, আমাদের আছে:

name = "pen";
ধ্রুবক স্ট্রিং পুলটি এইরকম দেখায়: জাভা কোরের জন্য শীর্ষ 50টি চাকরির ইন্টারভিউ প্রশ্ন ও উত্তর।  পর্ব 1 - 5অন্য কথায়, উভয় মানই সেখানে থাকে। স্ট্রিং বাফার:
  • Stringমান একটি স্ট্যাকের মধ্যে সংরক্ষণ করা হয়। যদি একটি মান পরিবর্তন করা হয়, তাহলে নতুন মানটি পুরানোটিকে প্রতিস্থাপন করবে।
  • String Bufferসিঙ্ক্রোনাইজ করা হয় এবং তাই থ্রেড নিরাপদ।
  • থ্রেড নিরাপত্তার কারণে, এর কর্মক্ষমতা খারাপ।
উদাহরণ:

StringBuffer name = “book”;
জাভা কোরের জন্য শীর্ষ 50টি চাকরির ইন্টারভিউ প্রশ্ন ও উত্তর।  পর্ব 1 - 6নামের ভেরিয়েবলের মান পরিবর্তন হওয়ার সাথে সাথে স্ট্যাকের মান পরিবর্তিত হয়: জাভা কোরের জন্য শীর্ষ 50টি চাকরির ইন্টারভিউ প্রশ্ন ও উত্তর।  পর্ব 1 - 7স্ট্রিংবিল্ডার ঠিক একই রকম StringBuffer, শুধুমাত্র এটি থ্রেড নিরাপদ নয়। ফলস্বরূপ, এটি তুলনায় লক্ষণীয়ভাবে দ্রুত StringBuffer

18. একটি বিমূর্ত শ্রেণী এবং একটি ইন্টারফেসের মধ্যে পার্থক্য কি?

বিমূর্ত শ্রেণী:
  • বিমূর্ত ক্লাসের একটি ডিফল্ট কনস্ট্রাক্টর আছে। বিমূর্ত শ্রেণীর একটি বংশধর তৈরি করা হলে একে বলা হয়।
  • তারা বিমূর্ত পদ্ধতি এবং অ-বিমূর্ত পদ্ধতি উভয়ই অন্তর্ভুক্ত করতে পারে। সাধারণভাবে, একটি বিমূর্ত শ্রেণীর বিমূর্ত পদ্ধতি থাকতে হবে না।
  • একটি শ্রেণী যে একটি বিমূর্ত এক উত্তরাধিকারসূত্রে শুধুমাত্র বিমূর্ত পদ্ধতি প্রয়োগ করা আবশ্যক.
  • একটি বিমূর্ত শ্রেণীর উদাহরণ ভেরিয়েবল থাকতে পারে (প্রশ্ন #5 দেখুন)।
ইন্টারফেস:
  • একটি ইন্টারফেসের কোন কনস্ট্রাক্টর নেই এবং আরম্ভ করা যাবে না।
  • শুধুমাত্র বিমূর্ত পদ্ধতি যোগ করা যেতে পারে (ডিফল্ট পদ্ধতি ছাড়া)।
  • যে ক্লাসগুলি ইন্টারফেস প্রয়োগ করে তাদের অবশ্যই সমস্ত পদ্ধতি প্রয়োগ করতে হবে (ডিফল্ট পদ্ধতি ব্যতীত)।
  • ইন্টারফেসে শুধুমাত্র ধ্রুবক থাকতে পারে।

19. কেন একটি অ্যারে O(1) এ একটি উপাদান অ্যাক্সেস করা হয়?

এই প্রশ্নটি আমার শেষ সাক্ষাত্কারে আক্ষরিকভাবে জিজ্ঞাসা করা হয়েছিল। আমি পরে শিখেছি, এই প্রশ্নের উদ্দেশ্য হল একজন ব্যক্তি কীভাবে চিন্তা করে তা দেখা। স্পষ্টতই, এই জ্ঞানের ব্যবহারিক মূল্য নেই। শুধু জানাই যথেষ্ট। প্রথমত, আমাদের স্পষ্ট করতে হবে যে O(1) একটি "ধ্রুবক সময়" অ্যালগরিদমের সময় জটিলতার জন্য স্বরলিপি । অন্য কথায়, এই পদবীটি দ্রুততম কার্যকর করার সময় নির্দেশ করে। এই প্রশ্নের উত্তর দেওয়ার জন্য, অ্যারে সম্পর্কে আমরা কী জানি তা বিবেচনা করতে হবে। একটি অ্যারে তৈরি করতে int, আমাদের অবশ্যই নিম্নলিখিতগুলি লিখতে হবে:

int[] intArray = new int[100];
এই সিনট্যাক্স থেকে বেশ কিছু উপসংহার টানা যেতে পারে:
  1. যখন একটি অ্যারে ঘোষণা করা হয়, তখন তার ধরন জানা যায়। ধরন জানা থাকলে অ্যারের প্রতিটি ঘরের আকার জানা যায়।
  2. পুরো অ্যারের সাইজ জানা যায়।
সুতরাং এটি অনুসরণ করে যে কোন ঘরে লিখতে হবে তা বোঝার জন্য, আমাদের কেবল মেমরির কোন অঞ্চলে লিখতে হবে তা গণনা করতে হবে। একটি কম্পিউটারের জন্য, এটি সহজ পিসি। কম্পিউটার জানে যে বরাদ্দ করা মেমরি কোথায় শুরু হয়, উপাদানের সংখ্যা এবং প্রতিটি কক্ষের আকার। এর অর্থ হল লেখার স্থানটি অ্যারের শুরুর স্থানের সমান হবে + প্রতিটি ঘরের আকার সূচক দ্বারা গুণিত হবে।

সুতরাং কিভাবে আমরা O(1) এ পৌঁছাতে পারি যখন একটি ArrayList-এ বস্তু অ্যাক্সেস করার সময়?

এই প্রশ্ন অবিলম্বে পূর্ববর্তী একটি অনুসরণ করে. সত্য হল আদিম ধারণ করে এমন একটি অ্যারের সাথে কাজ করার সময়, আমরা আগে থেকেই জানি (সৃষ্টির সময়) উপাদানের আকার। কিন্তু আমরা কি করব যদি আমাদের এই ধরণের উত্তরাধিকার অনুক্রম থাকে এবং জাভা কোরের জন্য শীর্ষ 50টি চাকরির ইন্টারভিউ প্রশ্ন ও উত্তর।  পর্ব 1 - 8আমরা A টাইপের উপাদানগুলির জন্য একটি সংগ্রহ তৈরি করতে চাই এবং বিভিন্ন বাস্তবায়ন (B, C, এবং D) যোগ করতে চাই:

List<A> list = new ArrayList();
list.add(new B());
list.add(new C());
list.add(new D());
list.add(new B());
এই অবস্থায়, আমরা কিভাবে প্রতিটি কোষের আকার গণনা করব? সর্বোপরি, প্রতিটি বস্তু ভিন্ন হবে, সম্ভবত বিভিন্ন অতিরিক্ত ক্ষেত্র সহ। কি করো? এখানে প্রশ্নটি এমনভাবে করা হয়েছে যা আপনাকে বিভ্রান্ত করার জন্য। আমরা জানি যে সংগ্রহ সরাসরি বস্তু সংরক্ষণ করে না। এটি শুধুমাত্র বস্তুর রেফারেন্স সংরক্ষণ করে। এবং সব রেফারেন্স একই আকার আছে, এবং এটি পরিচিত. ফলস্বরূপ, আমরা আগের প্রশ্নটির মতোই এখানে ঠিকানাগুলি গণনা করি।

21. অটোবক্সিং এবং আনবক্সিং

ঐতিহাসিক পটভূমি: অটোবক্সিং এবং আনবক্সিং হল JDK 5-এর কিছু প্রধান উদ্ভাবন। অটোবক্সিং হল একটি আদিম প্রকার থেকে একটি সংশ্লিষ্ট র্যাপার শ্রেণীতে স্বয়ংক্রিয় রূপান্তরের প্রক্রিয়া। আনবক্সিং হল অটোবক্সিং এর ঠিক বিপরীত। এটি একটি র‍্যাপার শ্রেণীকে একটি আদিম শ্রেণীতে রূপান্তর করার প্রক্রিয়া। কিন্তু যদি একটি মোড়কের মান হয় null, তাহলে একটি NullPointerExceptionআনবক্স করার সময় নিক্ষেপ করা হবে।

আদিম এবং তাদের সংশ্লিষ্ট wrappers

আদিম মোড়ক ক্লাস
বুলিয়ান বুলিয়ান
int পূর্ণসংখ্যা
বাইট বাইট
চর চরিত্র
ভাসা ভাসা
দীর্ঘ দীর্ঘ
সংক্ষিপ্ত সংক্ষিপ্ত
দ্বিগুণ দ্বিগুণ

// অটোবক্সিং ঘটে:

  • একটি রেপার ক্লাসের একটি রেফারেন্সে একটি আদিম বরাদ্দ করার সময়:

    জাভা 5 এর আগে:

    
    // Manual boxing (the way it was BEFORE Java 5).
    public void boxingBeforeJava5() {
       Boolean booleanBox = new Boolean(true);
       Integer intBox = new Integer(3);
       // And so on for other types
    }
    
    After Java 5:
    // Automatic boxing (the way it became in Java 5).
    public void boxingJava5() {
       Boolean booleanBox = true;
       Integer intBox = 3;
       // And so on for other types
    }
    
  • যখন একটি আদিমকে একটি পদ্ধতির যুক্তি হিসাবে পাস করা হয় যা একটি মোড়ক আশা করে:

    
    public void exampleOfAutoboxing() {
       long age = 3;
       setAge(age);
    }
    
    public void setAge(Long age) {
       this.age = age;
    }
    

// আনবক্সিং ঘটে:

  • যখন আমরা একটি আদিম ভেরিয়েবলের জন্য একটি মোড়ক শ্রেণীর একটি উদাহরণ বরাদ্দ করি:

    
    // BEFORE Java 5:
    int intValue = new Integer(4).intValue();
    double doubleValue = new Double(2.3).doubleValue();
    char c = new Character((char) 3).charValue();
    boolean b = Boolean.TRUE.booleanValue();
    
    // And after JDK 5:
    int intValue = new Integer(4);
    double doubleValue = new Double(2.3);
    char c = new Character((char) 3);
    boolean b = Boolean.TRUE;
    
  • পাটিগণিত অপারেশন সময়. ক্রিয়াকলাপগুলি শুধুমাত্র আদিম প্রকারের জন্য প্রযোজ্য, তাই আদিম থেকে আনবক্সিং প্রয়োজনীয়।

    
    // BEFORE Java 5:
    Integer integerBox1 = new Integer(1);
    Integer integerBox2 = new Integer(2);
    
    // A comparison used to require this:
    integerBox1.intValue() > integerBox2.intValue()
          
    // In Java 5
    integerBox1 > integerBox2
    
  • একটি পদ্ধতিতে একটি মোড়ক শ্রেণীর একটি উদাহরণ পাস করার সময় যা সংশ্লিষ্ট আদিম নেয়:

    
    public void exampleOfAutoboxing() {
       Long age = new Long(3);
       setAge(age);
    }
    
    public void setAge(long age) {
       this.age = age;
    }
    

22. চূড়ান্ত কীওয়ার্ড কী এবং এটি কোথায় ব্যবহৃত হয়?

কীওয়ার্ডটি finalভেরিয়েবল, পদ্ধতি এবং ক্লাসে ব্যবহার করা যেতে পারে।
  1. একটি চূড়ান্ত ভেরিয়েবলের মান আরম্ভ করার পরে পরিবর্তন করা যাবে না।
  2. একটি চূড়ান্ত শ্রেণী জীবাণুমুক্ত :) এতে সন্তান থাকতে পারে না।
  3. একটি চূড়ান্ত পদ্ধতি একটি বংশধর দ্বারা ওভাররাইড করা যাবে না.
আমরা উচ্চ-স্তরের জিনিসগুলি কভার করেছি। এখন আরও গভীরে ডুব দেওয়া যাক।

চূড়ান্ত ভেরিয়েবল

জাভা আমাদের একটি ভেরিয়েবল ঘোষণা করার এবং এটিতে একটি মান নির্ধারণ করার দুটি উপায় দেয়:
  1. আপনি একটি ভেরিয়েবল ঘোষণা করতে পারেন এবং পরে এটি শুরু করতে পারেন।
  2. আপনি একটি ভেরিয়েবল ঘোষণা করতে পারেন এবং এখনই একটি মান নির্ধারণ করতে পারেন।
এখানে একটি উদাহরণ যা চূড়ান্ত ভেরিয়েবলের এই ব্যবহারগুলি প্রদর্শন করে:

public class FinalExample {

   // A static final variable that is immediately initialized:
   final static String FINAL_EXAMPLE_NAME = "I'm likely the final one";

   // A final variable that is not initialized, but will only work if you
   // initialize it in the constructor:
   final long creationTime;

   public FinalExample() {
       this.creationTime = System.currentTimeMillis();
   }

   public static void main(String[] args) {
       FinalExample finalExample = new FinalExample();
       System.out.println(finalExample.creationTime);

       // The final FinalExample.FINAL_EXAMPLE_NAME field cannot be accessed
//    FinalExample.FINAL_EXAMPLE_NAME = "Not you're not!";

       // The final Config.creationTime field cannot be accessed
//    finalExample.creationTime = 1L;
   }
}

একটি চূড়ান্ত পরিবর্তনশীল একটি ধ্রুবক বিবেচনা করা যেতে পারে?

যেহেতু আমরা চূড়ান্ত ভেরিয়েবলের জন্য নতুন মান নির্ধারণ করতে পারি না, তাই মনে হয় এগুলি ধ্রুবক ভেরিয়েবল। কিন্তু শুধুমাত্র প্রথম নজরে: যদি ভেরিয়েবলের ডেটা টাইপ হয় immutable, তাহলে, হ্যাঁ, এটি একটি ধ্রুবক। কিন্তু যদি ডেটা টাইপ হয় , অর্থাৎ পরিবর্তনযোগ্য, তাহলে ভেরিয়েবল mutableদ্বারা উল্লেখ করা বস্তুর মান পরিবর্তন করতে পদ্ধতি এবং ভেরিয়েবল ব্যবহার করা সম্ভব হবে। finalএ কারণে একে ধ্রুবক বলা যায় না। নিম্নলিখিত উদাহরণ দেখায় যে কিছু চূড়ান্ত ভেরিয়েবল সত্যই ধ্রুবক, অন্যগুলি নয়, যেহেতু সেগুলি পরিবর্তন করা যেতে পারে।

public class FinalExample {

   // Immutable final variables
   final static String FINAL_EXAMPLE_NAME = "I'm likely the final one";
   final static Integer FINAL_EXAMPLE_COUNT  = 10;

   // Mutable final variables
   final List<String> addresses = new ArrayList();
   final StringBuilder finalStringBuilder = new StringBuilder("Constant?");
}

স্থানীয় চূড়ান্ত ভেরিয়েবল

যখন একটি পদ্ধতির মধ্যে একটি ভেরিয়েবল তৈরি করা হয়, তখন এটি একটি পরিবর্তনশীল finalবলা হয় :local final

public class FinalExample {

   public static void main(String[] args) {
       // You can do this
       final int minAgeForDriveCar = 18;

       // Or you can do this, in a for-each loop:
       for (final String arg : args) {
           System.out.println(arg);
       }
   }

}
আমরা চূড়ান্ত কীওয়ার্ডটি একটি বর্ধিত লুপে ব্যবহার করতে পারি, কারণ লুপের প্রতিটি পুনরাবৃত্তির পরে একটি নতুন ভেরিয়েবল তৈরি করা হয়। মনে রাখবেন যে এটি একটি সাধারণ ফর লুপের ক্ষেত্রে প্রযোজ্য নয়, তাই আমরা একটি কম্পাইল-টাইম ত্রুটি পাব।

// The final local j variable cannot be assigned
for (final int i = 0; i < args.length; i ++) {
   System.out.println(args[i]);
}

ফাইনাল ক্লাস

ঘোষিত একটি ক্লাস finalবাড়ানো যাবে না। আরও সহজ করে বললে, অন্য কোন শ্রেণী এটির উত্তরাধিকারী হতে পারে না। finalJDK-তে একটি ক্লাসের একটি চমৎকার উদাহরণ হল স্ট্রিং। একটি অপরিবর্তনীয় শ্রেণী তৈরি করার প্রথম ধাপ হল এটিকে চিহ্নিত করা final, এইভাবে এটিকে প্রসারিত করা থেকে আটকানো:

public final class FinalExample {
}

// Compilation error!
class WantsToInheritFinalClass extends FinalExample {
}

চূড়ান্ত পদ্ধতি

যখন একটি পদ্ধতি চূড়ান্ত হিসাবে চিহ্নিত করা হয়, তখন এটিকে একটি চূড়ান্ত পদ্ধতি বলা হয় (অর্থবোধক, তাই না?) একটি শিশু ক্লাসে একটি চূড়ান্ত পদ্ধতি ওভাররাইড করা যাবে না। ঘটনাক্রমে, অবজেক্ট ক্লাসের wait() এবং notify() পদ্ধতি চূড়ান্ত, তাই আমাদের কাছে সেগুলি ওভাররাইড করার ক্ষমতা নেই।

public class FinalExample {
   public final String generateAddress() {
       return "Some address";
   }
}

class ChildOfFinalExample extends FinalExample {

   // Compilation error!
   @Override
   public String generateAddress() {
       return "My OWN Address";
   }
}

জাভাতে কিভাবে এবং কোথায় ফাইনাল ব্যবহার করবেন

  • কিছু শ্রেণী-স্তরের ধ্রুবক সংজ্ঞায়িত করতে চূড়ান্ত কীওয়ার্ড ব্যবহার করুন;
  • বস্তুর জন্য চূড়ান্ত ভেরিয়েবল তৈরি করুন যা আপনি পরিবর্তন করতে চান না। উদাহরণস্বরূপ, বস্তু-নির্দিষ্ট বৈশিষ্ট্য যা আমরা লগিং উদ্দেশ্যে ব্যবহার করতে পারি।
  • আপনি যদি ক্লাস বাড়ানো না চান তবে এটি চূড়ান্ত হিসাবে চিহ্নিত করুন।
  • আপনি যদি একটি অপরিবর্তনীয় শ্রেণী তৈরি করতে চান তবে আপনাকে এটি চূড়ান্ত করতে হবে।
  • আপনি যদি চান একটি পদ্ধতির বাস্তবায়ন তার বংশধরে পরিবর্তন না হয়, তাহলে পদ্ধতিটিকে হিসাবে চিহ্নিত করুন final। বাস্তবায়ন পরিবর্তন না হয় তা নিশ্চিত করা খুবই গুরুত্বপূর্ণ।

23. পরিবর্তনযোগ্য এবং অপরিবর্তনীয় প্রকার কি কি?

পরিবর্তনযোগ্য

মিউটেবল অবজেক্ট হল এমন বস্তু যার অবস্থা এবং ভেরিয়েবল সৃষ্টির পর পরিবর্তন করা যায়। পরিবর্তনযোগ্য ক্লাসের উদাহরণগুলির মধ্যে রয়েছে StringBuilder এবং StringBuffer। উদাহরণ:

public class MutableExample {

   private String address;

   public MutableExample(String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   // This setter can change the name field
   public void setAddress(String address) {
       this.address = address;
   }

   public static void main(String[] args) {

       MutableExample obj = new MutableExample("First address");
       System.out.println(obj.getAddress());

       // We are updating the name field, so this is a mutable object
       obj.setAddress("Updated address");
       System.out.println(obj.getAddress());
   }
}

অপরিবর্তনীয়

অপরিবর্তনীয় বস্তু হল এমন বস্তু যার অবস্থা এবং ভেরিয়েবল অবজেক্ট তৈরি হওয়ার পর পরিবর্তন করা যায় না। হ্যাশম্যাপের জন্য একটি দুর্দান্ত কী, আপনি কি মনে করেন না? :) যেমন, String, Integer, Double, ইত্যাদি। উদাহরণ:

// We'll make this class final so no one can change it
public final class ImmutableExample {

   private String address;

   ImmutableExample(String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   // We remove the setter

   public static void main(String[] args) {

       ImmutableExample obj = new ImmutableExample("Old address");
       System.out.println(obj.getAddress());

       // There is no way to change this field, so it is an immutable object
       // obj.setName("new address");
       // System.out.println(obj.getName());

   }
}
পরবর্তী অংশে, আমরা সংগ্রহ সম্পর্কে প্রশ্ন এবং উত্তর বিবেচনা করি। জাভা কোরের জন্য GitHub শীর্ষ 50 চাকরির ইন্টারভিউ প্রশ্ন ও উত্তরে আমার প্রোফাইল । অংশ ২
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION