Collection 메소드에서 O(n) 성능을 가진 메소드는 사용에 주의해야 합니다

 

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. :star2:

원문으로 바로가기

Star This Project