Heap und Stack sind sehr wichtige Konzepte in der Java-Datenstruktur. In diesem Artikel wird der Unterschied zwischen den beiden detaillierter analysiert. Als Referenz. Die Einzelheiten lauten wie folgt:
Der Heap von Java ist ein Laufzeitdatenbereich, aus dem Klassenobjekte Speicherplatz zuweisen. Diese Objekte werden durch Anweisungen wie new, newaray, anewarray und multianewarray erstellt und erfordern keine explizite Freigabe des Programmcodes. Der Heap wird durch Garbage Collection gesammelt Verantwortlich, der Vorteil des Heaps besteht darin, dass er die Speichergröße dynamisch zuweisen kann und die Lebensdauer dem Compiler nicht im Voraus mitgeteilt werden muss, da er zur Laufzeit dynamisch Speicher zuweist und der Garbage Collector von Java diese nicht mehr verwendeten automatisch sammelt Der Nachteil besteht jedoch darin, dass die Zugriffsgeschwindigkeit aufgrund der Notwendigkeit, Speicher zur Laufzeit dynamisch zuzuweisen, langsam ist.
Der Vorteil des Stapels besteht darin, dass die Zugriffsgeschwindigkeit schneller ist als die des Heaps, nur nach dem Register, und dass die Stapeldaten gemeinsam genutzt werden können. Der Nachteil besteht jedoch darin, dass die Größe und Lebensdauer der im Stapel gespeicherten Daten bestimmt werden muss und es an Flexibilität mangelt. Der Stapel speichert hauptsächlich einige grundlegende Variablentypen (int, short, long, byte, float, double, boolean, char) und Objekthandles.
Eine sehr wichtige Besonderheit des Stacks besteht darin, dass die im Stack gespeicherten Daten gemeinsam genutzt werden können. Angenommen, wir definieren auch:
int a = 3;
int b = 3;
Der Compiler verarbeitet zuerst int a = 3; zuerst erstellt er einen Verweis auf die Variable a auf dem Stapel und prüft dann, ob der Wert 3 auf dem Stapel vorhanden ist. Wenn er nicht gefunden wird, speichert er 3 in und zeigt dann auf a 3. Verarbeiten Sie dann int b = 3; nachdem Sie die Referenzvariable von b erstellt haben, wird b direkt auf 3 verwiesen, da sich bereits ein Wert von 3 auf dem Stapel befindet. Auf diese Weise gibt es eine Situation, in der a und b gleichzeitig auf 3 zeigen.
Wenn zu diesem Zeitpunkt erneut a=4 gesetzt ist, sucht der Compiler erneut, ob sich ein 4-Wert im Stapel befindet, und setzt einen Punkt auf 4, falls dieser bereits vorhanden ist wird direkt auf diese Adresse verweisen. Daher haben Änderungen im Wert von a keinen Einfluss auf den Wert von b.
Es ist zu beachten, dass sich diese Art der Datenfreigabe von der gemeinsamen Nutzung der Referenzen zweier Objekte unterscheidet, die gleichzeitig auf ein Objekt verweisen, da in diesem Fall die Änderung von a keine Auswirkungen auf b hat und vom Compiler abgeschlossen wird ist vorteilhaft, um Platz zu sparen. Wenn eine Objektreferenzvariable den internen Zustand des Objekts ändert, wirkt sich dies auf eine andere Objektreferenzvariable aus.
String ist ein spezieller Wrapper-Datentyp. Kann verwendet werden:
String str = new String("abc");String str = "abc";
Es gibt zwei Möglichkeiten, es zu erstellen. Die erste besteht darin, mit new() ein neues Objekt zu erstellen, das im Heap gespeichert wird. Bei jedem Aufruf wird ein neues Objekt erstellt.
Die zweite Methode besteht darin, zunächst eine Objektreferenzvariable str der String-Klasse auf dem Stapel zu erstellen und dann zu prüfen, ob „abc“ im Stapel gespeichert ist. Wenn nicht, speichern Sie „abc“ auf dem Stapel und lassen Sie str auf „abc“ verweisen ". Wenn bereits „abc“ vorhanden ist, verweisen Sie str direkt auf „abc“.
Wenn Sie vergleichen, ob die Werte in einer Klasse gleich sind, verwenden Sie die Methode equal(). Wenn Sie testen, ob die Referenzen zweier Wrapper-Klassen auf dasselbe Objekt verweisen, verwenden Sie ==.
String str1 = "abc"; String str2 = "abc"; System.out.println(str1==str2);
Es ist ersichtlich, dass str1 und str2 auf dasselbe Objekt zeigen.
String str1 =new String ("abc"); String str2 =new String ("abc"); System.out.println(str1==str2);
Mit new werden verschiedene Objekte generiert. Generieren Sie jeweils eins.
Wenn Sie also die erste Methode verwenden, um mehrere „abc“-Zeichenfolgen zu erstellen, befindet sich tatsächlich nur ein Objekt im Speicher. Gleichzeitig kann dadurch die Ausführungsgeschwindigkeit verbessert werden Programm bis zu einem gewissen Grad, da die JVM anhand der tatsächlichen Situation der Daten im Stapel automatisch ermittelt, ob ein neues Objekt erstellt werden muss. Für den Code von String str = new String("abc"); werden immer neue Objekte im Heap erstellt, unabhängig davon, ob ihre String-Werte gleich sind oder ob neue Objekte erstellt werden müssen, wodurch die Belastung erhöht wird das Programm.
Beachten Sie andererseits bitte: Wenn wir eine Klasse mit einem Format wie String str = "abc"; definieren, gehen wir immer davon aus, dass das Objekt str der String-Klasse erstellt wird. Sorge vor Fallen! Das Objekt wurde möglicherweise nicht erstellt! Stattdessen verweist es möglicherweise nur auf ein zuvor erstelltes Objekt. Nur durch die Methode new() können wir sicherstellen, dass jedes Mal ein neues Objekt erstellt wird.
Aufgrund der Unveränderlichkeit der String-Klasse sollten Sie die Verwendung der StringBuffer-Klasse in Betracht ziehen, wenn eine String-Variable ihren Wert häufig ändern muss, um die Programmeffizienz zu verbessern.
Ich hoffe, dass das, was in diesem Artikel beschrieben wird, jedem beim Erlernen der Java-Programmierung hilfreich sein wird.