String str1;
String str2 = null;
String str3 = "";
String str4 = new String();
String str5 = new String("");
Wiem, że dla 3 inicjalizacji powyżej, przedmiotem łańcuch jest zainicjowany w basenie smyczkową a czwarta nie ma nic wspólnego z pulą ciągów.String w Javie
Jaka jest różnica między 1. a 2.? Jeśli jako zmienną wskaźnika przyjmuję str1
, to co zapisuje to konkretny adres pamięci, który nigdy nie jest używany przez maszynę JVM lub system operacyjny?
Czy istnieje różnica między 4. a 5.?
Kiedy drukować str1
i str2
bezpośrednio System.out.println(str1)
i System.out.println(str2)
, na str1
, nie mogę nawet przejść compilation.For str2
, kompilacja jest OK i mogę „null” i wyjście w oknie konsoli. Czemu?
Zmieniano po odpowiedzią @aioobe: więcej pytań:
Chciałbym wiedzieć więcej o „null”. Ponieważ str2
(zmienna referencyjna) jest jak zmienna wskaźnikowa, powinno w niej być coś (bity 0/1) (w pamięci zajmowanej przez tę zmienną wskaźnika). Ponieważ jest on zainicjowany jako null, czy wszystkie-0-bity lub kod bajtowy o wartości zerowej jest zerowe? Innym pytaniem jest to, że jeśli wywołasz metodę toString() na str2
przez str2.toString()
, otrzymałem błąd NullPointer w czasie wykonywania. Więc to JVM sprawdza, czy zmienna referencyjna ma wartość zerową? W jaki sposób JVM może wiedzieć, że jest zerowy? JVM sprawdza bity w str2
?
Jeszcze jedno pytanie o zerowy w Javie: concatenation of null and a string literal
Zaktualizowałem odpowiedź, edytując ją. – aioobe
Czy każdy, kto zagłosował w dół, podał jakiś powód? Nie mogę tego zrozumieć ... –
Sądzę, że ludzie wierzą, że to było wcześniej zadawane. Część twojego pytania * została * zadana wcześniej, część twojego pytania nie. – aioobe