[java] ArrayList.clear ()와 ArrayList.removeAll ()의 차이점은 무엇입니까?

그는 가정하면 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(..)의 시간 복잡성을 증가시킵니다 .removeAllclear


답변

시간 복잡성 ArrayList.clear() 이다 O(n)와의 removeAllIS 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.