Làm cách nào tôi có thể khởi tạo một ArrayList với tất cả các số 0 trong Java?


161

Có vẻ như arraylistkhông làm công việc của mình để trình bày:

// presizing 

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

Sau đó khi tôi cố gắng truy cập nó:

list.get(5) 

Thay vì trả về 0, nó ném IndexOutOfBoundException: Index 5 ra khỏi giới hạn cho độ dài 0 .

Có cách nào để khởi tạo tất cả các phần tử thành 0 có kích thước chính xác như những gì C ++ làm không?


4
Javadoc của hàm tạo đó xác định rằng nó tạo ra một "danh sách trống". Nó đang làm công việc của nó.
ColinD

Câu trả lời:


429

Số nguyên được truyền cho hàm tạo biểu thị dung lượng ban đầu của nó , tức là số phần tử mà nó có thể giữ trước khi cần thay đổi kích thước mảng bên trong của nó (và không liên quan gì đến số phần tử ban đầu trong danh sách).

Để khởi tạo danh sách với 60 số không bạn thực hiện:

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

Nếu bạn muốn tạo một danh sách với 60 đối tượng khác nhau , bạn có thể sử dụng API Stream với Suppliernhư sau:

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

1
Đó là tốt hơn nhiều so với giải pháp của tôi (ngay cả giải pháp cập nhật của tôi thực sự hoạt động hehehe). Tôi sẽ khuyên bạn không nên tạo một cái mới ArrayListtừ nó, và thay vào đó chỉ đơn giản là lập trình List. Đó là một quyết định để lại cho OP, tất nhiên.
corsiKa

6
Danh sách được trả về nCopieslà không thay đổi, vì vậy tạo một cái mới ArrayListcó lẽ là một ý tưởng tốt.
aioobe

4
Xin lưu ý rằng khi sử dụng nCopiesvới một đối tượng phức tạp, bộ sưu tập không được khởi tạo với 60 đối tượng khác nhau, mà là 60 lần với cùng một đối tượng. Vì vậy, chỉ sử dụng này cho người nguyên thủy.
viên

1
@membersound, tôi có thể nghĩ ra nhiều tình huống nCopieshữu ích với các loại tham chiếu: Các đối tượng không thay đổi như chuỗi, mẫu đối tượng null, hằng số enum, ... Dù sao, tôi đã cập nhật câu trả lời với giải pháp tạo 60 đối tượng khác nhau.
aioobe

@aioobe Tôi biết có nhiều tình huống trong đó ncopies là hữu ích. Tôi chỉ muốn thêm cái này, vì tôi đã thử dùng kính râm với các vật thể có thể thay đổi và thật ngạc nhiên là nó không hoạt động như tôi mong đợi. Chỉ trong trường hợp bất cứ ai cố gắng cùng một nhiệm vụ. cảm ơn vì đã cập nhật
viên

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
Điều này chỉ điền vào một danh sách với các mục hiện có. Nó sẽ không khởi tạo nó với các yếu tố như mong muốn.
WhiteFang34

Điều này sẽ không điền vào danh sách với 60 số không.
aioobe

Ngay cả khi nó sẽ tạo ra 60 đối tượng mà nó không phải tạo bất kỳ đối tượng nào.
ColinD

1
@Frost: bạn sẽ nhận được IndexOutOfBoundsExceptionvớiList<Integer> list = new ArrayList<Integer>(60); Collections.fill(list, new Integer(0)); list.get(5);
WhiteFang34

1
Arrays.asListtạo ra một Listthứ không cho phép thêm hoặc xóa, vì vậy nó không hoàn toàn giống với những gì OP muốn. Nó sẽ hoạt động nếu tất cả những gì bạn cần làm là set, nhưng bạn có thể tốt hơn nếu chỉ sử dụng một mảng trong trường hợp đó.
ColinD

8

60 bạn đang vượt qua chỉ là dung lượng ban đầu cho bộ nhớ trong. Đó là một gợi ý về mức độ bạn nghĩ nó có thể lớn như thế nào, nhưng tất nhiên nó không bị giới hạn bởi điều đó. Nếu bạn cần đặt trước các giá trị, bạn sẽ phải tự đặt chúng, ví dụ:

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

4

Triển khai Java 8 (Danh sách được khởi tạo bằng 60số 0) :

List<Integer> list = IntStream.of(new int[60])
                    .boxed()
                    .collect(Collectors.toList());
  • new int[N] - tạo một mảng chứa đầy số 0 và độ dài N
  • boxed() - mỗi phần tử được đóng hộp cho một số nguyên
  • collect(Collectors.toList()) - thu thập các yếu tố của luồng

0

Không phải như thế. ArrayList chỉ sử dụng mảng như sự tôn trọng nội bộ. Nếu bạn thêm nhiều hơn 60 phần tử thì phần gạch dưới sẽ bị loại bỏ. Bạn có thể thêm bao nhiêu phần tử vào mảng này bao nhiêu RAM bạn có.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.