আমি একমত:
- ও এর সাধারণ মোড়কযুক্ত জটিলতা (1)
- একটি খারাপ
hashCode()বাস্তবায়ন একাধিক সংঘর্ষে ডেকে আনে, যার অর্থ দাঁড়ায় যে সবচেয়ে খারাপ ক্ষেত্রে প্রতিটি বস্তু একই বালতিতে চলে যায়, সুতরাং O ( N ) যদি প্রতিটি বালতি একটি দ্বারা সমর্থিত হয় List।
- জাভা 8-এর পর থেকে,
HashMapপ্রতিটি বালতিতে ব্যবহৃত নোডগুলি (সংযুক্ত তালিকার) গতিশীলভাবে প্রতিস্থাপন করে TreeNodes (লাল-কালো গাছ যখন একটি তালিকা 8 টিরও বেশি উপাদানের চেয়ে বড় হয়ে যায়) এর ফলে ও ( লগএন ) এর সবচেয়ে খারাপ কার্য সম্পাদন করে ।
তবে, আমরা যদি 100% সুনির্দিষ্ট হতে চাই তবে এটি সম্পূর্ণ সত্য নয়। hashCode()কী এবং প্রয়োগ Object(অপরিবর্তনীয় / ক্যাশেড বা সংগ্রহ হওয়া) এর ধরণটি কড়া শর্তে প্রকৃত জটিলতায়ও প্রভাব ফেলতে পারে।
আসুন নিম্নলিখিত তিনটি ক্ষেত্রে ধরে নেওয়া যাক:
HashMap<Integer, V>
HashMap<String, V>
HashMap<List<E>, V>
তাদের কি একই জটিলতা আছে? ঠিক আছে, 1 ম এর মোড়িত জটিলতা প্রত্যাশার মতো, হে (1)। তবে, বিশ্রামের জন্য, আমাদের hashCode()অনুসন্ধান উপাদানটির গণনাও করা দরকার , যার অর্থ আমাদের অ্যালগরিদমে অ্যারে এবং তালিকাগুলি অতিক্রম করতে হতে পারে।
ধরে নেওয়া যাক উপরের সমস্ত অ্যারে / তালিকাগুলির আকার কে । তারপরে HashMap<String, V>এবং এর মধ্যে HashMap<List<E>, V>ও (কে) মোতাবিভক্ত জটিলতা হবে এবং তেমনি জাভা 8-এ ও ( কে + লগএন ) সবচেয়ে খারাপ পরিস্থিতি হবে।
* নোট করুন যে Stringকীটি ব্যবহার করা আরও জটিল কেস, কারণ এটি পরিবর্তনযোগ্য এবং জাভা hashCode()একটি ব্যক্তিগত ভেরিয়েবলের ফলাফলকে ক্যাশে করে hash, তাই এটি কেবল একবারই গণনা করা হয়েছে।
/** Cache the hash code for the string */
private int hash; // Default to 0
তবে, উপরেরটির নিজস্ব খারাপ পরিস্থিতিও রয়েছে, কারণ জাভাটির String.hashCode()বাস্তবায়ন hash == 0গণনা করার আগে পরীক্ষা করছে কিনা hashCode। তবে ওহে, এমন hashcodeশূন্য নক্ষত্র রয়েছে যা শূন্যের আউটপুট দেয় , যেমন "f5a5a608", এখানে দেখুন , এই ক্ষেত্রে স্মৃতিচারণ সহায়ক হতে পারে না।