2012-02-18 5 views
23
List<String> listStr = new ArrayList<String>(); 

if(listStr.size == 0){ 

} 

내보기에서경우 (listStr.size == 0) {그렇지 않은 (listStr.isEmpty()) {

if(listStr.isEmpty()){ 

} 

listStr.isEmpty() 사용의 이점 중 하나가되면 것을 대 목록의 크기를 확인한 다음이를 0과 비교하면 목록이 비어 있는지 여부 만 확인합니다. 코드베이스에 if(listStr.isEmpty()) 대신에 종종 if(listStr.size == 0)이 표시되는 다른 이점이 있습니까? 이 방법으로 내가 잘 모르고있는 이유가 있을까요?

+3

1.6에서'ArrayList.isEmpty'는'return return size == 0;'로 구현됩니다. – khachik

답변

26

this question에 대한 답변을 통해 답을 얻을 수 있습니다. 기본적으로, 일부 목록의 구현에서 메서드 isEmpty()은 크기가 0인지 (따라서 성능 측면에서 볼 때 실질적으로 동일하다는 것을 확인합니다.) 그러나 다른 유형의 목록 (예 : 링크 된 목록)에서는 항목이 비어 있는지 여부를 확인하는 것보다 더 많은 시간이 필요합니다.

따라서 목록이 비어 있는지 확인하려면 isEmpty() 메서드를 사용하는 것이 편리합니다. 이러한 방법이 모든 유형의 목록에 제공되는 이유는 ArrayList, VectorLinkedList이 동일한 List 인터페이스를 구현하기 때문에 인터페이스와 관련이 있습니다. this interfaceisEmpty() 메서드를가집니다. 그런 다음 각 특정 유형의 목록은 isEmpty() 메소드 구현을 제공합니다.

+2

좋은 대답, 단 한 주석 : LinkedList의 size() 구현은 목록을 탐색하지 않고 새로운 요소가 추가되거나 제거 될 때 크기를 추적합니다. 따라서 LinkedLists의 size()와 isEmpty()의 성능 (AbstractCollection에서 상속)은 전혀 다릅니다. 즉, isEmpty()보다 느린 구현 (size)의 데이터 구조가있을 수 있지만 합리적인 구현은 그렇지 않을 것이라고 나는 동의합니다. 또한 여기에 DRY 원칙을 if size() == 0은 대부분의 isEmpty() 메소드에서 이미 완료되었습니다. –

11

아니요, 이유가 없습니다. isEmpty()은 의도를보다 명확하게 나타내므로 선호해야합니다. PMD는 심지어 a rule입니다. 그래도별로 중요하지 않습니다.

+0

정확히. 또한, javadoc에서 찾으십시오. 어쨌든 isEmpty()에서 size()를 호출하는 구현도 있습니다. – YRH

6

.size()은 데이터 구조에 따라 O (1) 또는 O (N) 일 수 있습니다. .isEmpty()은 절대로 O (N)이 아닙니다.

+1

isEmpty가 항상 O (1)이되는 이유는 모르겠지만 isEmpty()는 항상 size()만큼 빠르다는 것에 동의합니다. 그것은 데이터 구조에도 매우 잘 좌우 될 수 있습니다. 나는 크기가 O (n) 인 표준 콜렉션에 대해 알지 못합니다. 하나 있습니까? –

+1

하나를 상상해보십시오. 센티넬을 가진 구조체 - C 문자열, NULL로 끝나는 포인터 배열, nil로 끝나는 셀 목록. 이 모든 것들이 길이를 캐시하는 하이브리드 유형 밑에있을 수 있지만, 그것은 자유롭지 않습니다. ConcurrentLinkedQueue –

관련 문제