Array<Int>jest Integer[]pod maską, a IntArrayjest int[]. Otóż to.
Oznacza to, że jeśli umieścić Intw sposób Array<Int>, to zawsze będzie ramkach (w szczególności z Integer.valueOf()połączenia). W przypadku IntArrayformatu boksowanie nie nastąpi, ponieważ przekłada się to na tablicę prymitywną języka Java.
Poza możliwymi konsekwencjami powyższego dla wydajności, należy wziąć pod uwagę również wygodę. Tablice prymitywne mogą pozostać niezainicjowane i będą miały 0wartości domyślne we wszystkich indeksach. Oto dlaczego, IntArraya pozostałe tablice pierwotne mają konstruktory, które przyjmują tylko parametr rozmiaru:
val arr = IntArray(10)
println(arr.joinToString())
W przeciwieństwie do tego, Array<T>nie ma konstruktora, który przyjmuje tylko parametr rozmiaru: potrzebuje prawidłowych, niezerowych Twystąpień we wszystkich indeksach, aby były w prawidłowym stanie po utworzeniu. W przypadku Numbertypów może to być ustawienie domyślne 0, ale nie ma możliwości tworzenia domyślnych instancji dowolnego typu T.
Tak więc podczas tworzenia Array<Int>możesz użyć konstruktora, który również przyjmuje funkcję inicjalizującą:
val arr = Array<Int>(10) { index -> 0 }
val arr = Array(10) { 0 }
Lub utwórz ankietę, Array<Int?>aby uniknąć konieczności inicjowania każdej wartości, ale później będziesz zmuszony radzić sobie z możliwymi nullwartościami za każdym razem, gdy czytasz z tablicy.
val arr = arrayOfNulls<Int>(10)
Array<Int>gromadzi doInteger[](jeśli kompilator nie zoptymalizować)