Pytanie Jak zadeklarować i zainicjować tablicę w Javie?


Jak zadeklarować i zainicjować tablicę w Javie?


1617
2017-07-29 14:22


pochodzenie


Czy java 10 pozwala zadeklarować tablicę za pośrednictwem var? - gstackoverflow


Odpowiedzi:


Możesz użyć deklaracji tablicowej lub literału tablicowego (ale tylko wtedy, gdy zadeklarujesz i wpłyniesz na zmienną od razu, literały tablicowe nie mogą być użyte do ponownego przypisania tablicy).

W przypadku typów pierwotnych:

int[] myIntArray = new int[3];
int[] myIntArray = {1,2,3};
int[] myIntArray = new int[]{1,2,3};

Dla klas, na przykład String, to jest to samo:

String[] myStringArray = new String[3];
String[] myStringArray = {"a","b","c"};
String[] myStringArray = new String[]{"a","b","c"};

Trzeci sposób inicjowania jest przydatny, gdy deklarujesz najpierw tablicę, a następnie ją inicjalizujesz. Obsada jest niezbędna tutaj.

String[] myStringArray;
myStringArray = new String[]{"a","b","c"};

2192
2017-07-09 21:59



Jaki jest cel posiadania drugiej i trzeciej drogi, aby to zrobić? - Quazi Irfan
@iamcreasy Wygląda na to, że drugi sposób nie działa z instrukcjami powrotu. return {1,2,3} daje błąd, podczas gdy return new int[]{1,2,3} działa dobrze (zakładając oczywiście, że twoja funkcja zwraca tablicę całkowitą). - Skylar Ittner
@SylylarMT Ale nadal możemy użyć pierwszego sposobu użycia instrukcji return. - Quazi Irfan
@iamcreasy Niedawno napisałem funkcję, która zwróciła tablicę ints. Jeśli wystąpił błąd wewnątrz funkcji, chciałem, aby zwrócił pewną wartość, ale funkcję potrzebną do zwrócenia tablicy. Który sposób działa dla instrukcji zwrotnej z jednym linkiem? Tylko trzeci. - Skylar Ittner
@apadana W drugim przypadku tworzysz anonimowy obiekt, który jest zdefiniowany tylko w otaczającym zakresie (funkcja lub cokolwiek). Po zwróceniu go do osoby dzwoniącej nie jest już ważna. Używając nowego słowa kluczowego, alokujesz nowy obiekt ze sterty i jest on ważny poza zakresem definiowania. - teukkam


Istnieją dwa rodzaje tablic.
 

Jednowymiarowa tablica

Składnia dla wartości domyślnych:

int[] num = new int[5];

Lub (mniej preferowane)

int num[] = new int[5];

Składnia z podanymi wartościami (inicjalizacja zmiennych / pól):

int[] num = {1,2,3,4,5};

Lub (mniej preferowane)

int num[] = {1, 2, 3, 4, 5};

Uwaga: Dla wygody int [] liczba jest preferowana, ponieważ wyraźnie mówi, że mówisz tutaj o tablicy. W przeciwnym razie nie ma różnicy. Ani trochę.

Tablica wielowymiarowa

Deklaracja

int[][] num = new int[5][2];

Lub

int num[][] = new int[5][2];

Lub

int[] num[] = new int[5][2];

Inicjalizacja

 num[0][0]=1;
 num[0][1]=2;
 num[1][0]=1;
 num[1][1]=2;
 num[2][0]=1;
 num[2][1]=2;
 num[3][0]=1;
 num[3][1]=2;
 num[4][0]=1;
 num[4][1]=2;

Lub

 int[][] num={ {1,2}, {1,2}, {1,2}, {1,2}, {1,2} };

Ragged Array (lub Non-rectangular Array)

 int[][] num = new int[5][];
 num[0] = new int[1];
 num[1] = new int[5];
 num[2] = new int[2];
 num[3] = new int[3];

Więc tutaj wyraźnie definiujemy kolumny.
Inny sposób: 

int[][] num={ {1}, {1,2}, {1,2,3,4,5}, {1,2}, {1,2,3} };

W celu uzyskania dostępu:

for (int i=0; i<(num.length); i++ ) {
    for (int j=0;j<num[i].length;j++)
        System.out.println(num[i][j]);
}

Alternatywnie:

for (int[] a : num) {
  for (int i : a) {
    System.out.println(i);
  }
}

Szelmowe tablice to wielowymiarowe tablice.
Aby uzyskać wyjaśnienia, zobacz szczegóły wielowymiarowych tablic na oficjalne samouczki java


222
2017-07-29 14:29



Czy pierwszy nie doprowadzi do pustej / pustej tablicy zamiast do tablicy z wartościami domyślnymi? - vipin8169
Zgadzam się w tej kwestii i możemy dodać jeszcze jedną cechę, możemy dynamicznie zmieniać rozmiar. - AdamIJK
Mogę z tobą spierać się o to, że tablica wielowymiarowa jest innym "typem" tablicy. Jest to po prostu termin używany do opisania tablicy zawierającej inne tablice. Zarówno zewnętrzne macierze, jak i wewnętrzne macierze (i te pomiędzy nimi, jeśli istnieją) są po prostu regularnymi tablicami. - tradeJmark


