Maison  >  Article  >  Java  >  Qu’est-ce qu’un pool constant en Java ? Introduction au pool constant Java

Qu’est-ce qu’un pool constant en Java ? Introduction au pool constant Java

不言
不言original
2018-09-20 14:40:448346parcourir

Le contenu de cet article porte sur ce qu'est le pool constant en Java ? L'introduction du pool constant Java a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer, j'espère que cela vous sera utile.

Pool constant en Java

Dans la machine virtuelle Java jvm, la répartition de la mémoire est la suivante : tas de machine virtuelle, compteur de programme, pile de méthodes locale, pile de machine virtuelle, zone de méthode.

Qu’est-ce qu’un pool constant en Java ? Introduction au pool constant Java

Le compteur de programme est le pipeline du programme d'exécution jvm et est utilisé pour stocker certaines instructions. La pile de méthodes locale est la pile utilisée par la méthode du système d'exploitation jvm, et. la pile de la machine virtuelle est La pile utilisée pour exécuter le code du programme contient des variables de classe, des informations de classe, des informations de méthode et des pools de constantes (références de symboles, sous forme de tableaux) dans la zone de méthode. Le tas est le tas utilisé par la machine virtuelle. pour exécuter le code du programme.

Constante ? C'est une quantité qui ne peut pas être modifiée une fois la valeur donnée. Les variables membres modifiées avec final sont des constantes.

Qu'est-ce qu'un pool constant de fichiers de classe ?

Nous savons que dans le fichier de classe, il y a des informations sur la version de la classe, des informations sur les champs, des méthodes, des interfaces et d'autres informations, et il y a aussi un pool de constantes. Il s'agit du pool de constantes du fichier de classe.

Quel est le pool de constantes de fichiers de classe principalement utilisé pour stocker ?

stocke divers littéraux et références de symboles générés par la compilation. En informatique, un littéral est une notation utilisée pour exprimer une valeur fixe dans le code source ; une référence symbolique est un ensemble de symboles utilisés pour décrire la cible référencée, qui peut être n'importe quelle forme de littéral, à condition qu'il puisse être utilisé sans ambiguïté. Localisez simplement la cible.

Le pool de constantes existe sous la forme d'un tableau (le tableau est utilisé pour stocker des valeurs de chaîne, pas des références de symboles). Il peut en fait être divisé en deux types, l'un est le pool de constantes statiques et l'autre. le pool de constantes d'exécution. Il y a 11 tables de constantes dans le pool de constantes. Chaque constante du pool de constantes représente une table.

Tableau constant

常量表类型 标志值 描述
CONSTANT_Utf8 1 UTF-8编码的Unicode字符串
CONSTANT_Integer 3 int类型的字面值
CONSTANT_Float 4 float类型的字面值
CONSTANT_Long 5 long类型的字面值
CONSTANT_Double 6 double类型的字面值
CONSTANT_Class 7 对一个类或者是接口的符号引用
CONSTANT_String 8 String类型的字面值的引用
CONSTANT_Fieldref 9 对一个字段的符号
CONSTANT_Methodref 10 对一个类中方法的符号应用
CONSTANT_InterfaceMethodref 11 对一个接口中方法的符号引用
CONSTANT_NameAndType 12 对一个字段或方法的部分符号引用

Piscine constante

Integer integer1 = 127;
Integer integer2 = 127;
System.out.println(integer1 == integer2);
// true
Integer integer1 = 128;
Integer integer2 = 128;
System.out.println(integer1 == integer2);
// false

En Java, le symbole "==" est utilisé pour comparer les adresses, et le symbole "égal" est le même que le symbole "==" par défaut, les deux qui sont utilisés pour comparer les adresses.

String string1 = "dashu";
String string2 = "dashu";
System.out.println(string1==string2);
// true
String string1 = "dashu";
String string3 = new String("dashu");
System.out.println(string1 == string3);
// false

String str = new String("dashu"); Combien d'objets sont créés ?
La réponse est : 2 ou 1.

Dans new String("dashu");, si la valeur littérale "dashu" apparaît déjà dans le pool de constantes, alors un seul objet sera créé, sinon, deux objets seront créés.

Principe : Lorsque le littéral "dashu" apparaît, le système recherchera dans le pool de constantes de chaîne pour voir si la même chaîne existe. Si c'est le cas, il ne créera pas de nouvel objet, sinon il utilisera le littéral. La valeur "dashu" crée un objet String. Et new String("dashu"), avec le mot-clé new, signifie qu'il créera définitivement un nouvel objet, puis appellera le constructeur qui reçoit le paramètre String pour l'initialisation.

S'il est remplacé par string1 == string3.intern(), le résultat sera vrai, car l'adresse de la valeur littérale dans le pool constant est renvoyée.

