Tạo một danh sách các int nguyên thủy?


94

Có cách nào để tạo danh sách int nguyên thủy hoặc bất kỳ nguyên thủy nào trong java như sau không?

List<int> myList = new ArrayList<int>();

Có vẻ như tôi có thể làm List myList = new ArrayList();

và thêm "int" vào danh sách này. Nhưng điều này có nghĩa là tôi có thể thêm bất cứ thứ gì vào danh sách này.

Là lựa chọn duy nhất của tôi, tạo một mảng int và chuyển đổi nó thành một danh sách hay tạo một danh sách các đối tượng Số nguyên?


Nếu hiệu suất là mối quan tâm của bạn, trove sẽ giúp đỡ.
assylias

Có thể tạo danh sách bằng một mảng cơ bản, nhưng bạn phải biết kích thước của mảng để bắt đầu và bạn sẽ mất rất nhiều chức năng khác đi kèm với đối tượng Collections. Nhưng bạn có thể làm điều gì đó như: int [] array = new int [10];
Taylor

Câu trả lời:


141

Trong Java, kiểu của bất kỳ biến nào là kiểu nguyên thủy hoặc kiểu tham chiếu. Đối số kiểu chung phải là kiểu tham chiếu. Vì các số nguyên thủy không mở rộng Objectnên chúng không thể được sử dụng làm đối số kiểu chung cho một kiểu được tham số hóa.

Thay vào đó, hãy sử dụng Integerlớp là trình bao bọc cho int:

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

Nếu bạn sử dụng Java 7, bạn có thể đơn giản hóa khai báo này bằng cách sử dụng toán tử kim cương:

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

Với autoboxing trong Java, kiểu nguyên thủy intsẽ trở thành một Integerkhi cần thiết.

Autoboxing là sự chuyển đổi tự động mà trình biên dịch Java thực hiện giữa các kiểu nguyên thủy và các lớp trình bao bọc đối tượng tương ứng của chúng.

Vì vậy, điều sau là hợp lệ:

int myInt = 1;
List<Integer> list = new ArrayList<Integer>();
list.add(myInt);

System.out.println(list.get(0)); //prints 1

Vì vậy, các phương pháp setSelectedIndices JTable là một tổ chức phi nghĩa: docs.oracle.com/javase/8/docs/api/javax/swing/...
vdolez

25

Không có bất kỳ bộ sưu tập nào có thể chứa các kiểu nguyên thủy khi Java Collection Framework đang được sử dụng.

Tuy nhiên, có những bộ sưu tập java khác hỗ trợ các kiểu nguyên thủy, chẳng hạn như: Trove , Colt , Fastutil , Guava

Ví dụ về cách một danh sách mảng với ints sẽ như thế nào khi Thư viện Trove được sử dụng như sau:

 TIntArrayList list= new TIntArrayList();

Hiệu suất của danh sách này, khi so sánh với ArrayList of Integers từ Java Collections tốt hơn nhiều vì không cần autoboxing / unboxing tới Integer Wrapper Class tương ứng.


1
Tôi không thể tìm thấy cách triển khai bộ sưu tập ban đầu trong Guava. Bạn có thể cung cấp một liên kết xin vui lòng?
nimcap

9

Có cách nào để tạo danh sách int nguyên thủy hoặc bất kỳ nguyên thủy nào trong java không

Không, bạn không thể. Bạn chỉ có thể tạo Danh sách các loại tài liệu tham khảo, như Integer, Stringhoặc kiểu tùy chỉnh của bạn.

Có vẻ như tôi có thể làm List myList = new ArrayList();và thêm "int" vào danh sách này.

Khi bạn thêm intvào danh sách này, nó sẽ tự động được đóng hộp thành Integerloại trình bao bọc. Nhưng đó là một ý tưởng tồi nếu sử dụng danh sách kiểu thô hoặc cho bất kỳ kiểu chung nào cho vấn đề đó, trong mã mới hơn.

Tôi có thể thêm bất cứ thứ gì vào danh sách này.

Tất nhiên, đó là nhược điểm của việc sử dụng loại thô. Bạn có thể có Mèo , Chó , Hổ , Khủng long , tất cả trong một hộp đựng.

Là lựa chọn duy nhất của tôi, tạo một mảng int và chuyển nó thành một danh sách

Trong trường hợp đó, bạn sẽ nhận được một List<Integer>. Không có cách nào bạn có thể tạo List<int>hoặc bất kỳ nguyên thủy nào.

