এই দুটি ইন্টারফেসের মধ্যে সঠিক পার্থক্য কি? Enumeration
ব্যবহার করে কি সুবিধা আছে Iterator
? যদি কেউ বিশদভাবে বলতে পারে তবে একটি রেফারেন্স নিবন্ধ প্রশংসিত হবে।
এই দুটি ইন্টারফেসের মধ্যে সঠিক পার্থক্য কি? Enumeration
ব্যবহার করে কি সুবিধা আছে Iterator
? যদি কেউ বিশদভাবে বলতে পারে তবে একটি রেফারেন্স নিবন্ধ প্রশংসিত হবে।
উত্তর:
Iterator
ইন্টারফেসের জন্য জাভা এপিআই স্পেসিফিকেশনটির দিকে তাকালে , এর মধ্যে পার্থক্যের একটি ব্যাখ্যা রয়েছে Enumeration
:
পরীক্ষকগণ দুটি উপায়ে গণনা থেকে পৃথক:
- আইট্রেটাররা পুনরাবৃত্তির সময় ভাল-সংজ্ঞায়িত শব্দার্থক শব্দগুলির মাধ্যমে অন্তর্ভুক্ত সংগ্রহ থেকে উপাদানগুলি সরিয়ে ফেলার অনুমতি দেয় te
- পদ্ধতির নামগুলি উন্নত করা হয়েছে।
নীচের লাইনটি হ'ল উভয়ই Enumeration
এবং Iterator
ধারাবাহিক উপাদানগুলি দেবে, তবে Iterator
পদ্ধতিটির নামগুলি সংক্ষিপ্ততর হয় এবং এর একটি অতিরিক্ত remove
পদ্ধতি রয়েছে এমনভাবে উন্নত করা হয় । এখানে পাশাপাশি পাশাপাশি তুলনা করা হচ্ছে:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
জাভা এপিআই স্পেসিফিকেশনগুলিতে যেমন উল্লেখ করা হয়েছে, নতুন প্রোগ্রামগুলির জন্য Iterator
তার চেয়ে বেশি পছন্দ করা উচিত Enumeration
, কারণ "ইভাটার জাভা সংগ্রহের কাঠামোর মধ্যে গণনার স্থান গ্রহণ করে।" ( Iterator
স্পেসিফিকেশন থেকে ।)
Iteilers ব্যর্থ দ্রুত । অর্থাত্ যখন কোনও থ্রেড সংযোজন / অপসারণ অপারেশনগুলির সাহায্যে সংগ্রহ পরিবর্তন করে, অন্য থ্রেডটি কোনও আইট্রেটারের সাহায্যে hasNext() or next()
পদ্ধতি ব্যবহার করে এটি চালিয়ে যায়, পুনরুক্তি ছুড়ে দিয়ে দ্রুত ব্যর্থ হয় ConcurrentModificationException
। পুনরুক্তিকারীদের ব্যর্থ-দ্রুত আচরণ কেবল বাগ সনাক্ত করতে ব্যবহার করা যেতে পারে। হ্যাশটেবল, ভেক্টরের মতো শ্রেণীর পদ্ধতি দ্বারা ফিরে আসা এনুমারেশনগুলি ব্যর্থ-দ্রুত নয় nextElement()
যা বর্তমান ভেক্টর অবজেক্টটিকে লক করে রাখে এমন পদ্ধতির অভ্যন্তরে কোডের ব্লকটি সিঙ্ক্রোনাইজ করার মাধ্যমে অর্জন করা হয় যা প্রচুর সময় ব্যয় করে।
"অফিসিয়ালি", তাদের অতিরিক্ত ক্রিয়াকলাপগুলির (যেমন, অপসারণ) সমর্থনকারী পুনরাবৃত্তকারী ইন্টারফেসের সাথে একই রকম বলে মনে করা হচ্ছে। সাধারণত, প্রবণতাটি পুনরাবৃত্তকারীগুলি ব্যবহার করা হয়।
এখানে গণনা ইন্টারফেস javadocs থেকে :
দ্রষ্টব্য: এই ইন্টারফেসটির কার্যকারিতা Iterator ইন্টারফেস দ্বারা নকল করা হয়। এছাড়াও, আইট্রেটর একটি teচ্ছিক অপসারণ অপারেশন যুক্ত করে এবং এর পদ্ধতির নামগুলি ছোট হয়। নতুন বাস্তবায়নের ক্ষেত্রে গণনার অগ্রাধিকারের ক্ষেত্রে আইট্রেটার ব্যবহার করা বিবেচনা করা উচিত।
একটি সাধারণ সত্য তবে পূর্বের উত্তরে উল্লেখ করা হয়নি এটি Iterator<T>
হ'ল Iterable<T>
ব্যাখ্যামূলক for(_type_ element:collection){...}
কাঠামো পরিবেশন করতে ব্যবহৃত হয় ।
গণনা এবং আইট্রেটারে প্রাথমিক তিনটি পার্থক্য রয়েছে
গণনা
১. এটি কেবলমাত্র লেগ্যাসি ক্লাসের জন্য ব্যবহার করা হয় (উদাঃ Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2. পড়ুন অপারেশন সম্পাদন করা যেতে পারে, আমরা উপাদান অপসারণ করতে পারবেন না।
৩. দুটি পদ্ধতি উপলব্ধ
iterator
এটি সমস্ত সংগ্রহের জন্য প্রযোজ্য
Iterator itr = c.iterator();
where c is any `Collection` class
পড়ুন এবং অপসারণ অপারেশন সম্পাদন করা যেতে পারে
তিনটি পদ্ধতি উপলব্ধ
উভয় মধ্যে সীমাবদ্ধতা
Add object
এবং এর জন্য কোনও পদ্ধতি নেইReplace object
আপনি যদি নিজের সংগ্রহের শ্রেণি লিখছেন, এবং আপনি বিদ্যমান ক্লাসগুলির কোনও প্রসারিত করছেন বা সংগ্রহ কাঠামো ইন্টারফেসগুলির কোনও প্রয়োগ করছেন, তবে আপনার কাছে মূলত আইট্রেটর ব্যবহার করার বিকল্প নেই।
যদি কোনও কারণে (যা আমি ভাবতে পারি না) আপনি একটি কাস্টম সংগ্রহের ক্লাস তৈরি করছেন যা জাভা.ইটিল.ক্লেকশন বা জাভা.ইটিল.ম্যাপের সাথে সম্পর্কিত নয় তবে আপনার এখনও অবাস্তব বাস্তবায়ন করা উচিত যাতে লোকেরা ব্যবহার করতে পারে লুপের জন্য আপনার ক্লাস
মূল ভিন্নটি হল গণনা অপসারণ () পদ্ধতিটি প্রকাশ করে না। তদুপরি, Iterator অন্তর্নিহিত অবজেক্টে একই সাথে নেভিগেশন এবং পরিবর্তনের অনুমতি দেয় না। তাদের একযোগে পরিবর্তন বা তাই আছে কিনা তা দেখার একটি নিয়ন্ত্রণ রয়েছে এবং তাই আরও প্রক্রিয়াজাতকরণ লাগে takes সুতরাং গণনার কার্যকারিতা আইট্রেটারের চেয়ে কার্যত 50% দ্রুত। আমাদের যদি এই জাতীয় সিঙ্ক্রোনাইজেশন উপেক্ষা করে কেবল নেভিগেশনের প্রয়োজন হয় তবে কেবল গণনাটি ব্যবহার করুন।
1) Iterator এবং গণনা মধ্যে প্রধান পার্থক্য সংগ্রহ সরানোর সময় উপাদান অপসারণ হয়। আইট্রেটর সংগ্রহের ট্র্যাভারসাল চলাকালীন উপাদানটিকে মুছে ফেলতে পারে কারণ এটি () পদ্ধতিটি মুছে ফেলে। গণনার কাছে অপসারণ পদ্ধতি () নেই।
2) প্রকৃতিতে গণনা ব্যর্থ-নিরাপদ। ট্র্যাভারসাল চলাকালীন যদি সংগ্রহটি সংশোধিত করা হয় তবে এটি কনকন্টারমোডিফিকেশন এক্সেক্সশনটি ছুঁড়ে না। Iterator প্রকৃতির ব্যর্থ দ্রুত। এটি সংগ্রহের নিজস্ব অপসারণ () পদ্ধতি ব্যতীত পুনরাবৃত্ত করার সময় যদি কোনও সংশোধন করা হয় তবে এটি কনকন্টারমোডিফিকেশন এক্সেক্সশনটি ছুড়ে ফেলে।
3) গণনা একটি উত্তরাধিকার ইন্টারফেস যা ভেক্টর, হ্যাশটেবলকে অনুসরণ করার জন্য ব্যবহৃত হয়। আইট্রেটার কোনও উত্তরাধিকারের ইন্টারফেস নয়। আইট্রেটারটি হ্যাশম্যাপ, লিংকডলিস্ট, অ্যারেলিস্ট, হ্যাশসেট, ট্রিম্যাপ, ট্রিসেটের ট্র্যাভারসালের জন্য ব্যবহার করা যেতে পারে।
পুনরুক্তি এবং গণনা উভয়ই তথ্য পুনরুদ্ধার করতে ব্যবহৃত হয়, পার্থক্য হ'ল গণনাটি কেবলমাত্র উত্তরাধিকার শ্রেণিতে অর্থাৎ ভেক্টর / স্ট্যাকের জন্য ব্যবহার করা যেতে পারে তবে বাকীগুলির জন্য পুনরুক্তি ব্যবহার করা যেতে পারে। মানচিত্রে কী সেট করার জন্য গণনাও ব্যবহার করা যেতে পারে।