Array<Int>
là một Integer[]
dưới mui xe, trong khi IntArray
là một int[]
. Đó là nó.
Điều này có nghĩa là khi bạn đặt một Int
vào Array<Int>
, nó sẽ luôn được đóng hộp (cụ thể là với một Integer.valueOf()
cuộc gọi). Trong trường hợp của IntArray
, không có quyền nào xảy ra, bởi vì nó chuyển sang một mảng nguyên thủy Java.
Ngoài các tác động hiệu suất có thể có của những điều trên, cũng có sự tiện lợi để xem xét. Các mảng ban đầu có thể không được khởi tạo và chúng sẽ có 0
giá trị mặc định ở tất cả các chỉ mục. Đây là lý do tại sao IntArray
và phần còn lại của mảng nguyên thủy có các hàm tạo chỉ nhận tham số kích thước:
val arr = IntArray(10)
println(arr.joinToString())
Ngược lại, Array<T>
không có một phương thức khởi tạo chỉ nhận tham số kích thước: nó cần các cá thể hợp lệ, không rỗng T
ở tất cả các chỉ mục để ở trạng thái hợp lệ sau khi tạo. Đối với Number
các loại, đây có thể là một mặc định 0
, nhưng không có cách nào để tạo các phiên bản mặc định của một loại tùy ý T
.
Vì vậy, khi tạo một Array<Int>
, bạn có thể sử dụng hàm tạo cũng có chức năng khởi tạo:
val arr = Array<Int>(10) { index -> 0 }
val arr = Array(10) { 0 }
Hoặc tạo một Array<Int?>
để tránh phải khởi tạo mọi giá trị, nhưng sau đó bạn sẽ buộc phải xử lý null
các giá trị có thể có mỗi khi bạn đọc từ mảng.
val arr = arrayOfNulls<Int>(10)
Array<Int>
biên dịch đểInteger[]
(nếu trình biên dịch không tối ưu hóa này)