2011-07-19 1 views
1

Je sais que les chaînes Java sont immuables. Cependant, lorsque j'exécute la fonction ci-dessous, la sortie n'est pas ce que je m'attends à ce que ce soit.Question de l'immutabilité de la chaîne

public static void main(String[] args) { 
     String s = "wicked"; 
     String [] ss = new String [1]; 
     ss[0] = "witch"; 
     modify(s, ss); 
     System.out.println(s+" "+ ss[0]); 
    } 
    private static void modify(String s, String[] ss) { 
     s = "sad"; 
     ss[0] = "sod";   
    } 

La sortie que je reçois est wicked sod, et non wicked witch comme je m'y attendais qu'il soit. Est-ce parce que je passe une référence de tableau comme second argument de la fonction modify plutôt que de passer l'objet String lui-même? Toute clarification est très appréciée.

Répondre

10

Vous avez modifié le contenu de la matrice: les tableaux sont toujours modifiables.

Le tableau contient initialement une référence à la chaîne "sorcière". Votre méthode modify modifie le tableau pour qu'il contienne une référence à la chaîne "sod". Aucune des chaînes elles-mêmes n'a été modifiée - juste le contenu du tableau.

(Notez que la valeur de ss[0] est pas une chaîne - c'est un référence à une chaîne.)

+0

merci Jon! Cela m'amène à mon prochain qn- n'est-ce pas un objet s aussi une référence à une chaîne? alors comment s est différent de ss [0]? – OckhamsRazor

+1

@OckhamsRazor: L'attribution d'une valeur à 's' ne change que la valeur du paramètre. Assigner une valeur à 'ss [0]' change la valeur du tableau auquel 'ss' fait référence. –

+0

ah je vois- donc cela signifie que les tableaux eux-mêmes ne contiennent pas de chaînes; plutôt, le contenu des tableaux stockent des références aux chaînes? – OckhamsRazor

1

Est-ce parce que je passe une référence de tableau comme second argument à la modify fonction par opposition à passer l'objet String lui-même?

Exactement. Vous passez une référence à un objet mutable (le tableau). Lorsque la méthode modifie cet objet, les modifications seront visibles en dehors de la méthode.

0

cordes signifie être immuables que vous ne pouvez pas changer « Bonjour tout le monde » à « bonjour ». Mais vous pouvez assigner une nouvelle chaîne entière. Et c'est ce que vous faites ici.

Vous faites référence à un objet tableau. C'est pourquoi le contenu du tableau est changé.