𝗠𝗮𝘀𝘁𝗲𝗿 𝗝𝗮𝘃𝗮 𝗖𝗼𝗹𝗹𝗲𝗰𝘁𝗶𝗼𝗻𝘀
زیادہ تر ڈویلپرز ArrayList یا HashSet کا استعمال کرتے ہیں۔ یہ سادہ کاموں کے لیے تو ٹھیک ہے، لیکن جب آپ کو رفتار یا پیمانے (scale) کی ضرورت ہو تو یہ ناکام ہو جاتا ہے۔
میں نے ایک بار ایک سادہ ArrayList کا استعمال کرتے ہوئے گیم لیڈر بورڈ بنایا تھا۔ جب بھی اسکور تبدیل ہوتا، میں اسے دوبارہ ترتیب (sort) دیتا تھا۔ اس سے UI مسلسل فریز ہو جاتا تھا۔ میں زبان کا استعمال کرنے کے بجائے اس سے لڑ رہا تھا۔
غلط ٹولز کا استعمال بند کریں۔ تیز رفتار اور بہتر کوڈ لکھنے کے لیے ان تین مخصوص collections کا استعمال کریں۔
- Enum Constants کے لیے EnumSet
اگر آپ enums کے لیے HashSet استعمال کرتے ہیں، تو آپ کو کارکردگی (performance) کی قیمت چکانی پڑتی ہے۔ ہر insertion enum کو ایک object میں تبدیل کر دیتا ہے، جس سے غیر ضروری بوجھ (overhead) بڑھ جاتا ہے۔
EnumSet ایک bit vector استعمال کرتا ہے۔ یہ صرف ایک CPU instruction کے ذریعے چیک کرتا ہے۔
- اسے تب استعمال کریں جب آپ کے پاس enum values کا ایک مقررہ سیٹ ہو۔
- یہ garbage collection کو کم کرتا ہے۔
- یہ tight loops میں 10x تک رفتار میں اضافہ کرتا ہے۔
Before:
Set<Ability> abilities = new HashSet<>();
abilities.add(Ability.FIRE);
After:
EnumSet<Ability> abilities = EnumSet.of(Ability.FIRE);
- Range Queries کے لیے NavigableSet
کسی رینج کو تلاش کرنے کے لیے ترتیب شدہ لسٹ (sorted list) میں دستی طور پر لوپ چلانا سست ہے اور غلطیوں کا باعث بن سکتا ہے۔ اکثر آپ کو off-by-one بگ کا سامنا کرنا پڑتا ہے۔
NavigableSet آپ کے ڈیٹا کو خود بخود ترتیب میں رکھتا ہے۔ یہ subsets کے لیے O(log n) lookups فراہم کرتا ہے۔
- اسے ہائی اسکور ٹیبلز یا قیمتوں کی رینج (price ranges) کے لیے استعمال کریں۔
- مخصوص رینجز حاصل کرنے کے لیے
headSet()یاsubSet()کا استعمال کریں۔ - یہ دستی طور پر sorting کوڈ لکھنے کی ضرورت کو ختم کر دیتا ہے۔
Before:
Collections.sort(scores);
List<Integer> topTen = scores.subList(size - 10, size);
After:
NavigableSet<Integer> scores = new TreeSet<>(Comparator.reverseOrder());
scores.add(1542);
NavigableSet<Integer> topTen = scores.headSet(scores.first(), true).stream().limit(10).collect(Collectors.toCollection(TreeSet::new));
- Read-Heavy Lists کے لیے CopyOnWriteArrayList
ArrayList پر synchronized blocks کا استعمال ہر read کو سست کر دیتا ہے۔ اگر ایک thread لکھ رہا ہو اور دوسرا پڑھ رہا ہو، تو یہ ConcurrentModificationException کا باعث بھی بنتا ہے۔
CopyOnWriteArrayList ہر write پر array کی ایک نئی کاپی بناتا ہے۔ Readers array کے ایک snapshot کو دیکھتے ہیں۔
- اسے event listeners یا configuration settings کے لیے استعمال کریں۔
- اسے تب استعمال کریں جب reads، writes کے مقابلے میں بہت زیادہ ہوں۔
- یہ lock-free reads کی اجازت دیتا ہے۔
Before:
List<String> log = Collections.synchronizedList(new ArrayList<>());
// Iterating here can crash if a writer joins in.
After:
CopyOnWriteArrayList<String> log = new CopyOnWriteArrayList<>();
// Iteration is safe and never crashes.
ہمیشہ ایک ہی دو کلیکشنز (collections) کا انتخاب کرنا بند کریں۔ ایسا ٹول منتخب کریں جو آپ کے ڈیٹا کے پیٹرن (data pattern) کے مطابق ہو۔
ماخذ: https://dev.to/timevolt/the-java-collections-force-mastering-the-hidden-gems-like-a-jedi-4438