W C/C++
Kiedyś robiłem
int arr[10] = {0};
... aby zainicjować wszystkie moje elementy tablicy na 0.
Czy istnieje podobny skrót w Javie?
Chcę uniknąć używania pętli, czy to możliwe?
int arr[] = new int[10];
for(int i = 0; i < arr.length; i++) {
arr[i] = 0;
}
Odpowiedzi:
Domyślna wartość 0 dla tablic typów całkowych jest gwarantowana przez specyfikację języka :
Jeśli chcesz zainicjować tablicę jednowymiarową na inną wartość, możesz użyć java.util.Arrays.fill () (która oczywiście użyje pętli wewnętrznie).
źródło
Arrays.fill
niekoniecznie używa pętli.Podczas gdy pozostałe odpowiedzi są poprawne (int wartości tablicy są domyślnie inicjowane na 0), jeśli chcesz to zrobić jawnie (np. Jeśli chcesz, aby tablica była wypełniona wartością 42), możesz użyć metody fill () macierze klasy:
Lub jeśli jesteś fanem 1-liniowych, możesz skorzystać z
Collections.nCopies()
rutyny:Dałby arr wartość:
(chociaż jest
Integer
, i nieint
, jeśli potrzebujesz pierwotnego typu, możesz odroczyć się do procedury Apache CommonsArrayUtils.toPrimitive()
:źródło
List<Integer>
doInteger[]
celuint[]
? To trochę skomplikowane.Arrays.fill
metodą powoduje problem i występuje błąd.W Java wszystkie elementy (pierwotne liczby całkowite
byte
short
,int
,long
) są początkowo wartość 0 domyślnie. Możesz zapisać pętlę.źródło
Jak to zmniejsza wydajność twojej aplikacji ....? Czytaj dalej.
W specyfikacji języka Java domyślną / początkową wartość dowolnego obiektu można podać jako następujące.
Dla typu bajt The Domyślna wartość jest zerowa , to znaczy wartość (bajt) wynosi 0 .
Dla typu Short The Domyślna wartość jest zerowa , to znaczy wartość (krótka) wynosi 0 .
Dla typu int The Domyślna wartość jest zerowa , czyli 0 .
Dla typu długi The Domyślna wartość jest zerowa , czyli 0L .
Dla typu pływaka The Domyślna wartość jest dodatnia zerowy , czyli 0.0f .
Dla typu podwójnego The Domyślna wartość jest dodatnia zerowy , czyli 0.0d .
Dla typu char The Domyślna wartość jest zerowa charakter, czyli „ \ u0000 ”.
Dla typu boolean The Domyślną wartością jest false .
Dla wszystkich typów referencyjnych The Domyślna wartość jest zerowa .
Biorąc to wszystko pod uwagę, nie trzeba inicjalizować zerowymi wartościami elementów tablicy, ponieważ domyślnie wszystkie elementy tablicy mają wartość 0 dla tablicy int.
Ponieważ tablica jest obiektem kontenerowym, który przechowuje stałą liczbę wartości jednego typu. Teraz typ tablicy dla ciebie to int, więc weź pod uwagę, że domyślna wartość dla wszystkich elementów tablicy będzie automatycznie równa 0, ponieważ zawiera typ int .
Teraz uważa się tablicę do typu String , tak aby wszystkie elementy tablicy ma wartość domyślną jest zerowa .
Dlaczego tego nie zrobisz ......?
możesz przypisać wartość zerową za pomocą pętli, jak sugerujesz w swoim pytaniu.
Ale jeśli to zrobisz, spowoduje to bezużyteczną utratę cyklu maszyny. a jeśli użyjesz w swojej aplikacji, w której masz wiele tablic i robisz to dla każdej tablicy, wpłynie to na wydajność aplikacji do znacznego poziomu.
Więcej wykorzystania cyklu maszynowego ==> Więcej czasu na przetwarzanie danych ==> Czas wyjściowy znacznie się wydłuży . dzięki czemu przetwarzanie danych aplikacji można uznać za niski poziom (zwolnij do pewnego poziomu).
źródło
Możesz zapisać pętlę, inicjalizacja jest już ustawiona na 0. Nawet dla zmiennej lokalnej.
Ale proszę poprawić miejsce, w którym umieszcza się nawiasy, aby zapewnić czytelność (uznana najlepsza praktyka):
źródło
Jeśli używasz liczby zmiennoprzecinkowej lub liczby całkowitej, możesz przypisać wartość domyślną w ten sposób ...
źródło
Możesz utworzyć nową pustą tablicę z istniejącym rozmiarem tablicy i przypisać je z powrotem do tablicy. To może być szybsze niż inne. Snipet:
Wynik:
źródło
Tak, wartości int w tablicy są inicjowane na zero. Ale nie masz tego gwarancji. Dokumentacja Oracle stwierdza, że jest to zła praktyka kodowania.
źródło
Wartości int są już zerowe po inicjalizacji, jak wszyscy wspominali. Jeśli masz sytuację, w której faktycznie musisz ustawić wartości tablicy na zero i chcesz to zoptymalizować, użyj
System.arraycopy
:To stosuje się
memcpy
pod przykryciem w większości lub wszystkich implementacjach JRE. Zauważ, że użycie takiego statycznego jest bezpieczne nawet w przypadku wielu wątków, ponieważ najgorszym przypadkiem jest wielokrotne przeniesienie wielu wątkówzeros
jednocześnie, co niczego nie zaszkodzi.Możesz także użyć,
Arrays.fill
jak wspomnieli inni.Arrays.fill
można użyćmemcpy
w inteligentnej maszynie JVM, ale prawdopodobnie jest to po prostu pętla Java i związane z tym sprawdzanie granic.Oczywiście sprawdź swoje optymalizacje.
źródło
Jeszcze inne podejście z wykorzystaniem lambda powyżej java 8
źródło
W c / cpp nie ma skrótu do inicjowania wszystkich tablic za pomocą zerowego indeksu dolnego.
Ale w java istnieje magiczne narzędzie o nazwie Arrays.fill (), które wypełni wszystkie wartości w tablicy wybraną liczbą całkowitą. Np .:
źródło
Inicjalizacja nie jest wymagana w przypadku zera, ponieważ domyślna wartość int w Javie wynosi zero. W przypadku wartości innych niż zero dostępnych
java.util.Arrays
jest wiele opcji, najprostszą jest metoda wypełnienia.Możemy również użyć Arrays.setAll (), jeśli chcemy wypełnić wartość na podstawie warunków:
źródło
zadeklaruj tablicę jako zmienną instancji w klasie, tj. z każdej metody, a JVM da jej 0 jako wartość domyślną. Nie musisz się już martwić
źródło
wynik 0123456-1012345 -2-101234-3-2-10123 -4-3-2-1012 -5-4-3-2-101 -6-5-4-3-2-10
źródło