𝗠𝗮𝘀omo ya Kina ya Java Collections
Watenda programu wengi hutumia ArrayList au HashSet kama chaguo la kawaida. Hii inafaa kwa kazi rahisi. Lakini inafeli unapohitaji kasi au uwezo mkubwa (scale).
Wakati mmoja nilijenga jedwali la msimamo (leaderboard) la mchezo nikitumia ArrayList ya kawaida. Nilipanga upya (sort) kila wakati alama ilipobadilika. Kiolesura (UI) kiliganda mara kwa mara. Nilikuwa nikipambana na lugha badala ya kuitumia.
Acha kutumia zana zisizo sahihi. Tumia mkusanyiko (collections) haya matatu maalum ili kuandika kodi yenye kasi zaidi na safi zaidi.
- EnumSet kwa ajili ya Enum Constants
Ikiwa unatumia HashSet kwa enums, unalipia gharama ya utendaji (performance tax). Kila uingizaji (insertion) huifanya enum kuwa object. Hii huongeza mzigo usio wa lazima (overhead).
EnumSet hutumia bit vector. Inafanya ukaguzi kwa kutumia maelekezo mmoja tu ya CPU (single CPU instruction).
- Itumie unapokuwa na seti maalum ya thamani za enum.
- Inapunguza ukusanyaji wa taka (garbage collection).
- Inatoa ongezeko la kasi mara 10 katika mizunguko (loops) inayofanya kazi kwa kasi.
Before:
Set<Ability> abilities = new HashSet<>();
abilities.add(Ability.FIRE);
After:
EnumSet<Ability> abilities = EnumSet.of(Ability.FIRE);
- NavigableSet kwa ajili ya Range Queries
Kupitia orodha iliyopangwa kwa mkono (manually looping) ili kupata kipindi fulani (range) ni polepole na inaweza kusababisha makosa. Mara nyingi huishia kupata makosa ya 'off-by-one'.
NavigableSet huweka data yako ikiwa imepangwa moja kwa moja. Inatoa utafutaji wa O(log n) kwa subsets.
- Itumie kwa majedwali ya alama za juu au vipindi vya bei.
- Tumia
headSet()ausubSet()ili kupata vipindi maalum. - Inaondoa hitaji la kodi ya kupanga upya kwa mkono.
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));
- CopyOnWriteArrayList kwa ajili ya Orodha Zinazosomeka Mara Nyingi
Kutumia synchronized blocks kwenye ArrayList hupunguza kasi ya kila usomaji. Pia husababisha ConcurrentModificationException ikiwa thread moja inaandika wakati nyingine inasoma.
CopyOnWriteArrayList hutengeneza nakala mpya ya array kila wakati wa kuandika. Wasomaji huangalia nakala ya papo hapo (snapshot) ya array.
- Itumie kwa event listeners au mipangilio ya usanidi (configuration settings).
- Itumie wakati usomaji unapotokea mara nyingi zaidi kuliko uandishi.
- Inaruhusu usomaji bila kufunga (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.
Acha kutumia koleksheni mbili zilezile kila mara. Chagua chombo kinachoendana na muundo wa data yako.
Chanzo: https://dev.to/timevolt/the-java-collections-force-mastering-the-hidden-gems-like-a-jedi-4438