Heim Java javaLernprogramm 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

Apr 25, 2017 am 09:56 AM

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;
Nach dem Login kopieren

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";
Nach dem Login kopieren

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";
Nach dem Login kopieren

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
Nach dem Login kopieren

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, Comparable, 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");
Nach dem Login kopieren

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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Oct 13, 2024 pm 01:32 PM

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.

See all articles