Le tas et la pile sont des concepts très importants dans la structure de données Java. Cet article analyse plus en détail la différence entre les deux. Pour votre référence. Les détails sont les suivants :
Le tas de Java est une zone de données d'exécution, à partir de quelle classe (les objets 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 de programme code pour libérer explicitement. Le tas est responsable du garbage collection. 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 la mémoire dynamiquement au moment de l'exécution. et le garbage collector de Java le collectera automatiquement. L'inconvénient est que la vitesse d'accès est plus lente en raison de l'allocation dynamique de mémoire au moment de l'exécution
L'avantage de la pile est que la vitesse d'accès est plus rapide que celle du tas, juste après le registre, 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 les handles d'objets. Une particularité très importante de la pile
est que les données stockées dans la pile peuvent être partagées. on définit en même temps :
int a = 3;
int b = 3;
Le compilateur traite d'abord int a = 3; puis recherchez s'il y a une valeur de 3 sur la pile. S'il n'est pas trouvé, il y stockera 3. Ensuite, traitez int b = 3 après avoir créé la variable de référence de b, car il y a déjà a. valeur de 3 sur la pile, b pointera directement vers 3. De cette façon, a et b pointeront tous deux vers 3. Dans le cas de 3.
À ce moment, si a=4 est défini encore une fois ; alors le compilateur recherchera à nouveau s'il y a une valeur 4 dans la pile. Sinon, il stockera 4 et fera un point sur 4 si c'est déjà le cas, pointez directement vers cette adresse ; les changements dans la valeur de a n'affecteront pas la valeur de b.
Veuillez noter que ce type de partage de données est lié au fait que les références de deux objets pointent vers un seul objet en même temps. différent, car dans ce cas, la modification de a n'affectera pas b, elle est effectuée par le compilateur, ce qui permet de gagner de la place, et si une variable de référence d'objet modifie l'état interne de l'objet, cela en affectera une autre. variable.
String est une classe wrapper spéciale qui peut être créée sous deux formes :
String str = new String("abc"); String str = "abc";
, la première est de. utilisez new() pour créer un nouvel objet, qui sera stocké dans le tas. Un nouvel objet sera créé à chaque appel, tandis que la seconde consiste à créer d'abord un nouvel objet sur la pile. objet de la classe String, puis vérifiez si "abc" est stocké dans la pile. Sinon, stockez "abc" sur la pile et faites pointer str vers "abc". S'il y a déjà "abc", pointez directement str Point. à "abc".
Lorsque vous comparez 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 ==. Ce qui suit utilise un exemple pour illustrer la théorie ci-dessus.
String str1 = "abc"; String str2 = "abc"; System.out.println(str1==str2); //true
On peut voir que str1 et str2 pointent vers le même objet.
String str1 =new String ("abc"); String str2 =new String ("abc"); System.out.println(str1==str2); // false
Utilisez new pour 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.
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.
J'espère que cet article sera utile à l'apprentissage de la programmation Java par chacun.
Pour plus d'articles liés à l'analyse de la différence entre tas et pile en Java, veuillez faire attention au site Web PHP chinois !