فئة هاشتابل
يرث Hashtable واجهة الخريطة وينفذ جدول تجزئة لتعيين قيمة المفتاح. يمكن استخدام أي كائن غير فارغ كمفتاح أو قيمة.
لإضافة البيانات، استخدم put(key,value)، ولإزالة البيانات، استخدم get(key). تكلفة الوقت لهاتين العمليتين الأساسيتين ثابتة.
يقوم Hashtable بضبط الأداء من خلال معلمتين: السعة الأولية وعامل الحمولة. عادةً ما يحقق عامل التحميل الافتراضي 0.75 توازنًا أفضل بين الزمان والمكان. يمكن أن تؤدي زيادة عامل التحميل إلى توفير المساحة ولكن سيزيد وقت البحث المقابل، مما سيؤثر على عمليات مثل الحصول والوضع.
مثال بسيط لاستخدام Hashtable هو كما يلي. ضع 1 و2 و3 في Hashtable، ومفاتيحها هي "واحد" و"اثنان" و"ثلاثة" على التوالي:
أرقام جدول التجزئة = جدول التجزئة الجديد () ؛
أرقام.put("واحد"، عدد صحيح جديد(1));
number.put("two", new Integer(2));
number.put("ثلاثة", عدد صحيح جديد(3));
لاسترداد رقم، مثل 2، استخدم المفتاح المقابل:
عدد صحيح n = (عدد صحيح)numbers.get("two");
System.out.println("two =" + n);
نظرًا لأن الكائن المستخدم كمفتاح سيحدد موضع القيمة المقابلة عن طريق حساب دالة التجزئة الخاصة به، فإن أي كائن يستخدم كمفتاح يجب أن يطبق طريقتي hashCode وequal. ترث أساليب hashCode وequals من كائن الفئة الجذر. إذا كنت تستخدم فئة مخصصة كمفتاح، فكن حذرًا للغاية وفقًا لتعريف دالة التجزئة، إذا كان الكائنان متماثلان، أي obj1.equals(. obj2)=صحيح، فيجب أن يكون رمز التجزئة الخاص بهما هو نفسه، ولكن إذا كان هناك كائنان مختلفان، فلن يكون رمز التجزئة الخاص بهما مختلفًا بالضرورة. إذا كان رمز التجزئة لكائنين مختلفين هو نفسه، فإن هذه الظاهرة ستتسبب في حدوث تعارض لزيادة الوقت الإضافي لتشغيل جدول التجزئة، حاول تحديد طريقة hashCode () محددة جيدًا لتسريع عمليات جدول التجزئة.
إذا كان الكائن نفسه يحتوي على كود تجزئة مختلف، فإن تشغيل جدول التجزئة سيكون له نتائج غير متوقعة (ترجع طريقة الحصول المتوقعة قيمة فارغة). لتجنب هذه المشكلة، ما عليك سوى تذكر شيء واحد: تجاوز طريقة يساوي وطريقة hashCode في نفس الوقت. الوقت لا تكتب واحد منهم فقط. Hashtable متزامن.
فئة HashMap
يشبه HashMap Hashtable، باستثناء أن HashMap غير متزامن ويسمح بالقيمة الخالية، أي القيمة الخالية والمفتاح الفارغ. ، ولكن عند التعامل مع HashMap كمجموعة (يمكن لأسلوب القيم () إرجاع مجموعة)، يتناسب الحمل الزمني للعمليات الفرعية التكرارية مع سعة HashMap. لذلك، إذا كان أداء العمليات التكرارية مهمًا جدًا، فلا تقم بتعيين السعة الأولية لـ HashMap على مستوى عالٍ جدًا أو عامل التحميل على مستوى منخفض جدًا.
فئة WeakHashMap
WeakHashMap عبارة عن HashMap محسّن ينفذ "مراجع ضعيفة" للمفاتيح إذا لم يعد يتم الرجوع إلى المفتاح خارجيًا، فيمكن إعادة تدوير المفتاح بواسطة GC.
HashSet يرجى الرجوع إلى وصف Set
Set عبارة عن مجموعة لا تحتوي على عناصر مكررة، أي أن أي عنصرين e1 وe2 لهما e1.equals(e2)=false، وتحتوي Set على عنصر فارغ واحد على الأكثر.
يحتوي مُنشئ المجموعة على قيد يتمثل في أن معلمة المجموعة التي تم تمريرها لا يمكن أن تحتوي على عناصر مكررة.
يرجى ملاحظة: يجب التعامل مع الكائنات القابلة للتغيير بعناية. إذا قام عنصر قابل للتغيير في مجموعة بتغيير حالته مما تسبب في Object.equals(Object)=true، فسوف يسبب بعض المشاكل.
هناك تطبيقان شائعان للمجموعة هما HashSet وTreeSet. إن تحديد أي واحد يجب استخدامه أمر بسيط جدًا. HashSet أسرع بكثير (الوقت الثابت مقابل وقت التسجيل لمعظم العمليات)، لكنه لا يوفر ضمانات الطلب. إذا كنت بحاجة إلى استخدام العمليات في SortedSet، أو إذا كان التكرار المتسلسل مهمًا بالنسبة لك، فاستخدم TreeSet. بخلاف ذلك، استخدم HashSet. إنها مقامرة عادلة بالنسبة لك ألا تستخدم HashSet في معظم الأوقات.
شيء واحد يجب أن تضعه في الاعتبار بشأن HashSets هو أن التكرار خطي من حيث مجموع عدد الإدخالات والسعة. لذلك، إذا كان أداء التكرار مهمًا، فيجب اختيار سعة أولية مناسبة بعناية. إن اختيار سعة كبيرة جدًا يهدر المساحة والوقت. السعة الأولية الافتراضية هي 101، وهي بشكل عام أكثر مما تحتاج إليه. يمكنك استخدام مُنشئ int لتحديد السعة الأولية. السعة الأولية لـ HashSet المراد تخصيصها هي 17:
Set s= new HashSet(17);
تحتوي HashSets أيضًا على "معلمة ضبط" تسمى عامل التحميل. إذا كنت قلقًا جدًا بشأن استخدام مساحة HashSet، فاقرأ نص HashSet للحصول على التفاصيل. خلاف ذلك، مجرد استخدام القيمة الافتراضية. إذا قبلت عامل التحميل الافتراضي، ولكنك تريد تحديد سعة أولية، فاختر رقمًا يبلغ ضعف السعة التي تتوقع أن تنمو بها مجموعتك تقريبًا. إذا كان تخمينك خاطئًا، فمن الممكن أن ينمو أو يضيع مساحة صغيرة فقط. ولكن لا توجد مشاكل كبيرة. إذا كنت تعرف القيمة الأفضل للحجم الصحيح، فاستخدمها إذا كنت لا تعرف، فاستخدم قيمة قديمة، أو استخدم قيمة زوجية. انها حقا ليست مهمة جدا. هذه الأشياء تجعل HashSet أفضل قليلاً.
لا يحتوي TreeSet على معلمات ضبط. بالإضافة إلى الاستنساخ، لدى HashSet وTreeSet فقط تلك العمليات التي تتطلبها الواجهات الخاصة بهما (Set وTreeSet)، ولا توجد عمليات أخرى.