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"
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"
Samemu porównaj:
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?");
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.
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).
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..
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.