2013-11-04 2 views
7

회사 필기 테스트에서 java의 ArrayList와 관련된 질문을 발견했습니다. 내 질문은 실제 질문의 일부에 지나지 않습니다.하나의 배열리스트를 다른 것으로 복사하는 가장 빠른 방법

void function(List<E> l) 
{ 
    List<E> m = new ArrayList<E>(l); 
} 

문제는 기본적으로이 복사 작업을 최적화하기 위해 요청 :

우리가 다른 하나 개의 ArrayList를 복사하려면 다음과 같은 기능을 가지고 말할 수 있습니다. 목록에는 백만 개의 항목이 포함될 수 있습니다. 나는 다음과 같은 방법을 시도 :

Collections.copy

System.arraycopy에

및 addAll이

는하지만이 모두가 주어진 방법보다 느린 것 같다. 주어진 메소드보다 빠르거나 사용할 수있는 최선의 메소드가 필요한 메소드가 필요합니까?

+0

아니요, 사용 가능한 가장 좋은 방법입니다. –

+0

Collections.unmodifiableList (list)가 더 빠르지 만 의도에 적합하지 않을 수 있습니다 (질문에서 매우 잘못 정의 됨). – Durandal

답변

3

음 우선 벤치 마크 오류가 있다고 생각합니다. public ArrayList(Collection<? extends E> c)은 내부적으로 System.arraycopy (소스 here)을 사용하는 Arrays.copyOf을 사용합니다. 따라서 System.arraycopy 또는 addAll은 언급 한 코드보다 느려질 수 없습니다.

질문에 대해서는 작동이 O(n)이어야하므로 질문 방법에 대해 (유형 정보를 잃어 버리지 않으려면 클록주기를 절약 할 수 있지만 매우 사소한) 빠른 방법이 있어서는 안됩니다. 그리고 System.arraycopy은 네이티브 호출을 사용하여 빠르게 복사하는 가장 빠른 방법입니다.

0

더러워지면 Unsafe가 약간 빨라집니다. 그러나 리플렉션을 사용하여 ArrayLists의 기본 Object 배열에 액세스해야합니다. 공연과 관련하여 사사로운 상황에 처한 경우에만 사용하십시오.

public native void copyMemory (java.lang.Object o, long l, java.lang.Object o1, long l1, long l2);

+0

실제로 System.arraycopy()보다 빠르지 않아야합니다. 왜냐하면 아마도 매우 유사한 기본 코드를 호출하기 때문입니다. –

+0

필요하지 않습니다. 안전하지 않은 사본은 HotSpot의 내장이며 경계 검사를하지 않습니다. 그러나 많은 작은 크기의 배열을 복사하는 경우에만 차이가 최소화됩니다. 아마 그럴 가치가없는 사람은 안전하지 않은 버전을 사용할 수 있습니다. VM은 예측할 수 없습니다 :-) –

관련 문제