[java] Java에서 모든 0으로 ArrayList를 초기화하는 방법은 무엇입니까?

사전 크기 조정 arraylist작업을 수행하지 않는 것 같습니다 .

// presizing 

ArrayList<Integer> list = new ArrayList<Integer>(60);

나중에 액세스하려고하면 :

list.get(5) 

0을 반환하는 대신 길이가 0 인 경우 IndexOutOfBoundsException : Index 5가 범위를 벗어납니다 .

모든 요소를 ​​C ++과 같은 크기로 0으로 초기화하는 방법이 있습니까?



답변

생성자에 전달 된 정수는 초기 용량 , 즉 내부 배열의 크기를 조정하기 전에 보유 할 수있는 요소 수를 나타냅니다 (목록의 초기 요소 수와는 아무 상관이 없음).

60 개의 0으로 목록을 초기화하려면 다음을 수행하십시오.

List<Integer> list = new ArrayList<Integer>(Collections.nCopies(60, 0));

60 개의 서로 다른 객체 로 목록을 만들려면 Supplier다음과 같이 Stream API를 사용할 수 있습니다 .

List<Person> persons = Stream.generate(Person::new)
                             .limit(60)
                             .collect(Collectors.toList());


답변

// apparently this is broken. Whoops for me!
java.util.Collections.fill(list,new Integer(0));

// this is better
Integer[] data = new Integer[60];
Arrays.fill(data,new Integer(0));
List<Integer> list = Arrays.asList(data);


답변

60 대는 내부 스토리지의 초기 용량입니다. 그것이 얼마나 클지에 대한 힌트이지만, 물론 이것으로 제한되지는 않습니다. 값을 사전 설정해야하는 경우 다음과 같이 직접 설정해야합니다.

for (int i = 0; i < 60; i++) {
    list.add(0);
}


답변

Java 8 구현 (목록은 600으로 초기화 됨 ) :

List<Integer> list = IntStream.of(new int[60])
                    .boxed()
                    .collect(Collectors.toList());
  • new int[N] -0과 길이 N으로 채워진 배열을 만듭니다.
  • boxed() -정수로 박스 화 된 각 요소
  • collect(Collectors.toList()) -스트림 요소를 수집

답변

그렇지 않습니다. ArrayList는 배열을 내부 respentation으로 사용합니다. 60 개 이상의 요소를 추가하면 밑줄 배열이 확장됩니다. 얼마나 많은 RAM을이 배열에 추가 할 수 있습니까?


답변