그는 가정하면 arraylist
같이 정의되어 ArrayList<String> arraylist
있다 arraylist.removeAll(arraylist)
동등 arraylist.clear()
?
그렇다면 clear()
배열 목록을 비우는 데 메소드가 더 효율적 이라고 가정 할 수 있습니까?
arraylist.removeAll(arraylist)
대신 에 사용상의주의 사항 이 arraylist.clear()
있습니까?
답변
의 소스 코드 clear()
:
public void clear() {
modCount++;
// Let gc do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
에 대한 소스 코드 :에 removeAll()
정의 된대로 AbstractCollection
:
public boolean removeAll(Collection<?> c) {
boolean modified = false;
Iterator<?> e = iterator();
while (e.hasNext()) {
if (c.contains(e.next())) {
e.remove();
modified = true;
}
}
return modified;
}
clear()
추가 메소드 호출을 모두 처리 할 필요가 없으므로 훨씬 빠릅니다.
그리고 Atrey가 지적했듯이, O (n )과 반대로 O (n 2 ) c.contains(..)
의 시간 복잡성을 증가시킵니다 .removeAll
clear
답변
시간 복잡성 ArrayList.clear()
이다 O(n)
와의 removeAll
IS O(n^2)
.
예, ArrayList.clear
훨씬 빠릅니다.
답변
이 clear()
방법은 단일의 모든 요소를 제거합니다 ArrayList
. 배열 요소를로 설정하기 때문에 빠른 작업 null
입니다.
removeAll(Collection)
에서 상속 방법은 AbstractCollection
, 당신이 메소드를 호출 컬렉션에서 인수 컬렉션의 모든 요소를 제거합니다. 관련 컬렉션 중 하나를 검색해야하기 때문에 상대적으로 느리게 작동합니다.
답변
검사는 인수가 전달 된 경우에하는 특정 최적화가되지 않는 한에 removeAll()
콜렉션 자체는 (내가는 매우 의심 이러한 최적화가 있음)가 될 것입니다 상당히 간단한보다 느리게.clear()
.
그 외에도 (그리고 적어도 똑같이 중요하다) : arraylist.removeAll(arraylist)
혼란스럽고 혼란스러운 코드입니다. “이 컬렉션을 지 웁니다”라는 말은 거꾸로 말합니다. 이해할 수있는 것보다 어떤 이점이 arraylist.clear()
있습니까?
답변
그들은 다른 목적으로 사용됩니다. clear()
클래스의 인스턴스를 지우고 removeAll()
주어진 모든 객체를 제거하고 작업 상태를 반환합니다.
답변
clear()
기본 배열을 거치고 각 항목을 null로 설정합니다.
removeAll(collection)
컬렉션 및 컬렉션이 있는지 확인하는 ArrayList를 거치게됩니다 remove(Object)
.
clear()
비교하지 않기 때문에 removeAll보다 더 빠르다고 생각합니다 .
답변
삭제할 요소를 반복하지 않기 때문에 지우기가 더 빠릅니다. 이 방법은 모든 요소를 삭제할 수 있다고 가정 할 수 있습니다.
Remove all
반드시 목록의 모든 요소를 삭제하는 것은 아니며 매개 변수로 제공된 요소 만 삭제해야합니다. 따라서 삭제해서는 안되는 것들을 유지하기 위해 더 많은 노력이 필요합니다.
설명
‘루프’는 요소를 유지할지 여부를 확인할 필요가 없음을 의미합니다. 참조를 설정할 수 있습니다null
제공된 요소 목록을 검색하지 않고 삭제할 수 있습니다.
Clear
보다 빠릅니다 deleteall
.