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


161

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

// presizing 

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

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

list.get(5) 

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

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


4
해당 생성자의 Javadoc은 "빈 목록"을 작성하도록 지정합니다. 그것은 일을하고 있습니다.
ColinD

답변:


429

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

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());

1
그것은 내 솔루션 (실제로 hehehe로 작동하는 업데이트 된 솔루션)보다 훨씬 낫습니다. 그래도 새로운 ArrayList것을 만들지 말고 간단히 프로그램하십시오 List. 물론 그것은 OP에 맡겨진 결정입니다.
corsiKa

6
에 의해 반환 된 목록 nCopies은 변경할 수 없으므로 새로 만드는 ArrayList것이 좋습니다.
aioobe

4
nCopies복잡한 객체와 함께 를 사용할 때 컬렉션은 60 개의 다른 객체로 인스턴스화되지 않지만 동일한 객체로 60 번 인스턴스화됩니다. 따라서 프리미티브에만 사용하십시오.
membersound

1
@membersound, 나는 nCopies참조 유형에 유용한 많은 시나리오를 생각할 수 있습니다 : 문자열, null 객체 패턴, 열거 상수와 같은 불변 객체, ... 어쨌든 60 가지 객체를 만드는 솔루션으로 답변을 업데이트했습니다.
aioobe

@aioobe ncopies가 유용한 많은 시나리오가 있다는 것을 알고 있습니다. 가변 객체로 ncopies를 시도하고 예상대로 작동하지 않는 것에 놀랐습니다. 누군가가 동일한 작업을 시도하는 경우를 대비하여. 그래도 업데이트 주셔서 감사합니다!
membersound

12
// 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);

2
기존 항목으로 만 목록을 채 웁니다. 원하는대로 요소로 초기화하지 않습니다.
WhiteFang34

이 목록은 60 개의 0으로 채워지지 않습니다.
aioobe

아무 것도 만들 필요가없는 60 개의 개체를 만들 수 있습니다.
ColinD

1
@ 프로스트 : 당신은 IndexOutOfBoundsException함께 얻을List<Integer> list = new ArrayList<Integer>(60); Collections.fill(list, new Integer(0)); list.get(5);
WhiteFang34

1
Arrays.asListList추가 또는 제거를 허용하지 않는를 생성 하므로 OP가 원하는 것과 동일하지 않습니다. 당신이해야 할 모든 것이 있다면 작동 set하지만, 그 경우에는 배열을 사용하는 것이 좋습니다.
ColinD

8

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

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

4

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

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

0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.