𝗠𝗮𝘀𝘁𝗲𝗿 𝗝𝗮𝘃𝗮 𝗖𝗼𝗹𝗹𝗲𝗰𝘁𝗶𝗼𝗻𝘀
ਜ਼ਿਆਦਾਤਰ ਡਿਵੈਲਪਰਾਂ ਦੀ ਪਹਿਲੀ ਪਸੰਦ ArrayList ਜਾਂ HashSet ਹੁੰਦੀ ਹੈ। ਇਹ ਸਧਾਰਨ ਕੰਮਾਂ ਲਈ ਠੀਕ ਹੈ, ਪਰ ਜਦੋਂ ਤੁਹਾਨੂੰ ਤੇਜ਼ੀ ਜਾਂ ਵੱਡੇ ਪੱਧਰ (scale) ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ, ਤਾਂ ਇਹ ਫੇਲ ਹੋ ਜਾਂਦਾ ਹੈ।
ਮੈਂ ਇੱਕ ਵਾਰ ਇੱਕ ਸਾਧਾਰਨ ArrayList ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਗੇਮ ਲੀਡਰਬੋਰਡ ਬਣਾਇਆ ਸੀ। ਹਰ ਵਾਰ ਸਕੋਰ ਬਦਲਣ 'ਤੇ ਮੈਂ ਇਸਨੂੰ ਸੌਰਟ (sort) ਕਰਦਾ ਸੀ। UI ਲਗਾਤਾਰ ਫ੍ਰੀਜ਼ ਹੋ ਜਾਂਦਾ ਸੀ। ਮੈਂ ਭਾਸ਼ਾ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਬਜਾਏ ਉਸ ਨਾਲ ਲੜ ਰਿਹਾ ਸੀ।
ਗਲਤ ਟੂਲਸ ਦੀ ਵਰਤੋਂ ਕਰਨਾ ਬੰਦ ਕਰੋ। ਤੇਜ਼ ਅਤੇ ਸਾਫ਼ ਕੋਡ ਲਿਖਣ ਲਈ ਇਹਨਾਂ ਤਿੰਨ ਵਿਸ਼ੇਸ਼ ਕਲੈਕਸ਼ਨਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ।
- Enum Constants ਲਈ EnumSet
ਜੇਕਰ ਤੁਸੀਂ enums ਲਈ HashSet ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਨੂੰ ਪਰਫਾਰਮੈਂਸ ਦਾ ਨੁਕਸਾਨ ਉਠਾਉਣਾ ਪੈਂਦਾ ਹੈ। ਹਰ ਇਨਸਰਸ਼ਨ (insertion) enum ਨੂੰ ਇੱਕ ਆਬਜੈਕਟ ਵਿੱਚ ਬਦਲ ਦਿੰਦਾ ਹੈ, ਜੋ ਬੇਲੋੜਾ ਓਵਰਹੈੱਡ (overhead) ਵਧਾਉਂਦਾ ਹੈ।
EnumSet ਇੱਕ bit vector ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ। ਇਹ ਇੱਕ ਸਿੰਗਲ CPU instruction ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਚੈੱਕ ਕਰਦਾ ਹੈ।
- ਇਸਦੀ ਵਰਤੋਂ ਉਦੋਂ ਕਰੋ ਜਦੋਂ ਤੁਹਾਡੇ ਕੋਲ enum values ਦਾ ਇੱਕ ਨਿਸ਼ਚਿਤ ਸਮੂਹ ਹੋਵੇ।
- ਇਹ garbage collection ਨੂੰ ਘਟਾਉਂਦਾ ਹੈ।
- ਇਹ tight loops ਵਿੱਚ 10 ਗੁਣਾ ਤੇਜ਼ੀ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ।
Before:
Set<Ability> abilities = new HashSet<>();
abilities.add(Ability.FIRE);
After:
EnumSet<Ability> abilities = EnumSet.of(Ability.FIRE);
- Range Queries ਲਈ NavigableSet
ਰੇਂਜ ਲੱਭਣ ਲਈ ਇੱਕ ਸੌਰਟ ਕੀਤੀ ਲਿਸਟ ਵਿੱਚ ਮੈਨੂਅਲੀ ਲੂਪ ਚਲਾਉਣਾ ਹੌਲੀ ਹੁੰਦਾ ਹੈ ਅਤੇ ਇਸ ਵਿੱਚ ਗਲਤੀਆਂ ਹੋਣ ਦੀ ਸੰਭਾਵਨਾ ਹੁੰਦੀ ਹੈ। ਅਕਸਰ ਤੁਹਾਡੇ ਨਾਲ off-by-one ਬੱਗਸ (bugs) ਹੋ ਜਾਂਦੇ ਹਨ।
NavigableSet ਤੁਹਾਡੇ ਡੇਟਾ ਨੂੰ ਆਪਣੇ ਆਪ ਸੌਰਟ ਰੱਖਦਾ ਹੈ। ਇਹ subsets ਲਈ O(log n) ਲੁੱਕਅਪ (lookups) ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ।
- ਇਸਦੀ ਵਰਤੋਂ ਹਾਈ-ਸਕੋਰ ਟੇਬਲ ਜਾਂ ਕੀਮਤ ਦੀਆਂ ਰੇਂਜਾਂ ਲਈ ਕਰੋ।
- ਖਾਸ ਰੇਂਜਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ
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) ਹੌਲੀ ਹੋ ਜਾਂਦੀ ਹੈ। ਜੇਕਰ ਇੱਕ ਥ੍ਰੈਡ (thread) ਲਿਖ ਰਿਹਾ ਹੋਵੇ ਅਤੇ ਦੂਜਾ ਪੜ੍ਹ ਰਿਹਾ ਹੋਵੇ, ਤਾਂ ਇਹ ConcurrentModificationException ਦਾ ਕਾਰਨ ਵੀ ਬਣਦਾ ਹੈ।
CopyOnWriteArrayList ਹਰ ਵਾਰ ਲਿਖਣ (write) 'ਤੇ ਐਰੇ (array) ਦੀ ਇੱਕ ਨਵੀਂ ਕਾਪੀ ਬਣਾਉਂਦਾ ਹੈ। ਪੜ੍ਹਨ ਵਾਲੇ (readers) ਐਰੇ ਦੇ ਇੱਕ snapshot ਨੂੰ ਦੇਖਦੇ ਹਨ।
- ਇਸਦੀ ਵਰਤੋਂ event listeners ਜਾਂ configuration settings ਲਈ ਕਰੋ।
- ਇਸਦੀ ਵਰਤੋਂ ਉਦੋਂ ਕਰੋ ਜਦੋਂ ਲਿਖਣ (writes) ਨਾਲੋਂ ਪੜ੍ਹਨਾ (reads) ਕਿਤੇ ਜ਼ਿਆਦਾ ਹੁੰਦਾ ਹੋਵੇ।
- ਇਹ 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.
ਹਮੇਸ਼ਾ ਉਹੀ ਦੋ ਕਲੈਕਸ਼ਨਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨਾ ਬੰਦ ਕਰੋ। ਉਹ ਟੂਲ ਚੁਣੋ ਜੋ ਤੁਹਾਡੇ ਡੇਟਾ ਪੈਟਰਨ ਦੇ ਅਨੁਕੂਲ ਹੋਵੇ।
ਸਰੋਤ: https://dev.to/timevolt/the-java-collections-force-mastering-the-hidden-gems-like-a-jedi-4438