/ / Zmiana rozmiaru tablicy po utworzeniu - java, tablice

Zmienianie rozmiaru tablicy po utworzeniu - java, arrays

Czy ktoś może wyjaśnić, co się tutaj dzieje. Miałem wrażenie, że rozmiar tablicy nie może zostać zmieniony po jej utworzeniu i zadeklarowaniu.

public class ArrayManipulation
{
public static void main(String[] args)
{
int a[] = {1, 2, 3};//new int[3];
int b[] = new int[a.length-1];

System.out.print("a = ");
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + "  ");
System.out.println();

for (int i = 0; i < b.length; i++)
b[i] = a[i];
//This is the bit I am confused about.. I was expecting an error here
a = b;

System.out.print("a = ");
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + "  ");
System.out.println();
}
}

Odpowiedzi:

6 dla odpowiedzi № 1

Tablice są obiektami i tak, po ich utworzeniu ich rozmiar się nie zmienia.

w linii:

a= b;

wskazujesz a odniesienie do b obiekt. Więc twój pierwszy przedmiot to a odwołanie jest nadal w maszynie wirtualnej, dopóki nie zostaną zebrane śmieci.

Ale rozmiar twojej tablicy nie zmienił się, ale teraz odwołujesz się do tablicy / obiektu differet


0 dla odpowiedzi nr 2

Obie a i b są rodzaju int[]. Więc a = b po prostu przypisz wartość a do wartości b.

Po tym zadaniu oboje a i b odnoszą się do tej samej tablicy i początkowej tablicy, do której odwołuje się a mogą być zbierane przez zbieracz śmieci ponieważ nie jest już dostępny.


0 dla odpowiedzi № 3

Zmieniasz to odwołanie a wskazuje na kiedy mówisz a = b.

Ponieważ tablice są obiektami, ustawienie jednego równego drugiemu zmienia odniesienie. Obie tablice nadal istnieją, ale obie referencje - a i b - wskaż lokalizację b. Jedyny sposób na usunięcie tablicy a to zbierać śmieci.

W rzeczywistości nie zmieniasz rozmiaru tablicy, wygląda na to.


0 dla odpowiedzi nr 4
    //This is the bit I am confused about.. I was expecting an error here
a = b;

Tak, jesteś zmieszany z właściwą rzeczą! a i b mieć przydzieloną własną pamięć. Z a = b robisz a wskaż pamięć przydzieloną do b.

Być może dodanie tych dodatkowych sysouts do kodu pomoże, zobacz wyjście:

public class ArrayManipulation
{
public static void main(String[] args)
{
int a[] = {1, 2, 3};//new int[3];
int b[] = new int[a.length-1];


System.out.print("a = ");
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + "  ");
System.out.println();

for (int i = 0; i < b.length; i++)
b[i] = a[i];

System.out.print("NEW -- before a=b. a = " + a);
System.out.print("NEW -- before a=b. b = " + b);
//This is the bit I am confused about.. I was expecting an error here
a = b;
System.out.print("NEW -- after a=b. a = " + a);
System.out.print("NEW -- after a=b. b = " + b);

System.out.print("a = ");
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + "  ");
System.out.println();
}
}