Est une Chaîne Littérale de la Piscine d'une collection de références à l'Objet de type String, Ou une collection d'Objets
Je suis tout confus après la lecture de l'article sur javaranch site par Corey McGlone, l'auteur de La SCJP Bout de la Ligne. les Chaînes nommées, Littéralement et l'
SCJP la version 6 de Java Guide du Programmeur par Kathy Sierra (co-fondateur de javaranch) et Bert Bates.
Je vais essayer de citer ce que M. Corey et Mme Kathy Sierra avons cité à propos de la Chaîne Littérale de la Piscine.
1. Selon M. Corey McGlone :
-
Littéral de chaîne de la Piscine est une Collection de références qui pointent vers les Objets String.
-
String s = "Hello";
(Supposons qu'il n'y est Aucun objet sur le Tas nommé "Hello"),
va créer un objet de type String"Hello"
sur le tas, et placer une référence à cet objet dans la Chaîne de caractères Littérale de la Piscine (Table de Constantes) -
String a = new String("Bye");
(Supposons qu'il n'y est Aucun objet sur le Tas nommé "au Revoir",new
opérateur va obliger la JVM pour créer un objet sur le Tas.
Maintenant l'explication de "new"
opérateur pour la création d'une Chaîne de caractères et sa référence est peu à confusion, dans cet article, je suis en train de monter le code et
explication de l'article lui-même comme il est ci-dessous.
public class ImmutableStrings
{
public static void main(String[] args)
{
String one = "someString";
String two = new String("someString");
System.out.println(one.equals(two));
System.out.println(one == two);
}
}
Dans ce cas, nous finissons avec un comportement légèrement différent en raison de la clé "new."
Dans un tel cas, les références aux deux littéraux de Chaîne sont encore mis dans la table de constantes (la Chaîne de caractères Littérale de la Piscine),
mais, quand vous venez pour le mot-clé "new,"
la JVM est obligé de créer une nouvelle Chaîne de caractères de l'objet au moment de l'exécution,
plutôt que d'utiliser l'une à partir de la table de constantes.
Voici le schéma de l'expliquer..
Donc, signifie-t-il, que la Chaîne de caractères Littérale de la Piscine a aussi une référence à cet Objet ?
Voici le lien vers l'Article de Corey McGlone
http://www.javaranch.com/journal/200409/Journal200409.jsp#a1
2. Selon Kathy Sierra et Bert Bates dans la SCJP livre:
-
Pour rendre Java plus efficace en terme de mémoire, la JVM de mettre de côté une zone spéciale de la mémoire appelée la "constante de Chaîne de la piscine", lorsque le compilateur
rencontre un Littéral de Chaîne, il vérifie la piscine pour voir si une Chaîne identique existe déjà ou pas. Si non, alors il crée un
nouvelle Chaîne Littérale de l'Objet. -
String s = "abc";
//Crée un objet de type String et une variable de référence....c'est très bien, mais ensuite, j'ai été confondu par cette déclaration:
-
String s = new String("abc")
//Crée deux objets, et une variable de référence.Il est dit dans le livre qu'.... un nouvel objet String en normal(non-chauffée) de la mémoire , et le "s" se réfère à elle... alors que
supplémentaires littérale "abc" sera placé dans la piscine.Les lignes ci-dessus dans le livre d'entrer en collision avec l'une dans l'article de Corey McGlone.
-
Si la Chaîne Littérale de la Piscine est une collection de références à l'objet de type String comme mentionné par Corey McGlone, alors pourquoi wil le littéral d'objet "abc" être placé dans la piscine (comme mentionné dans le livre)?
-
Et d'où vient cette Chaîne de caractères Littérale de la Piscine résident?
-
Veuillez effacer ce doute, bien que ce ne sera pas trop pendant l'écriture d'un code, mais il est très important de l'aspect de la gestion de la mémoire, et
c'est la raison pour laquelle je veux effacer cette funda.
- La façon dont le groupe est géré pourrait à un certain degré dépend de la JVM. Tant qu'une chose n'est pas fixé par la spécification du langage, ils sont libres d'expérimenter. Donc, si la piscine est titulaire des références ou des objets pourrait bien dépendre, je crois.
- Je suis récemment tombé sur exactement la même question avec les 2 mêmes ressources que vous avez mentionné. Je pense que par l'instruction objet "abc" sera placé dans la piscine dans le livre, l'auteur fait référence à l'objet "abc" sera stocké dans la piscine. Droit? Accepté réponse est assez instructif, mais je pense que c'est ce qui est posée.
Vous devez vous connecter pour publier un commentaire.
Je pense que le principal point de comprendre ici, c'est la distinction entre
String
objet Java et de son contenu -char[]
sous privévalue
champ.String
est fondamentalement un wrapper autour dechar[]
tableau, l'encapsulation et le rendant impossible à modifier de sorte que leString
peut rester immuable. Aussi laString
classe se rappelle des parties de ce tableau est en fait utilisé (voir ci-dessous). Tout cela signifie que vous pouvez avoir deuxString
objets (assez léger) pointant vers la mêmechar[]
.Je vais vous montrer quelques exemples, avec
hashCode()
de chaqueString
ethashCode()
de l'intérieurchar[] value
champ (je vais l'appeler texte pour la distinguer de la chaîne). Enfin, je vais vous montrerjavap -c -verbose
de sortie, en collaboration avec la constante de piscine pour ma classe de test. Veuillez ne pas confondre la constante de classe à la piscine, avec chaîne de caractères littérale de la piscine. Ils ne sont pas tout à fait la même. Voir aussi La compréhension javap sortie pour la Constante de la Piscine.Conditions préalables
Dans le but de tester, j'ai créé une telle méthode utilitaire qui rompt
String
encapsulation:Il permet d'imprimer
hashCode()
dechar[] value
, effectivement nous aider à comprendre si ceString
points à la mêmechar[]
texte ou pas.Deux littéraux de chaîne dans une classe
Commençons par le plus simple exemple.
Code Java
BTW, si vous écrivez tout simplement
"ab" + "c"
, Java compilateur d'effectuer la concaténation au moment de la compilation et le code généré sera exactement la même. Cela ne fonctionne que si toutes les chaînes sont connus au moment de la compilation.Constante de classe de la piscine
Chaque classe a ses propres constante de la piscine - une liste de valeurs constantes qui peuvent être réutilisées si elles se produisent plusieurs fois dans le code source. Il comprend les chaînes de caractères, nombres, noms de méthode, etc.
Voici le contenu de la constante de la piscine dans notre exemple ci-dessus.
La chose importante à noter est la distinction entre
String
objet constant (#2
) et du texte Unicode"abc"
(#38
) que la chaîne de points de.De Byte code
Ici est généré en byte code. Notez que les deux
one
ettwo
références sont affectés à la même#2
constante pointant vers"abc"
chaîne:Sortie
Pour chaque exemple, je suis d'impression les valeurs suivantes:
Pas surprenant que les deux paires sont égaux:
Qui signifie que non seulement les deux objets de la même
char[]
(le même texte en dessous) doncequals()
test passe. Mais plus encore,one
ettwo
sont exactement les mêmes références! Doncone == two
est vrai. Évidemment, sione
ettwo
pointent vers le même objet, puisone.value
ettwo.value
doivent être égales.Littérale et
new String()
Code Java
Maintenant l'exemple que nous avons tous attendu pour un littéral de chaîne et un nouveau
String
à l'aide de la même littéral. Comment ça va marcher?Le fait que
"abc"
constante est utilisé deux fois dans le code source devrait vous donner un indice...Constante de classe de la piscine
Même que ci-dessus.
De Byte code
Regardez bien! Le premier objet est créé de la même manière que ci-dessus, pas de surprise. Il faut juste une référence constante à déjà créé
String
(#2
) à partir de la constante de la piscine. Toutefois, le deuxième objet est créé via la normale appel du constructeur. Mais! La premièreString
est passé comme argument. Cela peut être décompilé à:Sortie
La sortie est un peu surprenant. La deuxième paire, soit des références à des
String
objet est compréhensible -, nous avons créé deuxString
objets a été créé pour nous dans la constante de la piscine et le second a été créé manuellement pourtwo
. Mais pourquoi, sur terre, la première paire suggère que les deuxString
objets de la mêmechar[] value
tableau?!Il devient évident lorsque l'on regarde la façon dont
String(Chaîne de caractères)
constructeur travaille (grandement simplifiée ici):Voir? Lorsque vous créez de nouveaux
String
objet basé sur l'existant, il réutilisechar[] value
.String
s sont immuables, il n'est pas nécessaire de copier la structure de données qui est connu pour ne jamais être modifié.Je pense que c'est la moindre idée de votre problème: même si vous avez deux
String
objets, elles peuvent pointer vers le même contenu. Et comme vous pouvez le voir leString
objet lui-même est assez petite.D'exécution de la modification et de
intern()
Code Java
Disons que vous avez initialement utilisé deux chaînes de caractères, mais après quelques modifications, ils sont tous les mêmes:
Le compilateur Java (au moins la mienne) n'est pas assez intelligent pour effectuer une telle opération au moment de la compilation, un coup d'oeil:
Constante de classe de la piscine
Soudain, nous nous sommes retrouvés avec deux chaînes constantes de pointage à deux différents constant de textes:
De Byte code
La première chaîne est construite comme d'habitude. La deuxième est créé par le premier chargement de la constante
"?abc"
chaîne, puis en appelantsubstring(1)
sur elle.Sortie
Pas de surprise ici, nous avons deux cordes différentes, pointant à deux
char[]
textes en mémoire:Bien, les textes ne sont pas vraiment différents,
equals()
méthode rendement encore detrue
. Nous avons deux inutiles copies d'un même texte.Maintenant, nous devons exécuter deux exercices. Tout d'abord, essayez de lancer:
avant l'impression des codes de hachage. Non seulement les deux
one
ettwo
point sur le même texte, mais ils sont de la même référence!Cela signifie à la fois
one.equals(two)
etone == two
tests vont passer. Nous avons également sauvegardé sur la mémoire parce que"abc"
texte apparaît une seule fois dans la mémoire (le second exemplaire sera le garbage collector).Le second exercice est légèrement différente, découvrez ce:
Évidemment
one
ettwo
sont deux objets différents, pointant à deux textes différents. Mais comment se fait la sortie suggère qu'ils pointent vers la mêmechar[]
tableau?!?Je vais vous laisser la réponse. Il va vous apprendre comment
substring()
fonctionne, quels sont les avantages d'une telle approche et quand il peut conduire à de gros problèmes.