Questions sur les lignes Piscine Java

Considérez ce code:


String first = "abc"; 
String second = new String/"abc"/;


Lorsque vous utilisez un mot-clé
new

Java Créer à nouveau
abc


String

, droit?
Sera-t-il stocké dans un tas ordinaire ou dans une balle
String

?
combien de
String

s Se termine dans la piscine
String

?
Invité:

Agathe

Confirmation de:

Si vous utilisez un mot-clé
new

, Un nouvel objet sera créé.
String

. Veuillez noter que les objets sont toujours dans une pile. - Les rangées de la piscine ne sont pas une zone de mémoire séparée, qui est séparée d'un tas.

Les lignes de piscine ressemblent à un cache. Si vous le faites:


String s = "abc";
String p = "abc";


Puis le compilateur Java assez intelligent pour créer un seul objet
String

, et
s

et
p

se référera à l'objet de la même chaîne. Si vous le faites:


String s = new String/"abc"/;


Ensuite, il y aura un objet dans la piscine
String

, littéral
"abc"

, et il y aura un objet séparé
String

, Pas dans la piscine, qui contient une copie du contenu de l'objet combiné. Dans la mesure où
String

Inchangé B. Java, Vous n'obtenez rien, le faire; appeler
new String/"literal"/

n'a jamais de sens dans Java Et inefficace inutile.

Notez que vous pouvez appeler
intern//

Pour l'objet
String

. Cela placera l'objet
String

Dans la piscine, si cela n'existe pas, et retournera le lien vers la chaîne United. /S'il était déjà dans la piscine, il renvoie juste une référence à l'objet qui était déjà là/. Pour plus d'informations, voir la documentation API Pour cette méthode.

voir également
http://en.wikipedia.org/wiki/String_interning
/Wikipédia/.

Giselle

Confirmation de:

DANS

octet

-Code première tâche est:

Code:
0: ldc #2; //String abc
2: astore_1
Alors que la seconde:

3: new #3; //class java/lang/String
6: dup
7: ldc #2; //String abc
9: invokespecial #4; //Method java/lang/String."":/Ljava/lang/String;/V
Ainsi, le premier est dans la piscine /en position #2/, Tandis que la seconde sera stockée dans un tas.

EDIT

Dans la mesure où
CONSTANT_String_info

http://docs.oracle.com/javase/ ... 4.4.3
/16 Peu, aucun signe/, la piscine peut ne plus contenir plus
2**16

=
65535

Liens. Dans le cas où vous êtes inquiet
http://docs.oracle.com/javase/ ... -4.11
.

Catherine

Confirmation de:

Chaque fois que votre code crée un littéral à chaîne

par exemple:


String str="Hello"; /string literal/


dans JVM Vérifie d'abord le bassin littéral à chaîne. Si la chaîne existe déjà dans la piscine, le lien vers l'instance de pool est renvoyé. Si la ligne n'existe pas dans la piscine, un nouvel objet est créé. String, Puis placé dans la piscine. Java peut faire cette optimisation, car les cordes sont immuables et peuvent être divisées sans crainte des dommages causés par les données

Dominique

Confirmation de:

String strObject = new String/"Java"/;


et


String strLiteral = "Java";


Les deux expressions vous donnent un objet de chaîne, mais il y a une différence subtile entre eux. Lorsque vous créez un objet de chaîne à l'aide de l'opérateur new//, Il crée toujours un nouvel objet dans un tas de mémoire. D'autre part, si vous créez un objet en utilisant une syntaxe littérale à chaîne, par exemple "Java", Il peut retourner l'objet existant de la piscine de chaînes. /Cache d'un objet de chaîne dans l'espace Perm gen, qui est maintenant déplacé dans le tas d'espace dans une version récente Java/, Si cela existe déjà.

Blanche

Confirmation de:

La seule fois où vous devez utiliser une nouvelle chaîne /foo/, - C'est quand tu veux écraser ==, Quel est un cas étrange, ou quand foo - Ceci est une ligne de substration beaucoup plus grande qui a une durée de vie limitée, par exemple


String mystring;
{
String source = getSomeHeinouslyLargeString//;
mystring = new String/source.substring/1,3//;
}

Hannah

Confirmation de:

String first = "abc"; 
String second = new String/"abc"/;


Dans le premier cas, un seul objet sera créé dans le pool.
Dans le second cas, deux objets en créeront un dans la piscine /S'il n'existait pas avant dans la piscine/ Et un dans une pile.

Lorsque vous passez une valeur de citations double ex: "abc", Vous créez un objet dans la piscine et transmettez-le à une conception de chaîne pour créer un nouvel objet avec la même valeur dans une pile.

Si vous avez vu un designer à cordes, vous pouvez voir qu'il faut une chaîne. Quelle est la chaîne? Avant de créer ce qui est cet objet de chaîne. Ce n'est rien de plus qu'un objet stocké dans la piscine de constantes de cordes.

Babette

Confirmation de:

Bien que tard, mais cela peut être utile à quelqu'un d'autre trébucher dessus:


String first = "abc";
//One instance object in pool created. Instance variable “first” refers/points to pooled object

String second = new String/"abc"/;
//One instance object in heap created. Object in pool creation step will be skipped on account of first statement.


Ainsi, tout sera créé 2 Un objet de l'instance. Un dans la piscine et l'autre dans un tas

Explication détaillée

Première ligne = "abc";

Voici un objet de chaîne avec le contenu "abc" Créé dans la piscine. Copie variable “first” indiquera l'objet de la piscine avec du contenu “abc”.

String second = nouvelle ligne /"abc"/;

Ici, dans une pile, un autre objet de chaîne sera créé avec du contenu. "abc". Copie variable “second” indiquera un objet de tas avec du contenu “abc”. Objet de chaîne avec création content "abc" Dans la piscine, vous manquerez à cause du 1er opérateur. La raison est ci-dessous.

Causes

Si le prétendu opérateur précédent /String first = "abc";/ n'existe pas avec le même contenu, alors généralement avec un mot clé “new” sera créé 2 Objet de chaîne: un dans un tas /Piscine extérieure/, et l'autre dans la piscine/La zone de sous-ensemble du tas/.
De plus, l'instance de variable "second" Doit indiquer qu'un seul objet de tas, que des objets soient dans la piscine ou non.

Maintenant à cause de la présence de l'opérateur précédent /String first = "abc";/ Avec le même contenu que dans la nouvelle ligne/"abc"/, Un seul objet est enregistré dans la piscine. /avec le contenu "abc"/.
Ainsi, à cause du 1er opérateur du deuxième opérateur, ne sera créé que 1 Objet à la place 2, Et cet objet est dans une pile. La création d'un objet de pool sera ignorée.


//Additional Test on the concept
System.out.println/first==second/; //returns false. Because first points to pool object while second points to heap object. And both objects are different /on account of different memory locations/.

second = second.intern//; //After interning, second now points to pool object. Note: intern is used so that reference variable points to pool area object and not heap object. Clearly it is applicable when we use new keyword.

System.out.println/first==second/; //returns true. Because now both first and second objects now points to same pool object.

Pour répondre aux questions, connectez-vous ou registre