collections
에 대한 메서드 호출의 시간 복잡성이 항상 명확한 것은 아닙니다. 예를 들어 대부분의 컬렉션에서 size()
메서드는 O(1)
시간이 걸리지만 ConcurrentLinkedQueue.size()
를 실행하는 데 필요한 시간은 O(n)
, 즉 컬렉션의 요소 수에 정비례합니다.
따라서 collection
의 크기에 따라 비용이 많이 드는 작업이 될 수 있습니다.
이 규칙은 다음과 같은 O(n)
복잡도를 갖는 메소드를 사용할 때 알림을 울립니다.
- ArrayList
- contains
- remove
- LinkedList
- get
- contains
- ConcurrentLinkedQueue
- size
- contains
- ConcurrentLinkedDeque
- size
- contains
- CopyOnWriteArrayList
- add
- contains
- remove
- CopyOnWriteArraySet
- add
- contains
- remove
규칙을 어긴 코드
ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue();
//...
log.info("Queue contains " + queue.size() + " elements"); // 규칙을 어긴 코드
// 역자 참고: https://kantabile.github.io/sonarkube/2022/01/03/RSPEC-2629.html
If you like SONARKUBE, don’t forget to give me a star.