𝗠𝗮𝘀𝘁𝗲𝗿 𝗝𝗮𝘃𝗮 𝗖𝗼𝗹𝗹𝗲𝗰𝘁𝗶𝗼𝗻𝘀
મોટાભાગના ડેવલપર્સ ડિફોલ્ટ તરીકે ArrayList અથવા HashSet નો ઉપયોગ કરે છે. આ સરળ કાર્યો માટે કામ કરે છે. પરંતુ જ્યારે તમારે ઝડપ અથવા સ્કેલની જરૂર હોય ત્યારે તે નિષ્ફળ જાય છે.
મેં એકવાર સાદા ArrayList નો ઉપયોગ કરીને ગેમ લીડરબોર્ડ બનાવ્યું હતું. જ્યારે પણ સ્કોર બદલાતો ત્યારે હું તેને સોર્ટ કરતો હતો. તેના કારણે UI સતત ફ્રીઝ થઈ જતું હતું. હું ભાષાનો ઉપયોગ કરવાને બદલે તેની સામે લડી રહ્યો હતો.
ખોટા સાધનોનો ઉપયોગ કરવાનું બંધ કરો. ઝડપી અને સ્વચ્છ કોડ લખવા માટે આ ત્રણ વિશિષ્ટ collections નો ઉપયોગ કરો.
- Enum Constants માટે EnumSet
જો તમે enums માટે HashSet નો ઉપયોગ કરો છો, તો તમારે પરફોર્મન્સમાં નુકસાન વેઠવું પડશે. દરેક ઇન્સર્શન (insertion) enum ને એક ઓબ્જેક્ટમાં બોક્સ કરે છે. આનાથી બિનજરૂરી ઓવરહેડ વધે છે.
EnumSet બીટ વેક્ટર (bit vector) નો ઉપયોગ કરે છે. તે સિંગલ CPU ઇન્સ્ટ્રક્શનનો ઉપયોગ કરીને ચેક કરે છે.
- જ્યારે તમારી પાસે enum વેલ્યુઝનો નિશ્ચિત સેટ હોય ત્યારે તેનો ઉપયોગ કરો.
- તે 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
રેન્જ શોધવા માટે સોર્ટેડ લિસ્ટમાં મેન્યુઅલી લૂપ ચલાવવું એ ધીમું છે અને ભૂલો થવાની શક્યતા રહે છે. ઘણીવાર તમને off-by-one બગ્સનો સામનો કરવો પડે છે.
NavigableSet તમારા ડેટાને આપમેળે સોર્ટેડ રાખે છે. તે subsets માટે O(log n) લુકઅપ્સ પ્રદાન કરે છે.
- હાઈ-સ્કોર ટેબલ અથવા પ્રાઇસ રેન્જ માટે તેનો ઉપયોગ કરો.
- ચોક્કસ રેન્જ મેળવવા માટે
headSet()અથવાsubSet()નો ઉપયોગ કરો. - તે મેન્યુઅલ સોર્ટિંગ કોડની જરૂરિયાત દૂર કરે છે.
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) ધીમી પડી જાય છે. જો એક થ્રેડ લખતું હોય અને બીજું વાંચતું હોય, તો તે ConcurrentModificationException પણ પેદા કરે છે.
CopyOnWriteArrayList દરેક રાઈટ (write) પર એરેની નવી કોપી બનાવે છે. રીડર્સ એરેના સ્નેપશોટ (snapshot) ને જુએ છે.
- ઇવેન્ટ લિસનર્સ અથવા કોન્ફિગરેશન સેટિંગ્સ માટે તેનો ઉપયોગ કરો.
- જ્યારે રાઈટ કરતા રીડ્સ વધુ વારંવાર થતા હોય ત્યારે તેનો ઉપયોગ કરો.
- તે lock-free રીડ્સની મંજૂરી આપે છે.
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.
હંમેશા એ જ બે કલેક્શનનો ઉપયોગ કરવાનું બંધ કરો. તમારા ડેટા પેટર્ન સાથે મેળ ખાતા સાધનની પસંદગી કરો.
સ્ત્રોત: https://dev.to/timevolt/the-java-collections-force-mastering-the-hidden-gems-like-a-jedi-4438