𝗠𝗮𝘀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.

  1. 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).

Before: Set<Ability> abilities = new HashSet<>(); abilities.add(Ability.FIRE);

After: EnumSet<Ability> abilities = EnumSet.of(Ability.FIRE);

  1. 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.

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));

  1. 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.

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