1. ما هو bitset؟
ملاحظة: المحتوى التالي يأتي من JDK API:
تنفذ فئة bitset متجهًا يزداد الطلب. كل مكون من bitset لديه قيمة منطقية. فهرس أجزاء من bitset مع الأعداد الصحيحة غير السالبة. يمكن اختبار كل بت فهرسة أو تعيينها أو مسحها. من خلال عمليات XOR المنطقية والمنطقية أو المنطقية ، يمكن استخدام bitset لتعديل محتوى bitset آخر.
بشكل افتراضي ، تكون القيم الأولية لجميع البتات في المجموعة خاطئة.
كل مجموعة بت لها حجم حالي ، أي عدد أجزاء المساحة الحالية المستخدمة بواسطة مجموعة بت. لاحظ أن هذا الحجم يرتبط بتنفيذ bitset ، لذلك قد يتغير مع التنفيذ. يرتبط طول مجموعة بت بالطول المنطقي للمجموعة قليلاً ويتم تعريفه بشكل مستقل عن التنفيذ.
تنشئ فئة bitset نوعًا خاصًا من الصفيف للاحتفاظ بقيم بت. سيزداد حجم الصفيف في bitset حسب الحاجة. هذا يشبه ناقل البتات (VectorOfBits).
هذه فئة تقليدية ، ولكن تم إعادة تصميمها بالكامل في Java2.
bitset تحدد اثنين من المُنشئين.
ينشئ المنشئ الأول كائنًا افتراضيًا:
BitSet()
تتيح الطريقة الثانية للمستخدم تحديد الحجم الأولي. تتم تهيئة جميع البتات إلى 0.
BitSet(intsize)
2. مبدأ تنفيذ Java Bitset
في Java ، يقع تنفيذ BitSet في حزمة Java.Util:
تنفذ bitset من الفئة العامة ، java.io.serializable {private final static int address_bits_per_word = 6 ؛ private static int bits_per_word = 1 << address_bits_per_word ؛ private final static int int_indexk = bits_per_word - 1 ؛ 0xffffffffffffffffl ؛ private static final ObjectStreamfield [] SerialPersistenceFields = {new ObjectStreamfield ("bits" ، long []. */خاص طويل [] كلمات ؛ .....}كما ترون ، يستخدم التنفيذ الأساسي لـ bitset صفائف طويلة كهيكل تخزين داخلي ، وبالتالي فإن حجم bitset هو مضاعف عدد صحيح بحجم النوع الطويل (64 بت).
لديها اثنين من مُنشئين:
1. bitset (): إنشاء مجموعة بت جديدة ، الحجم الافتراضي هو 64 بت.
bitset العامة () {initWords (bits_per_word) ؛ sizeissticky = false ؛}2. bitset (int nbits): قم بإنشاء مجموعة صغيرة يكون حجمها الأولي كافيًا لتمثيل البتات بشكل صريح مع نطاق فهرس من 0 إلى NBITS-1.
لا يمكن أن تكون bitset العامة (int nbits) {// nbits سلبية ؛ الحجم 0 على ما يرام إذا (nbits <0) رمي negativearraysizexception جديد ("nbits <0:" + nbits) ؛ initwords (nbits) ؛ sizeisSticky = صحيح ؛ }ملحوظة:
1. إذا تم تحديد حجم التهيئة للبوتست ، فسيتم تنظيمه إلى عدد صحيح أكبر من أو يساوي 64 من هذا الرقم. على سبيل المثال ، بالنسبة لـ 64 بت ، يبلغ حجم bitset 1 ، بينما يبلغ حجم 65 بت ، حجم bitset 2 ، أي 128 بت. هذه اللائحة مخصصة بشكل أساسي لمحاذاة الذاكرة ، مع تجنب النظر في عدم التعامل مع الظروف الخاصة وتبسيط البرنامج.
2: طريقة حجم bitset: إرجاع هذه bitset لتمثيل العدد الفعلي من البتات المستخدمة عندما تكون قيمة البت هي مضاعف عدد صحيح 64.
طريقة الطول: إرجاع "الحجم المنطقي" لهذه bitset: يضاف فهرس أعلى مجموعة في المجموعة بمقدار 1
3. استخدام السيناريوهات
يتمثل سيناريو التطبيق الشائع في إجراء بعض الأعمال الإحصائية على البيانات الضخمة ، مثل تحليل السجل ، وحساب المستخدم ، إلخ.
لقد طرحت سؤالاً قبل مقابلة التدريب الداخلي مع Alibaba: هناك 10 ملايين رقم عشوائي ، ومدى الأرقام العشوائية يتراوح بين 100 مليون و 100 مليون. الآن أحتاج إلى كتابة خوارزمية لمعرفة الأرقام التي تتراوح بين 100 مليون و 100 مليون والتي ليست بأعداد عشوائية؟
مثال الكود كما يلي:
الفئة العامة alibaba {public static void main (string [] args) {random random = new random () ؛ list <integer> list = new ArrayList <> () ؛ for (int i = 0 ؛ i <10000000 ؛ i ++) {int randomresult = random.nextint (1000000000) ؛ list. لـ (int i = 0 ؛ i <list.size () ؛ i ++) {system.out.println (list.get (i)) ؛} bitset bitset = new bitset (100000000) ؛ for (int i = 0 ؛ i <10000000 ؛ i ++) {bitset.set (list.get (i)) ؛ الأرقام "+bitset.size ()) ؛ لـ (int i = 0 ؛ i <100000000 ؛ i ++) {if (! bitset.get (i)) {system.out.println (i) ؛}}}لخص
ما سبق يدور حول هذا المقال الذي يناقش سيناريوهات الاستخدام وأمثلة رمز لـ Java Bitset ، وآمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!