Type[] variableName = new Type[capacity];

Type[] variableName = {comma-delimited values};



Type variableName[] = new Type[capacity]; 

Type variableName[] = {comma-delimited values};

jest również poprawny, ale preferuję nawiasy po typie, ponieważ łatwiej zauważyć, że typ zmiennej jest w rzeczywistości tablicą.


116
2017-07-29 14:28



Zgadzam się w tej kwestii. Typ zmiennej nie jest "TYPE", ale faktycznie TYPE [], więc warto napisać to w ten sposób dla mnie. - Chet
Styl Google zasugeruj to również. - wener
Zauważ, że int[] a, b; nie będzie taki sam jak int a[], b;, łatwo popełnić błąd, jeśli użyjesz tej drugiej formy. - Jeroen Vannevel


Istnieje wiele sposobów deklarowania tablicy w Javie:

float floatArray[]; // Initialize later
int[] integerArray = new int[10];
String[] array = new String[] {"a", "b"};

Możesz znaleźć więcej informacji w Sun samouczek strona i JavaDoc.


32
2017-07-29 14:29





Uważam, że pomocne jest zrozumienie każdej części:

Type[] name = new Type[5];

Type[] jest rodzaj z zmienna nazwie nazwie ("nazwa" nazywa się identyfikator). Dosłowne "Typ" jest typem podstawowym, a nawiasy oznaczają, że jest to typ tablicy tej bazy. Typy tablic są z kolei swoimi własnymi, co pozwala na tworzenie tablic wielowymiarowych Type[][] (typ tablicy Typ []). Słowo kluczowe new mówi, aby przydzielić pamięć dla nowej tablicy. Liczba między nawiasem określa, jak duża będzie nowa tablica i ile pamięci do przydzielenia. Na przykład, jeśli Java wie, że jest to typ podstawowy Type zajmuje 32 bajty, a chcesz mieć tablicę o rozmiarze 5, musi wewnętrznie przydzielić 32 * 5 = 160 bajtów.

Możesz także tworzyć tablice z wartościami już tam występującymi, takimi jak

int[] name = {1, 2, 3, 4, 5};

który nie tylko tworzy pustą przestrzeń, ale wypełnia ją tymi wartościami. Java może powiedzieć, że prymitywy są liczbami całkowitymi i że jest ich 5, więc rozmiar tablicy można określić niejawnie.


26
2018-06-04 06:02



Więc nie jest konieczne uwzględnianie int[] name = new int[5] ? - Cookie Monster


Poniżej przedstawiono deklarację tablicy, ale tablica nie została zainicjowana:

 int[] myIntArray = new int[3];

Poniżej przedstawiono deklarację oraz inicjalizację tablicy:

int[] myIntArray = {1,2,3};

Teraz poniżej przedstawiono deklarację oraz inicjalizację tablicy:

int[] myIntArray = new int[]{1,2,3};

Ale ta trzecia pokazuje właściwość anonimowego tworzenia obiektów tablicowych, która jest wskazywana przez zmienną odniesienia "myIntArray", więc jeśli piszemy tylko "new int [] {1,2,3};" w ten sposób można stworzyć anonimowy obiekt-tablicę.

Jeśli po prostu napiszemy:

int[] myIntArray;

nie jest to deklaracja tablicowa, ale poniższa instrukcja sprawia, że ​​powyższa deklaracja jest kompletna:

myIntArray=new int[3];

26
2017-07-29 14:25



Nie ma absolutnie żadnej różnicy między podejściem drugim i trzecim, innym niż podejście drugie tylko działa, gdy deklarujesz również zmienną. Nie jest jasne, co masz na myśli, mówiąc "pokazuje właściwość anonimowego tworzenia obiektów tablicy", ale tak naprawdę są to równoważne fragmenty kodu. - Jon Skeet
Pierwszy urywek robi zainicjuj tablicę - jest gwarantowana wartość 0 dla każdego elementu tablicy. - Jon Skeet


Alternatywnie,

// Either method works
String arrayName[] = new String[10];
String[] arrayName = new String[10];

To deklaruje nazwę tablicy arrayName o rozmiarze 10 (masz elementy od 0 do 9 do użycia).


22
2017-07-29 15:56



Jakiego standardu użyć? Dopiero co odkryłem ten pierwszy i uważam go za strasznie mylący: | - Anti Earth
Za to, co jest warte, mój prof. Powiedział, że druga droga jest bardziej typowa w Javie i że lepiej przekazuje to, co się dzieje; jako tablica powiązana z typem, dla którego zmienna została oddana jako. - Celeritas
Na marginesie: język mający więcej niż jedną semantykę do zadeklarowania jednej rzeczy, oznaczającej zły projekt językowy. - Muhammad Suleman


Ponadto, w przypadku, gdy potrzebujesz czegoś bardziej dynamicznego, znajduje się interfejs List. To nie będzie działać tak dobrze, ale będzie bardziej elastyczne:

List<String> listOfString = new ArrayList<String>();

listOfString.add("foo");
listOfString.add("bar");

String value = listOfString.get(0);
assertEquals( value, "foo" );

22
2018-01-28 19:19



Jak nazywa się "<>" na utworzonej przez ciebie liście? - CyprUS