2012-05-29 4 views
31

나는 ArrayList를위한 자바 문서를보고 ArrayList를의 초기 용량이 10ArrayList 10의 기본 용량이 왜입니까?

/** 
* Constructs an empty list with an initial capacity of ten. 
*/ 
public ArrayList() { 
this(10); 
} 
나는 그것이 2의 전원 인 경우는 이해 것이라고 생각

, 그런데 왜 10 것을 발견?

나는 또한 HashMap의 초기 용량을 확인했으며, 이는 의미가 있습니다.

/** 
* The default initial capacity - MUST be a power of two. 
*/ 
static final int DEFAULT_INITIAL_CAPACITY = 16; 

/** 
* Constructs an empty <tt>HashMap</tt> with the default initial capacity 
* (16) and the default load factor (0.75). 
*/ 
public HashMap() { 
    this.loadFactor = DEFAULT_LOAD_FACTOR; 
    threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR); 
    table = new Entry[DEFAULT_INITIAL_CAPACITY]; 
    init(); 
} 

숫자 10 뒤에 어떤 이유가 있습니까?

+15

>>> _it는 2의 거듭 제곱의 숫자가 될 수 있습니다. 이유는 무엇입니까? –

+4

나는 이것이 각각 5 자리 숫자를 갖는 두 개의 조작자를 갖는 것으로 보이는 CS의 지배적 인 삶의 형태로 되돌아 간다고 생각한다.컴퓨팅 초기에 계산에 사용 된 곳. 그러므로 그들은 모든 종류의 것들에 대해 10의 능력을 선호합니다. –

+4

10은 크기가 아닌 배열 목록의 초기 용량입니다. 초기 크기는 항상 0입니다. – BOSS

답변

35

ArrayList은 단순한 성장 어레이입니다. 요소를 추가하려고 할 때 버퍼 크기가 초과되면 단순하게 커집니다. 따라서 초기 크기는 양의 값이 될 수 있습니다.

1이 너무 적습니다. 몇 가지 요소가 있지만 몇 가지 크기 조정 작업이 있습니다.

100은 공간 손실입니다.

따라서 10은 절충안입니다. 왜 10이 아닌 12 또는 8입니까? 첫 번째 힌트는 일반적인 사용 사례를 분석 한 결과 성능 손실과 공간 손실 사이에 가장 적합하다는 점입니다. 그러나 Sun의 원래 코드를 보면 너무 깊이 분석되지 않았으며 임의적 인 "너무 작지도 크지도 않은"숫자라고 생각합니다.

1

10은 아마도 기본 요소 수에 대해 임의의 숫자 일 것입니다.

+1

태양 개발자가 많은 생각없이 기본 숫자로 임의의 숫자를 사용할만큼 미친 것 같지 않습니다. 그들은 유용하고 효율적인 시나리오를 생각해보아야 만합니다. –

5

완전히 임의의 선택입니다.

2의 거듭 제곱이 더 의미가있는 이유는 없습니다. 해시 맵이 작동하는 방식 때문에 해시 맵에서 의미가 있습니다. 사실 2의 거듭 제곱이어야합니다 (소스 주석에 따라). (ArrayList에의 오빠입니다) java.util.Vector에 또한 목록 10.

+0

네, 또한 가지고 있습니다. 그리고 ArrayList의 용량에도 이유가있을 수 있습니다. 그러나 문제는 왜 벡터의 초기 용량이 10인지? –

13

있다

주, 용량이 2의 제곱이 될 가진 것은 유익하지 못하다. 사실 특정 시작 용량에는 실제 이점이 없습니다. 작은 목록의 일반적인 경우에 대해 여러 크기 조정 단계를 수행하지 않을만큼 충분히 커야하며 같은 경우에는 사용되지 않은 용량에 메모리를 낭비하지 않을 정도로 작아야합니다. 10은 아마도 이러한 요구 사항을 충족시키기 위해 올바른 범위에 있고 "둥근"이기 때문에 아마 선택되었을 것입니다.

+1

2의 거듭 제곱의 능력이라 할지라도 특정 용량에 대한 실질적인 이점은 없을 수 있습니다. 그러나 태양 개발자가 많은 수의 시나리오를 분석하여 충분한 수의 시나리오를 찾으면 최소한 공유해야합니다. 자바 문서가 아니라 공식 블로그. 그래서 opersource 커뮤니티의 모든 사람들은 아이디어를 가지고 있으며, 다른 프로그래머들은이 초기 용량 번호를 실제 개발 사용 사례에 더 가깝게하기 위해 의견을 표현할 수 있습니다. –

+5

@Priyank Doshi : 당신은 이것을 overthinking 수 있습니다 ... – Thilo

+3

@Priyank Doshi : 이상적인 초기 capcity는 응용 프로그램간에 다를 수 있으므로 많은 양의 시나리오에 대한 평균은 실제로별로 유용하지 않을 것입니다. 정확한 값은 극히 희박합니다 대부분의 응용 프로그램에서는 중요하지만 문제가되는 응용 프로그램에서는 평균이 아닌 특정 응용 프로그램에 가장 적합한 값을 사용하려고합니다. –

0

코드에 주석이 없으면 확실하게 알 수 없습니다. 그러나 어떤 시점에서 Sun 엔지니어는 실제 응용 프로그램의 수많은 ArrayList 사용량에 대한 통계를 수집하여 경험적으로 ... 평균적으로 가장 좋은 결과를 얻은 것으로 판단했습니다. 이것이 바로 이런 것들, 최적화 도구, 바이트 코드 디자인 등을 조정하는 방법입니다.

그리고 다른 사람들은 2의 거듭 제곱 인 크기를 사용하는 데 계산상의 이점 (또는 단점)이 없다고 지적했습니다. ArrayList의 크기입니다.

10

Vector에서 JDK 1.0의 기본 초기 용량은 10이므로, 1.2에서 ArrayList을 도입했을 때 일관성을 유지하는 것이 좋습니다.

+0

아니요. 호환되지 않는 변경 사항입니다. 스펙 인 Javadoc은 기본 용량이 10이므로 변경 만 할 수는 없다고 말합니다. – Thilo

+3

@PriyankDoshi 그들이 뜻하는 바는 ArrayList가 Vector와 일관성을 유지하기를 바랬다는 것입니다. 다른 컬렉션 구현을 언급하지 않습니다. –

관련 문제