𝗠𝗮𝘀𝘁𝗲𝗿 𝗝𝗮𝘃𝗮 𝗖𝗼𝗹𝗹𝗲𝗰𝘁𝗶𝗼𝗻𝘀

ਜ਼ਿਆਦਾਤਰ ਡਿਵੈਲਪਰਾਂ ਦੀ ਪਹਿਲੀ ਪਸੰਦ ArrayList ਜਾਂ HashSet ਹੁੰਦੀ ਹੈ। ਇਹ ਸਧਾਰਨ ਕੰਮਾਂ ਲਈ ਠੀਕ ਹੈ, ਪਰ ਜਦੋਂ ਤੁਹਾਨੂੰ ਤੇਜ਼ੀ ਜਾਂ ਵੱਡੇ ਪੱਧਰ (scale) ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ, ਤਾਂ ਇਹ ਫੇਲ ਹੋ ਜਾਂਦਾ ਹੈ।

ਮੈਂ ਇੱਕ ਵਾਰ ਇੱਕ ਸਾਧਾਰਨ ArrayList ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਗੇਮ ਲੀਡਰਬੋਰਡ ਬਣਾਇਆ ਸੀ। ਹਰ ਵਾਰ ਸਕੋਰ ਬਦਲਣ 'ਤੇ ਮੈਂ ਇਸਨੂੰ ਸੌਰਟ (sort) ਕਰਦਾ ਸੀ। UI ਲਗਾਤਾਰ ਫ੍ਰੀਜ਼ ਹੋ ਜਾਂਦਾ ਸੀ। ਮੈਂ ਭਾਸ਼ਾ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਬਜਾਏ ਉਸ ਨਾਲ ਲੜ ਰਿਹਾ ਸੀ।

ਗਲਤ ਟੂਲਸ ਦੀ ਵਰਤੋਂ ਕਰਨਾ ਬੰਦ ਕਰੋ। ਤੇਜ਼ ਅਤੇ ਸਾਫ਼ ਕੋਡ ਲਿਖਣ ਲਈ ਇਹਨਾਂ ਤਿੰਨ ਵਿਸ਼ੇਸ਼ ਕਲੈਕਸ਼ਨਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ।

  1. Enum Constants ਲਈ EnumSet

ਜੇਕਰ ਤੁਸੀਂ enums ਲਈ HashSet ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਨੂੰ ਪਰਫਾਰਮੈਂਸ ਦਾ ਨੁਕਸਾਨ ਉਠਾਉਣਾ ਪੈਂਦਾ ਹੈ। ਹਰ ਇਨਸਰਸ਼ਨ (insertion) enum ਨੂੰ ਇੱਕ ਆਬਜੈਕਟ ਵਿੱਚ ਬਦਲ ਦਿੰਦਾ ਹੈ, ਜੋ ਬੇਲੋੜਾ ਓਵਰਹੈੱਡ (overhead) ਵਧਾਉਂਦਾ ਹੈ।

EnumSet ਇੱਕ bit vector ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ। ਇਹ ਇੱਕ ਸਿੰਗਲ CPU instruction ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਚੈੱਕ ਕਰਦਾ ਹੈ।

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

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

  1. Range Queries ਲਈ NavigableSet

ਰੇਂਜ ਲੱਭਣ ਲਈ ਇੱਕ ਸੌਰਟ ਕੀਤੀ ਲਿਸਟ ਵਿੱਚ ਮੈਨੂਅਲੀ ਲੂਪ ਚਲਾਉਣਾ ਹੌਲੀ ਹੁੰਦਾ ਹੈ ਅਤੇ ਇਸ ਵਿੱਚ ਗਲਤੀਆਂ ਹੋਣ ਦੀ ਸੰਭਾਵਨਾ ਹੁੰਦੀ ਹੈ। ਅਕਸਰ ਤੁਹਾਡੇ ਨਾਲ off-by-one ਬੱਗਸ (bugs) ਹੋ ਜਾਂਦੇ ਹਨ।

NavigableSet ਤੁਹਾਡੇ ਡੇਟਾ ਨੂੰ ਆਪਣੇ ਆਪ ਸੌਰਟ ਰੱਖਦਾ ਹੈ। ਇਹ subsets ਲਈ O(log n) ਲੁੱਕਅਪ (lookups) ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ।

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. Read-Heavy Lists ਲਈ CopyOnWriteArrayList

ArrayList 'ਤੇ synchronized blocks ਦੀ ਵਰਤੋਂ ਕਰਨ ਨਾਲ ਹਰ ਰੀਡ (read) ਹੌਲੀ ਹੋ ਜਾਂਦੀ ਹੈ। ਜੇਕਰ ਇੱਕ ਥ੍ਰੈਡ (thread) ਲਿਖ ਰਿਹਾ ਹੋਵੇ ਅਤੇ ਦੂਜਾ ਪੜ੍ਹ ਰਿਹਾ ਹੋਵੇ, ਤਾਂ ਇਹ ConcurrentModificationException ਦਾ ਕਾਰਨ ਵੀ ਬਣਦਾ ਹੈ।

CopyOnWriteArrayList ਹਰ ਵਾਰ ਲਿਖਣ (write) 'ਤੇ ਐਰੇ (array) ਦੀ ਇੱਕ ਨਵੀਂ ਕਾਪੀ ਬਣਾਉਂਦਾ ਹੈ। ਪੜ੍ਹਨ ਵਾਲੇ (readers) ਐਰੇ ਦੇ ਇੱਕ snapshot ਨੂੰ ਦੇਖਦੇ ਹਨ।

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