pile : la pile de threads et la pile de méthodes locales

// 源码
public class Object{
 private static native void registerNatives();
 static{
  registerNatives();
 }
}
// 源码
public boolean equals(Object obj){
 return (this == obj);
}
// 源码
public String toString(){
 return getClass().getName() + "@" + Integer.toHexString(hasCode());
}
// 源码
protected native Object clone() throws CloneNotSupportedException;

modifiées avec le modificateur native sont appelées via JNI pour appeler le langage c ou l'exécution c++.

Toutes les classes sont des sous-classes de Object.

万物皆对象
// 源码注解
Class {@code Object} is the root of the  class hierarchy.
Every class has {@code Object} as a superclass.
All objects, including arrays, implements the methods of this class.
@ see java.lang Class
@ since JDK1.0

Pool de constantes :
Toutes les constantes sont stockées dans le fichier de classe
En Java, on dit que le pool de constantes peut être divisé en deux formes, le pool de constantes statiques et le pool de constantes d'exécution .

Le pool de constantes statiques est le pool de constantes dans le fichier de classe. Il contient des littéraux de chaîne, des informations de classe, des informations de méthode, etc. Il occupe une grande partie de l'espace du fichier de classe. les littéraux et les références aux symboles.

Le pool de constantes d'exécution est le fonctionnement de la machine virtuelle Java après avoir terminé le chargement de la classe. Il charge le pool de constantes dans le fichier de classe dans la mémoire et s'assure qu'il se trouve dans la zone de méthode. L'appel se trouve dans la zone de méthode. Pool de constantes en cours d'exécution, le pool de constantes en cours d'exécution est dynamique et de nouvelles constantes peuvent être générées et placées dans le pool pendant l'exécution, ce qui est le code écrit ci-dessus. Les constantes n'ont pas besoin d'être générées lors de la compilation, de nouvelles sorties peuvent également être générées pendant l'exécution et placées dans le pool.

L'analyse suivante :

Lorsque la machine virtuelle Java jvm exécute une certaine classe, elle doit parcourir la classe depuis le chargement en mémoire jusqu'au déchargement.

L'ensemble du processus comprend le chargement, la vérification, la préparation, l'analyse, l'initialisation, l'utilisation et la désinstallation.

Chargez,

vérifiez si la version du fichier de classe est compatible avec la version actuelle de la machine virtuelle Java, puis le fichier de classe doit répondre aux spécifications de la machine virtuelle.

Préparation, que faut-il préparer ?
Il est nécessaire d'initialiser les membres de la classe à leurs valeurs initiales, sauf pour les variables de classe modifiées par final. Les variables finales sont directement initialisées aux valeurs des variables, alors que les membres de la classe sont différents.

L'analyse, qu'est-ce que l'analyse ?
Il s'agit d'analyser la référence du symbole en une référence directe, qui est notre variable xxx. Cette représentation devient une référence directe. Qu'est-ce qu'une référence directe ? Il s'agit de l'adresse mémoire, telle que notre commune xxx0203r0e.

Initialisation, les variables statiques modifiées ou blocs de code statiques statiques sont composés de constructeurs afin d'initialiser les variables.

Utiliser,

Désinstaller

Lorsque la classe est chargée dans la mémoire, la JVM stockera le contenu du pool de constantes de classe dans le pool de constantes d'exécution, de sorte que le temps d'exécution pool constant Chaque classe en a un.

Le pool de constantes de classe stocke les références aux littéraux et aux symboles. C'est la valeur de référence symbolique de l'objet. Après analyse, la référence symbolique est analysée en une référence directe. Pendant la phase de compilation, la référence symbolique de l'objet. la constante est stockée. Après analyse, c'est une citation directe. Assurez-vous ensuite que chaque JVM n'a qu'une seule copie dans le pool de constantes globales, qui stocke la valeur de référence directe de la constante de chaîne.

S'il est remplacé par `string1 == string3.intern()`, le résultat sera vrai, car l'adresse de la valeur littérale dans le pool constant est renvoyée.

La méthode intern() de la classe String recherchera dans le pool de constantes s'il existe une chaîne égale égal().

String string1 = "dashu";
String string3 =  new String("dashu");
System.out.println(string1==string3.intern());

S'il n'y a pas de littéral “dashu” dans le pool de constantes, alors la valeur littérale “dashu” est d'abord mise dans la table constante, puis l'adresse de la table constante est renvoyée.

Avantages du pool constant

Le pool constant peut éviter la création et la destruction fréquentes d'objets, ce qui entraîne une diminution des performances du système, et réalise également le partage d'objets, ce qui peut économiser espace mémoire et durée d'exécution.

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:
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