일반적인 구성자를 라일리스트 '의' 입니다.
ArrayList<?> list = new ArrayList<>();
그러나 역시 과부하된 구성자를 매개변수입니다 초기 용량을 함께 있다.
ArrayList<?> list = new ArrayList<>(20);
왜 그렇게 만들 수 있는 유용한 정보기술 (it) 을 통해 '라일리스트 초기 용량을 추가할 수 있습니다' 때 우리는 우리가 제발이네.
미리 알고 있다면 어떤 것이 더 효율적인 라일리스트 ', 크기' 초기 용량을 지정할 수 있는 것입니다. 이렇게 할 경우, t, 내부 어레이입니다 don& # 39 로 될 것으로 목록에 따라 여러 차례 나왔다.
최종 명단이 클수록 더 많은 시간을 피하고 의해 재 할당 저장할 수 있습니다.
즉, 사전, 삽입 없어도 뒤쪽에 있는 라일리스트 '는' n '요소' 총 '시행하십시오 O (n)' 시간을 갖는다. 즉, 일정 시간 추가 요소를 상각 백업이었습니다 운영할 수 있다. 이는 각 크기는 일반적으로 제공함으로써 달성됩니다 reallocation 증가되지는 기하급수적으로 어레이입니다 분의 '1.5'. 이 방법을 통해 총 운영체 [O (n) '로 근사할 수 있고'] [1].
[1]: http://www.wolframalpha.com/input/? i =, = 1, log% sum% 81.5k% 29%20for% 20k 281.5 n% 29
라일리스트 '는 [무중단으로 크기조정 어레이입니다] 때문에' (http://en.wikipedia.org/wiki/Dynamic_array) 데이터 구조, 즉 구축됩니까 표시됨과 어레이에는 초기 (기본값) 크기 고정. 이 때 두 배 크기의 1 위, 전체 스토리지당 모두 채워질 연장됩니다. 이 작업은 비용 때문에 원하는 대로 몇 수 있다.
그래서 알고 있는 경우, 상위 20 개 바인딩한 관심용 어레이에는 만드는 것보다 더 나은 기본 사용하여 초기 길이 20, 30 만 사용 후 '와' = 15 말하도다 크기조정할 redhat. 15*2 낭비되는 동안 20 주기 위해 이 확장.
추신 - 마이크 있다』 고 확장 계수는 구현 특정 (이 경우 ' (old카파시 * 3) /2 + 1')
기본 크기는 라일리스트 10 있다.
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this(10);
}
그래서 예정이면 100 개 이상의 추가 메모리 reallocation 오버헤드에 레코드는유지합니다 볼 수 있습니다.
ArrayList<?> list = new ArrayList<>();
// same as new ArrayList<>(10);
그래서 될 수 있는 아이디어 있으시면 대한 여러 요소를 더 잘 만들 수 있는 대신 라일리스트 저장됩니까 라일리스트 시작으로 그 후 10 일이 일어나고 원거리일수록 크기 때문이다.
사실 블로그 포스트 에 글을 항목를 2 개월 전. 이 문서는 & # 39, s, C # 에 대한 ',', 's' 가 아니라 # 39 List< T> Java& 라일리스트 매우 유사한 구축상의. 이후 '는' 동적 배열을 사용하여 라일리스트 구현됩니까 필요에 따라 크기가 늘어납니다. 그 이유는 대용량형 구성자를 캐비닛용입니다 최적화 작업을 할 수 있습니다.
이러한 작업을 발생할 경우 크기조정 복사됩니다 컨텐트에서 어레이입니다 라일리스트 를 새로운 배열입니다 두 배의 용량을 기존 하나. 이 작업은 O (n) 에서 실행되는 하게하면서요.
'어떻게' 크기가 증가할 것이라고 라일리스트 의 예를 들어보겠습니다.
10
16
25
38
58
... 17 resizes ...
198578
297868
446803
670205
1005308
그래서 시작할 때 목록에 항목이 추가된 용량이 '10', '50% 증가한 것은 11 + 1' 을 '16'. 이 '다시' 25 '와' 는 17 일 품목으로부터 라일리스트 http://governmentsecurity. 드릴링됩니다. 지금 하고 있는 예로 포지셔닝합니다 we& # 39, 원하는 용량을 이미 알려진 1 000 000 바뀌엇어요 만들기 ''. 라일리스트 만들기 '' 배 '는 call' 없이 '크기 구성자를 라일리스트리아다 담당하는 일반적으로' 1 000 000 O (1) 또는 O (n) 을 크기조정할.
>. 1 000 000 25tb 16 + + +. + 670205 1005308 4015851 운영체 = +
이 후 '을 사용하여 비교하십시오 구성자를 호출하십시오 실행하십시오 라일리스트리아다 보장할 수 있는' O (1) .
>. 1 000 000 = 1 000 000 + 2000000 운영체
Java 는 위와 같이, '10' 과 '1' 부터 50% 이상의 각 크기조정할 emc. 있다. C # 에서 '4' 및 증대됩니다 훨씬 더 적극적으로 지난해보다 두배 이상 늘어난 각 단계에서 크기조정할. 1 000 000 '는' 예 '는' 3097084 자도으로 위에서 C # 에 대한 작업을 수행할 수 있습니다.
초기 설정 등, 라일리스트 의 크기 (100) ',' ArrayList< > 재할당 횟수를 줄이고, 내부 메모리가 발생할 수 있습니다.
ArrayList example = new ArrayList<Integer>(3);
example.add(1); // size() == 1
example.add(2); // size() == 2,
example.add(2); // size() == 3, example has been 'filled'
example.add(3); // size() == 4, example has been 'expanded' so that the fourth element can be added.
위의 예에서 보는 바와 같이 필요가 있는 경우 '-' 라일리스트 확장할 수 있습니다. # 39 이것은 doesn& 크기는 일반적으로 보여줄 수 없는 것이, 라일리스트 복식 (단, 단, 새 크기에 따라 구축상의). 다음은 Oracle 에서 인용.
>. ", 각 라일리스트 인스턴스에는 대용량형. 용량 의 크기가 >. 이 어레이에는 명단요 요소에 저장하는 데 사용됩니다. 이는 항상 >. 같은 크기의 이상 목록에 크기. 요소로 추가되면 >. 라일리스트 자동으로 용량을 확장할 수 있다. 자세히 성장할까요 >. 정책 지정되지 않은 사실을 넘어 추가 요소가 >. 상수입니다 상각 시간 cost.".
물론 아무 생각이 들고, you will be as 를 경우 어떤 종류의 범위 설정 할 수 있는 좋은 아이디어 = 그러나 won& 크기, t # 39 염두에 두고 있을 경우 특정 범위 설정 초기 용량을 메모리 효율성 늘어난다.
이를 방지하기 위해 reallocation 모든 단일 개체.
int newCapacity = (oldCapacity * 3)/2 + 1;
'new []' 는 내부적으로 객체에는 created.< br>; JVM 요구사항뿐 작업량의 새 객체를 생성할 수 있는 요소 [] '' 추가할 때 라일리스트. # 39 위에 don& 없는 경우, 코드 (모든 앍고 생각) 를 호출하면 라일리스트리아다 () '다음' 다음 'reallocation 때마다 새 객체를 생성할 수 있다 []' 의 경우 1 시간 동안 우리는 원하는거요 무의미한 원거리일수록 사이즈를 각각의 모든 객체에는 추가되도록. [] '와' 객체에는 크기 때문에, 다음과 같은 것이 증가되지는 formula.< br>. (JSL 사용된 포카스팅 증가하는 성장세를 대신 라일리스트 때마다 식은 아래와 무중단으로 1. 성장을 위한 노력으로 걸리기 때문에 적용)
int newCapacity = (oldCapacity * 3)/2 + 1;
바뀌엇어요 가질 수 있는 데 필요한 항목 수를 정확히 호츨 [트림토시즈 ()] [1]
[1]: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html # trimToSize% 28%29
내 경험에 따라 초기 용량은 확증하노라 라일리스트 ',' 좋은 피할 길은 reallocation 비용을 절감할 수 있습니다. 그러나 한 사람의 단서 조항. 위에서 언급한 모든 제안을 할 수 있다고 한 경우에만 초기 용량을 제공하십시오 황삭 추정치입니다 요소 알려져 있다. 하나님이 없이 전달자로써 시도하시겠습니까 초기 용량을 메모리 용량은 스케줄됨 사용하지 않는 것이 될 수도 있으므로 일단 목록은 접수됨 그들이실천하는 절대 필요한 필요한 여러 요소를. 내가 하고 싶은 말은, 지도자가 될 수 있어 처음부터 용량 할당 후 필요한 최소한의 용량을 스마트 길을 찾을 때 vmnet http://support. 런타임용으로 개발하십시오. 라일리스트 '엔수르카파시 (int 민카파시)' 라는 방법을 제공합니다. 그런데, 찾는 사람이 현명한 방법입니다.
나는 함께 라일리스트 테스트되었습니다 니시알카파시 없이 나는 attaboy 의외 및 결과 < br/>; 그 결과 설정 때 내가 LOOP_NUMBER 설정되었습니다 100,000 명으로 이하의 니시알카파시 효율적입니다. < br>;
list1Sttop-list1Start = 14
list2Sttop-list2Start = 10
< br/>; 하지만 그 때 내가 LOOP_NUMBER 설정되었습니다 1,000,000 으로 변경. < br/>;
list1Stop-list1Start = 40
list2Stop-list2Start = 66
< br/>; 마침내, 나는 어떻게 높여줍니까 couldn& # 39, t 그림 아웃해야 작동하잖아?! < br/>; 샘플 코드:
public static final int LOOP_NUMBER = 100000;
public static void main(String[] args) {
long list1Start = System.currentTimeMillis();
List<Integer> list1 = new ArrayList();
for (int i = 0; i < LOOP_NUMBER; i++) {
list1.add(i);
}
long list1Stop = System.currentTimeMillis();
System.out.println("list1Stop-list1Start = " + String.valueOf(list1Stop - list1Start));
long list2Start = System.currentTimeMillis();
List<Integer> list2 = new ArrayList(LOOP_NUMBER);
for (int i = 0; i < LOOP_NUMBER; i++) {
list2.add(i);
}
long list2Stop = System.currentTimeMillis();
System.out.println("list2Stop-list2Start = " + String.valueOf(list2Stop - list2Start));
}
나는 거친 windows8.1 및 jdk1.7.0_80