2010-12-06 25 views
0

Selon cet article ScjpTipLine-StringsLiterally je codais quelques exemples comme:Understading un exemple de chaînes littérales Piscine

public static void main(String[] args) { 
    String literalString1 = "someString"; 
    String literalString2 = "someString"; 
    String string1 = new String("someString"); 
    System.out.println(literalString1 == literalString2); 
    System.out.println(literalString1 == string1); 
    try { 
     Field stringValue = String.class.getDeclaredField("value"); 
     stringValue.setAccessible(true); 
     char[] charValue = "someString".toCharArray(); 
     Arrays.fill(charValue, 'a'); 
     stringValue.set(literalString1, charValue); 
    } catch (Exception e) {} 

    System.out.println(literalString1); 
    System.out.println(literalString2); 
    System.out.println(string1); 
} 

Le ouput est l'attend:

true 
false 
aaaaaaaaaa 
aaaaaaaaaa 
someString 

mais si vous modifiez légèrement le code ci-dessus remplacement de la ligne

char[] charValue = "someString".toCharArray(); 

avec

char[] charValue = (char[]) stringValue.get(literalString1); 

vous

true 
false 
aaaaaaaaaa 
aaaaaaaaaa 
aaaaaaaaaa 

qui est une sortie inattendue puisque la new String ("someString"); la JVM est obligée de créer un nouvel objet String sur le tas au moment de l'exécution, plutôt que d'utiliser literalString1 et literalString2 à partir du pool littéral de chaînes.

Merci à l'avance

Répondre

1

qui est une sortie inattendue puisque la nouvelle chaîne ("someString"); la JVM est obligée de créer un nouvel objet String sur le tas à l'exécution

Il est obligatoire de créer un nouvel objet String, oui.

Toutefois, un objet String est généralement juste un en-tête avec quelques champs et un pointeur vers le tableau de sauvegarde. Et la JVM est libre de réutiliser ce tableau de sauvegarde.

Les chaînes sont censées être immuables, si vous faites des choses délicates pour essayer de violer cette immuabilité, vous n'obtenez aucune garantie quant à la façon dont elles vont se comporter.