Maison Java javaDidacticiel Résumé de la relation entre le type de base et les données de type encapsulé, ainsi que le tas et la pile en Java

Résumé de la relation entre le type de base et les données de type encapsulé, ainsi que le tas et la pile en Java

Apr 25, 2017 am 09:56 AM

Le tas de Java est une zone de données d'exécution, à partir de laquelle les objets de classe allouent de l'espace. Ces objets sont créés via des instructions telles que new, newarray, anewarray et multianewarray, et ils ne nécessitent pas que le code du programme soit explicitement composé. de déchets L'avantage du tas est qu'il peut allouer dynamiquement la taille de la mémoire, et la durée de vie n'a pas besoin d'être indiquée au compilateur à l'avance, car il alloue dynamiquement la mémoire au moment de l'exécution, et le garbage collector de Java collectera automatiquement celles qui ne sont plus utilisées. Données. Mais l'inconvénient est qu'en raison de l'allocation dynamique de la mémoire au moment de l'exécution, la vitesse d'accès est plus lente

L'avantage de la pile est que la vitesse d'accès est plus rapide que celle du tas, juste derrière le registre. , et les données de la pile peuvent être partagées. Mais l'inconvénient est que la taille et la durée de vie des données stockées dans la pile doivent être déterminées, et il y a un manque de flexibilité. La pile stocke principalement certains types de variables de base (int, short). , long, byte, float, double, boolean, char) et Object handle

Une particularité très importante de la pile est que les données stockées dans la pile peuvent être partagées. :

int a = 3; 
int b = 3;
Copier après la connexion

Le compilateur traite d'abord int a = 3 ; il créera d'abord une référence à la variable a dans la pile, puis vérifiera s'il y a une valeur de 3 dans la pile. . S'il n'est pas trouvé, il stockera 3 dans, puis pointera a vers 3 ; puis traitera int b = 3 ; Après avoir créé la variable de référence de b, puisqu'il y a déjà une valeur de 3 sur la pile, b est directement pointé vers. 3. De cette façon, a et b pointent tous deux vers 3 en même temps. Si vous définissez à nouveau a=4, le compilateur recherchera à nouveau s'il y a une valeur 4 dans la pile. Sinon, il stockera 4. in et faites un point sur 4 ; s'il existe déjà, il pointera directement a vers cette adresse. Le changement de valeur n'affectera pas la valeur de b.

Il est à noter que ce type de partage de données. est différent du partage des références de deux objets pointant vers un même objet en même temps, car dans ce cas, la modification de a n'affecte pas la valeur de b. Elle n'affectera pas b, elle est effectuée par le compilateur, ce qui est le cas. permet d'économiser de l'espace. Si une variable de référence d'objet modifie l'état interne de cet objet, cela affectera une autre variable de référence d'objet.

Une chaîne de données de type wrapper spéciale peut être créée sous deux formes : <🎜. >


. La première consiste à utiliser new() pour créer un nouvel objet, qui sera stocké dans le tas. Chaque fois qu'il est appelé, un nouvel objet sera créé. consiste d'abord à créer une variable de référence d'objet str de la classe String dans la pile, puis à vérifier si "abc" est stocké dans la pile. Sinon, "abc" est stocké sur la pile et str pointe vers "abc". ". S'il y a déjà "abc", pointez directement str vers "abc".

String str = new String("abc"); 
String str = "abc";
Copier après la connexion
Pour comparer si les valeurs de la classe sont égales, utilisez la méthode equals(). ;Lorsque vous testez si les références de deux classes wrapper pointent vers le même objet, utilisez == L'exemple suivant illustre la théorie ci-dessus.




System.out.println(str1==str2); //true
On peut voir que str1 et str2 pointent vers le même objet.

String str1 = "abc"; 
String str2 = "abc";
Copier après la connexion


Utiliser new, c'est générer différents objets. Générez-en un à la fois.

Par conséquent, si vous utilisez la première méthode pour créer plusieurs chaînes "abc", il n'y a en fait qu'un seul objet dans la mémoire. Cette méthode d'écriture est bénéfique pour économiser de l'espace mémoire, en même temps, elle peut s'améliorer. les performances du programme dans une certaine mesure. Vitesse d'exécution, car la JVM déterminera automatiquement s'il est nécessaire de créer un nouvel objet en fonction de la situation réelle des données dans la pile. Pour le code de String str = new String("abc");, de nouveaux objets sont toujours créés dans le tas, que leurs valeurs de chaîne soient égales ou qu'il soit nécessaire de créer de nouveaux objets, augmentant ainsi la charge sur le programme.
String str1 =new String ("abc"); 
String str2 =new String ("abc"); 
System.out.println(str1==str2); // false
Copier après la connexion

Par contre, attention : Lorsque nous définissons une classe en utilisant un format tel que String str = "abc";, nous supposons toujours que l'objet str de la classe String est créé. Attention aux pièges ! L'objet n'a peut-être pas été créé ! Il peut simplement pointer vers un objet créé précédemment. Ce n'est que grâce à la méthode new() que nous pouvons garantir qu'un nouvel objet est créé à chaque fois.


En raison de la nature immuable de la classe String, lorsque la variable String doit fréquemment modifier sa valeur, vous devriez envisager d'utiliser la classe StringBuffer pour améliorer l'efficacité du programme. Le tas de Java est une zone de données d'exécution à partir de laquelle les objets de classe allouent de l'espace. Ces objets sont créés via des instructions telles que new, newaray, anewarray et multianewarray. Ils ne nécessitent pas de libération explicite du code du programme. , l'avantage du tas est qu'il peut allouer dynamiquement la taille de la mémoire, et la durée de vie n'a pas besoin d'être indiquée au compilateur à l'avance, car il alloue dynamiquement la mémoire au moment de l'exécution, et le garbage collector de Java collectera automatiquement les données qui ne sont pas plus utilisé. L'inconvénient est qu'en raison de l'allocation dynamique de la mémoire au moment de l'exécution, la vitesse d'accès est lente

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

1. Types de données en Java : types de données de base et références. Type de données ;

2. Bien que Java n'explique pas comment la mémoire est allouée lorsque le programme est en cours d'exécution, les développeurs ou les apprenants Java divisent généralement la mémoire en trois zones : l'espace de pile, l'espace de tas. , zone de méthode ;

Zone de tas :

a.Tous les objets sont stockés et chaque objet contient des informations sur une classe correspondante (le but de la classe est d'obtenir des instructions d'opération. )

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");
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

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

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

See all articles