Heim  >  Artikel  >  Java  >  Zusammenfassung der Beziehung zwischen Basistyp- und gekapselten Typdaten sowie Heap und Stack in Java

Zusammenfassung der Beziehung zwischen Basistyp- und gekapselten Typdaten sowie Heap und Stack in Java

Y2J
Y2JOriginal
2017-04-25 09:56:141330Durchsuche

Der Heap von Java ist ein Laufzeitdatenbereich, aus dem Klassenobjekte Speicherplatz zuweisen. Diese Objekte werden durch Anweisungen wie new, newarray, anewarray und multianewarray erstellt und erfordern keine explizite Freigabe des Heaps 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 dynamischen Zuweisung von Speicher zur Laufzeit langsamer ist.

Der Vorteil des Stapels besteht darin, dass die Zugriffsgeschwindigkeit schneller ist als die des Heaps, gleich nach dem Register , und die Stapeldaten können gemeinsam genutzt werden. 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 Objekthandle

Eine sehr wichtige Besonderheit des Stapels ist, dass die im Stapel gespeicherten Daten gleichzeitig gemeinsam genutzt werden können :

int a = 3; 
int b = 3;

Der Compiler verarbeitet zunächst int a = 3; er erstellt dann einen Verweis auf die Variable a im Stapel und prüft dann, ob sich im Stapel ein Wert von 3 befindet Wenn nicht, wird 3 darin gespeichert und dann wird int b = 3 verarbeitet, da auf dem Stapel bereits der Wert 3 vorhanden ist 3. Auf diese Weise zeigen a und b gleichzeitig auf 3. Wenn Sie erneut a = 4 festlegen, sucht der Compiler erneut, ob sich ein 4-Wert im Stapel befindet in und auf 4 verweisen; wenn es bereits vorhanden ist, wird die Wertänderung keinen Einfluss auf den Wert von b haben unterscheidet sich von der gemeinsamen Nutzung der Referenzen zweier Objekte, die gleichzeitig auf ein Objekt verweisen, da sich in diesem Fall die Änderung von a nicht auf den Wert von b auswirkt, sondern vom Compiler durchgeführt wird Hilft, Platz zu sparen. Wenn eine Objektreferenzvariable den internen Status dieses Objekts ändert, wirkt sich dies auf eine andere Objektreferenzvariable aus. Es gibt zwei Arten von Zeichenfolgen:



Die erste Methode besteht darin, mit new() ein neues Objekt zu erstellen, das bei jedem Aufruf im Heap gespeichert wird besteht darin, zunächst eine Objektreferenzvariable str der String-Klasse im Stapel zu erstellen und dann zu prüfen, ob „abc“ im Stapel gespeichert ist. Wenn nicht, wird „abc“ auf dem Stapel gespeichert und str zeigt auf „abc“. ". Wenn bereits „abc“ vorhanden ist, zeigt str direkt auf „abc“.

Verwenden Sie beim Vergleich, ob die Werte in der Klasse gleich sind, die Methode equal(). ;Beim Testen, ob die Referenzen vorhanden sind Wenn zwei Wrapper-Klassen auf dasselbe Objekt verweisen, verwenden Sie ==. Das folgende Beispiel veranschaulicht die obige Theorie.

String str = new String("abc"); 
String str = "abc";

System.out.println(str1==str2); //true
Es ist ersichtlich, dass str1 und str2 auf dasselbe Objekt zeigen.


Mit new werden verschiedene Objekte generiert. Generieren Sie jeweils eins.
String str1 = "abc"; 
String str2 = "abc";

Wenn Sie also die erste Methode verwenden, um mehrere „abc“-Strings zu erstellen, befindet sich tatsächlich nur ein Objekt im Speicher. Diese Schreibweise ist vorteilhaft für die Einsparung von Speicherplatz und kann gleichzeitig verbessert werden die Leistung des Programms bis zu einem gewissen Grad, da die JVM anhand der tatsächlichen Situation der Daten im Stapel automatisch bestimmt, 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.

Andererseits beachten Sie 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! Möglicherweise verweist es lediglich auf ein zuvor erstelltes Objekt. Nur durch die Methode new() können wir sicherstellen, dass jedes Mal ein neues Objekt erstellt wird.

String str1 =new String ("abc"); 
String str2 =new String ("abc"); 
System.out.println(str1==str2); // false

Aufgrund der Unveränderlichkeit der String-Klasse sollten Sie die Verwendung der StringBuffer-Klasse in Betracht ziehen, wenn die String-Variable ihren Wert häufig ändern muss, um die Programmeffizienz zu verbessern. Der Heap von Java ist ein Laufzeitdatenbereich, aus dem Klassenobjekte durch Anweisungen wie new, newaray und multianewarray erstellt werden. Für die explizite Freigabe ist der Heap 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 automatisch die nicht vorhandenen Daten sammelt länger verwendet. Der Nachteil ist, dass aufgrund der dynamischen Speicherzuweisung zur Laufzeit die Zugriffsgeschwindigkeit langsam ist

/************************************************** ************************************************** ********************************************/

1. Datentypen in Java: grundlegende Datentypen und Referenzen. Datentyp;

2. Obwohl Java nicht erklärt, wie Speicher während der Ausführung des Programms zugewiesen wird, teilen Java-Entwickler oder Lernende den Speicher normalerweise in drei Bereiche auf: Stapelspeicherplatz, Heapspeicherplatz , Methodenbereich;

Heap-Bereich:

a. Alle Objekte werden gespeichert und jedes Objekt enthält Informationen über eine entsprechende Klasse (der Zweck der Klasse besteht darin, Operationsanweisungen zu erhalten. )

b.jvm只有一个堆区被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

栈区:

a.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中

b.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

c.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

方法区:

a.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。

b.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。字符串常量在方法区分配 ,数组既在栈空间分配数组名称, 又在堆空间分配数组实际的大小。

上面明白之后,接下来我们来分析 String str=new String("abc");

String str 是定义了一个String类型的变量,此时只定义了而没有创建对象,而new Sring(“abc”)到底做了什么?我们可以查看String的源码,发现如下:

public final class String
        implements java.io.Serializable, Comparablef7e83be87db5cd2d9a8a0b8117b38cd4, CharSequence
        {
                /** The value is used for character storage. */
                private final char value[];
                ……

发现她有一个Value的属性,类型是char[],而此数组又做了什么事情?如果读源码会发现他保存了String对象的值,此时也说明String就是char[]来组织的。

当执行String a="abc";时,JAVA虚拟机会在栈中创建三个char型的值'a'、'b'和'c',然后在堆中创建一个String对象,它的值(value)是刚才在栈中创建的三个char型值组成的数组{'a','b','c'}对象,而这个新创建的String对象会被添加到字符串池中。

此时就存在了两个对象:一个在堆中;一个在字符串池中。

/**************************************************************************************************************************/

     String str1 = "abc";
   String str2 = new String("abc");

Das obige ist der detaillierte Inhalt vonZusammenfassung der Beziehung zwischen Basistyp- und gekapselten Typdaten sowie Heap und Stack in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn