2013-12-13 1 views
0

자바를 사용하고 있습니다. 배열의 시작 부분에 추가하고 싶습니다. 모든 변수를 배열의 한 공간 위로 옮기고, 새로운 변수를 인덱스 0에 추가하거나 ArrayList를 사용하는 것이 더 효율적입니까?효율성면에서 첫 번째 인덱스에 추가 할 때 ArrayList를 만들거나 배열을 사용하는 것이 더 빠릅니까?

ArrayList가 나를 위해 값을 이동한다는 것을 알고 있지만 매우 비효율적이라고 들었습니다. 그렇습니까?

이 작업을 효율적으로 수행 할 수있는 다른 API가 있습니까?

+0

[Java 성능 - ArrayLists 대 다수의 빠른 읽기를위한 배열] 가능한 복제본 (http://stackoverflow.com/questions/1182892/java-performance-arraylists-versus-arrays-for-lots-of-fast- 읽음) – Raptor

+0

첫 번째 색인에 한 번만 추가 할 예정입니까? 또는 목록 당 많은 시간? LinkedList는 머리글에 요소를 추가 할 때 훨씬 효율적입니다. 목록의 모든 요소에 무작위로 액세스하지 않아도됩니다. – amit

+0

@ShivanRaptor 그것은 속임수일까요? 링크 된 질문은 많은 읽기에 관한 것입니다. 그는 ** 목록 **의 머리에 요소를 쓰는 것에 대해 묻습니다. – amit

답변

2

메서드 호출 오버 헤드와 약간의 유지 관리 비용 외에도 ArrayList는 배열 요소를 직접 복사하는 것보다 비효율적이지 않습니다. ArrayList의 일부 구현은 ArrayDeque가 수행하는 것처럼 인덱스를 0보다 배후 배열의 다른 곳에서 목록을 시작할 수있게함으로써 데이터 이동시 더 빠를 수도 있습니다.

0

ArrayList는 또한 배열을 내부적으로 사용하여 데이터를 저장합니다. 그러나 Sun/Oracle은 인덱스 0에 항목을 추가하고 색인 1부터 시작하여 항목을 이동시키는 가장 빠른 알고리즘을 추가했습니다. 따라서 더 간단한 코딩을 위해 ArrayList를 사용하는 것이 좋습니다. 그러나 더 나은 알고리즘을 조정할 수 있다면 Array로 이동하십시오.

2

처음부터 삽입 할 때마다 지금까지 추가 한 내용을 이동해야하기 때문에 어느 쪽도 효율적이지 않습니다. 즉, N 요소를 삽입하는 데 O (N) 시간이 걸리므로 오히려 비효율적입니다.

LinkedList<T>은 목록 시작 부분에 삽입해야하는 경우에 적합합니다. 그러나 메모리 오버 헤드가있어 인덱스를 기반으로 한 빠른 검색을 허용하지 않습니다.

모든 요소가 삽입 될 때까지 목록을 사용할 필요가없는 경우 목록의 뒤쪽에 요소를 삽입 한 다음 사용하기 전에 목록을 뒤집는 것이 좋습니다.

0

매우 빈번한 첫 번째 색인에 추가하는 경우 배열의 끝에 1에서 모든 색인을 재배치해야하므로 비용이 많이 듭니다. 즉, 상위 요소를 조정하기 위해 크기를 조정합니다 . LinkedLists는 이러한 경우 더 나은 성능을 제공하지만 Random Access 비헤이비어를 구현하지 않습니다.

0

ArrayList은 정상적인 사용에 충분한 성능을 제공하며 무엇이 더 중요한지 안전합니다. 따라서 범위를 벗어나는 것과 null 포인터 등을 걱정할 필요가 없습니다.

"빠르 게"만들려면 예를 들어 ArrayList의 용량 검사 등을 제거 할 수 있습니다. 그런 다음 당신은 당신이 점점됩니다하지 않을 경우 때문에, 올바른 매개 변수를 설정하고 있는지 확인해야 함을 의미 코드 안전하지 않은을하고 있습니다 IndexOutOfBounds

당신은 더에 대한 매우 흥미로운 포스트에 대한 Trove - using primitive collections for performance을 읽을 수 있습니다 정보.

하지만 100 회 중 99 회는 실제 필요가 없습니다. 기억하고 나를 따라 반복 :

조기 최적화는 모든 악의 뿌리입니다.

게다가 JDK 소스 코드를 직접 확인하는 것이 좋습니다. 당신은 많이 배울 수 있고, 분명히 그것이 어떻게 만들어 졌는지 볼 수 있습니다.

+0

@MarkoTopolnik oh oh, thanks :) –

관련 문제