sterta, alokacja pamieci, o co tu chodzi

0

Witam,

Czym sie różnią 2 poniższe zapisy:

String[] fruits1 = new String[] {"apple", "kiwi"};
String[] fruits2 = {"apple", "kiwi"};

W pierwszym tworzymy tablicę Stringow alokując pamięć na stercie, a w drugim przypadku?

"hmm Synu nie bluzgaj"

1

Samemu porównaj:
28029adcd4.png

0

Dzięki za odpowiedź. 2 pytania..
To jest skompilowane do kodu bajtowego?
W takim razie po co jest operator "new" w Javie, skoro wychodzi na to samo? Chodzi o to żeby w jawny sposób pokazać że tworzymy tutaj nowy obiekt, a raczej referencje do obiektu?
String text1="wtf?";
String text2=new String ("wtf?");

0

To jest skompilowane do kodu bajtowego?

Tak, skompilowane javac pliczek.java i wyświetlone javap -c pliczek.class.

skoro wychodzi na to samo?

Nie wychodzi. O ile ten pierwszy przypadek to faktycznie to samo, to ten drugi już nie.

Compiled from "Main.java"
public class Main {
  public Main();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: return

  public static void test1();
    Code:
       0: new           #2                  // class java/lang/String
       3: dup
       4: ldc           #3                  // String Foo
       6: invokespecial #4                  // Method java/lang/String."<init>":(Ljava/lang/String;)V
       9: astore_0
      10: return

  public static void test2();
    Code:
       0: ldc           #5                  // String bar
       2: astore_0
       3: return
}

test to ta wersja z new, test2 samo przypisanie literału.

0

Oba przypadki alokuja na stercie i nie ma miedzy nimi zadnej roznicy. W javie nie ma explicit allocation na stercie. Wszystkie stack operands sa alokowane na stercie. Obiekty alokowalne sa w TLAB (jesli sie mieszcza).

0

Mozesz wyjaśnic co masz na mysli mówiąc że nie ma różnicy? Z tego co jest wyżej,wyraźnie widać że kod bajtowy sie różni..

0

W przypadku Stringow naczales dosc skomplikowany temat: pula Stringow w JVM.
String s = "jvm";
sprawi, ze w runtime "jvm" bedzie nalezal do puli tzw. internal Strings. Jesli zrobic:
String z = "jvm";
to prawda bedzie:
s.equals(z)
s == z

Jesli zrobisz:
String z = new String("jvm");
to utworzony zostanie nowy String ktory nie bedzie 'internal', i ktory bedzie mial takie zachowanie:
s.equals(z) -> true
s == z -> false
bo sa to inne instancje (s jest z wewnetrznej puli, z utworzyles sam a jako wzorzec zostal wziety string z puli...)

Co do pytania o tablice:
String[] a = {"a", "b"};
mozna uzyc tylko gdy tworzenie tablicy i jej inicjalizacja sa wykonywane na raz. Bardzo czesto tak sie jednak nie da, np. gdy w konstruktorze inicjalizujesz pole obiektu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1