[JAVA] Zone de chaîne et de tas et pool constant

zone de mémoire java

Grossièrement!

Registre
Existe dans le processeur et ne peut pas être contrôlé
zone de pile
Type de base, la valeur de référence est enregistrée
La gestion de la mémoire se fait en déplaçant le point d'avant en arrière
zone de tas
Objet créé par nouveau
zone statique
Comme le dit le mot, les membres statiques
constant pool
Données confirmées au moment de la compilation et existantes dans .class + autres
Zone non-RAM
disque dur etc.

Zone de chaîne et de tas et pool constant

Sujet principal: Je voudrais vérifier "les données qui sont confirmées au moment de la compilation et qui existent en .class".

Vérification des contenus familiers

Généré en piscine constante

String a1 = "aaa";
String a2 = "aaa";
System.out.println(a1 == a2); // true
  1. "aaa" est généré dans la zone de pool contant, et la valeur de référence a1 pointant vers "aaa" est générée dans la zone de pile.
  2. Puisqu'il y a "aaa" dans la zone de pool contant, une valeur de référence a2 pointant vers "aaa" est générée dans la zone de pile.
  3. Puisque a1 et a2 contiennent l'adresse de "aaa", cela devient vrai.

Généré dans la zone de tas

String a3 = new String("aaa");
String a4 = new String("aaa");
System.out.println(a3 == a4); // false
  1. "aaa" est généré dans la zone de tas, et la valeur de référence a3 pointant vers "aaa" est générée dans la zone de pile.
  2. "aaa" est généré dans la zone de tas et la valeur de référence a4 pointant vers "aaa" est générée dans la zone de pile.
  3. a3 et a4 sont faux car ils contiennent des adresses "aaa" différentes.

Généré en pool constant, zone de tas

String a5 = "aaa";
String a6 = new String("aaa");
System.out.println(a5 == a6); // false
  1. "aaa" est généré dans la zone de pool de constantes, et la valeur de référence a5 pointant vers "aaa" est générée dans la zone de pile.
  2. "aaa" est généré dans la zone de tas et la valeur de référence a6 pointant vers "aaa" est générée dans la zone de pile.
  3. a5 et a6 sont faux car ils contiennent des adresses "aaa" différentes.

Vérification de contenus légèrement inhabituels

Constante + constante

String a1 = "ab";
String a2 = "a" + "b";
System.out.println(a1 == a2); // true
  1. "ab" est généré dans la zone de pool de constantes, et la valeur de référence a1 pointant vers "ab" est générée dans la zone de pile.
  2. "a" est une constante, "b" est une constante, donc a2 = "ab" au moment de la compilation. Une valeur de référence a2 est générée qui pointe vers "ab" qui existe dans l'interrogation constante.
  3. Puisque a1 et a2 contiennent l'adresse de "ab", cela devient vrai.
  4. Quand je l'ai regardé avec decompile, c'était String a2 =" ab ";.

Constante + nouvelle chaîne ("")

String a1 = "ab";
String a2 = "a" + new String("b");
System.out.println(a1 == a2); // false
  1. "ab" est généré dans la zone de pool de constantes, et la valeur de référence a1 pointant vers "ab" est générée dans la zone de pile.
  2. La nouvelle chaîne ("") n'est pas finalisée au moment de la compilation. Par conséquent, "b" est généré dans la zone de tas au moment de l'exécution, et en outre la zone de tas "ab" est générée.
  3. Par conséquent, a1 et a2 sont faux car ils contiennent des adresses "ab" différentes.

Constante + valeur de référence

String a1 = "ab";
String a2 = "b";
String a3 = "a" + a2;
System.out.println(a1 == a3); // false
  1. "ab" est généré dans la zone de pool de constantes, et la valeur de référence a1 pointant vers "ab" est générée dans la zone de pile.
  2. "b" est généré dans la zone de réserve constante, et la valeur de référence a2 pointant vers "ab" est générée dans la zone de pile.
  3. Puisque a2 est une valeur de référence, elle n'est pas fixée au moment de la compilation. Par conséquent, "ab" est généré dans la zone de tas au moment de l'exécution et a3 pointe vers lui.
  4. Par conséquent, a1 est un pool constant et a3 est une zone de tas, il devient donc faux.

Constante + finale

String a1 = "ab";
final String a2 = "b";
String a3 = "a" + a2;
System.out.println(a1 == a3); // true
  1. Au final, a2 est considéré comme une constante et a3 est constante + constante = constante.

En le regardant avec décompilateur, il a été compilé comme suit.

String a1 = "ab";
String a2 = "b";
String a3 = "ab";
System.out.println(a1 == a3);

String.intern() Une méthode qui peut étendre le pool de constantes.

Instance de chaîne .intern ()

  1. Si la même valeur existe dans le pool de constantes, sa valeur de référence est renvoyée.
  2. Si la même valeur n'existe pas dans le pool de constantes, générez une valeur dans le pool de constantes et renvoyez sa valeur de référence.
String a1 = "ab";
String a2 = new String("ab");
System.out.println(a1 == a2); // false
a2 = a2.intern();
System.out.println(a1 == a2); // true
  1. "ab" est généré dans la zone de pool de constantes, et la valeur de référence a1 pointant vers "ab" est générée dans la zone de pile.
  2. "ab" est généré dans la zone de tas, et la valeur de référence a2 pointant vers "ab" est générée dans la zone de pile.
  3. False est omis.
  4. Puisque a2.intern () et "ab" existent dans le pool de constantes, renvoyez l'adresse "ab" du pool de constantes à a2.
  5. Les deux a1 et a2 pointent vers "ab" dans le pool continu, c'est donc vrai.

Bonus: pourquoi String + ne fonctionne pas bien

String s = null;
for(int i = 0; i < 100; ++i) {
    s = s + "a";
}

Basé sur la vérification à ce jour Parce que s dans s +" a "; est une variable, un nouvel objet est créé et détruit chaque fois qu'il est exécuté.

Recommended Posts

Zone de chaîne et de tas et pool constant
String et stringbuffer et générateur de chaîne
Littéraux de chaîne et instances
[Java] Comparaison des chaînes de caractères et && et ||
[Java] Zone de pile et zone statique
[Java] À propos de String et StringBuilder
Concaténation de chaînes et sauts de ligne