Bạn không nên bị làm phiền dù sao. Ngay cả trong List<Integer>bạn có thể thêm một intkiểu nguyên thủy. Nó sẽ tự động được đóng hộp, như trong ví dụ dưới đây:

List<Integer> list = new ArrayList<Integer>();
list.add(5);

Thảo luận tốt về loại thô.
Kevin Bowersox

Trên thực tế, để rõ ràng, bạn có thể tạo một danh sách với các kiểu nguyên thủy chỉ bằng cách sử dụng một mảng cơ bản. int [] array = new int [10];
Taylor

1
@Taylor Nhưng đó sẽ không phải là danh sách tăng động. Đó là một mảng. Và tôi cho rằng OP đã biết về điều đó.
Rohit Jain


5

Điều này là không thể. Đặc tả java cấm sử dụng các nguyên mẫu trong generic. Tuy nhiên, bạn có thể tạo ArrayList<Integer>và gọi add(i)if ilà một int nhờ quyền anh.


4

Bạn có thể sử dụng các bộ sưu tập nguyên thủy có sẵn trong Bộ sưu tập Eclipse . Eclipse Bộ sưu tập có List, Set, BagMapcho tất cả nguyên thủy. Các yếu tố trong bộ sưu tập nguyên thủy được duy trì như nguyên thủy và không có quyền anh diễn ra.

Bạn có thể khởi tạo một IntList như sau:

MutableIntList ints = IntLists.mutable.empty();

Bạn có thể chuyển đổi từ a List<Integer>sang IntListnhư thế này:

List<Integer> integers = new ArrayList<>();
MutableIntList ints = ListAdapter.adapt(integers).collectInt(each -> each);

Lưu ý: Tôi là người đóng góp cho Bộ sưu tập Eclipse.


2

Bộ sưu tập sử dụng generic hỗ trợ loại tham chiếu hoặc wilcards. Tuy nhiên, bạn có thể sử dụng một Integertrình bao bọc

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

0

Khi bạn sử dụng Java để phát triển Android, bạn nên sử dụng SparseIntArrayđể ngăn chặn autoboxing giữa intInteger.

Bạn có thể tìm thêm thông tin SparseIntArraytrong tài liệu dành cho Nhà phát triển Android và giải thích tốt về tính năng autoboxing trên Android, hãy nhập mô tả liên kết vào đây


Đó là một tuyên bố mạnh mẽ. Chắc chắn SparseIntArraythường là một lựa chọn tốt hơn, nhưng có những đánh đổi cần lưu ý. "Việc thực hiện không có ý định để phù hợp với cấu trúc dữ liệu có thể chứa một số lượng lớn các mặt hàng này thường chậm hơn là hơn một HashMap truyền thống ...."
Andy Thomas

Vâng đó là sự thật. Họ đề cập đến sự cân bằng này khá tốt trong video tôi đã liên kết. Nhưng OP đã yêu cầu khả năng cụ thể đó và tôi chỉ muốn nói thêm rằng nó thực sự có thể với Android và cũng được khuyến nghị cho hầu hết các trường hợp sử dụng. Cảm ơn đã thêm thông tin đó!
Stefan Medack

0

Có cách nào để chuyển đổi mảng Integer [] thành mảng int [] không?

Sự thiếu sót hoàn toàn này từ các thư viện lõi Java dường như xuất hiện trên khá nhiều dự án mà tôi từng làm việc. Và cũng thuận tiện như thư viện Trove, tôi không thể phân tích cú pháp các yêu cầu chính xác để đáp ứng LPGL cho một ứng dụng Android liên kết tĩnh với thư viện LGPL (phần mở đầu nói được, phần nội dung dường như không nói như vậy). Và thật bất tiện khi phải tách các nguồn Apache để lấy các lớp này. Có phải là một cách tốt hơn.


-4

Bộ sưu tập Java chỉ nên là bộ sưu tập của Đối tượng.

List<Integer> integerList = new ArrayList<Integer>();

Integer là lớp bao bọc của kiểu dữ liệu nguyên thủy int.

thêm từ các lớp trình bao bọc JAVA tại đây !

Bạn có thể trực tiếp lưu và lấy int đến / từ integerList dưới dạng, integerList.add(intValue); int intValue = integerList.get(i)


1
Dòng đầu tiên sẽ không biên dịch và hai dòng mã cuối cùng ở khắp mọi nơi. Xin vui lòng không làm điều này.
The_Martian
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.