188 votes

En passant une chaîne de référence en Java ?

Je suis habitué à faire ce qui suit dans C:

sortie :

 foo 

Cependant, en Java, cela ne semble pas au travail ; Je suppose que parce que la chaîne est copiée au lieu de passé par référence. Je pensais que les chaînes étaient des objets, qui sont toujours passés par référence (façon de parler) en Java ? Que se passe-t-il ici ? Merci...

223voto

Aaron Digulla Points 143830

Vous avez trois options :

  1. Utiliser StringBuilder :
  2. Créez une classe de conteneur et passer une instance du conteneur à votre méthode :
  3. Créer un tableau :

D’un point de vue des performances, le StringBuilder est généralement la meilleure option.

98voto

zedoo Points 2386

non, un vieux malentendu. En Java, rien n’est passé par référence. Tout est passé par valeur. Références d’objet sont passés par valeur. En outre, les chaînes sont immuables. Ainsi lorsque vous ajoutez à la chaîne passée vous obtenez juste une nouvelle chaîne. Vous pourriez utiliser une valeur de retour, ou passer un StringBuffer à la place.

56voto

Ed S. Points 70246

Ce qui se passe, c'est que la référence est passée par valeur, c'est à dire, une copie de la référence est passée. Rien en java est passé par référence, et depuis une chaîne de caractères est immuable, que la cession crée un nouvel objet string que la copie de la référence ici. La référence d'origine encore des points à la chaîne vide.

Ce serait la même pour tout objet, c'est à dire, le mettre en une nouvelle valeur dans une méthode. L'exemple ci-dessous fait juste ce qui se passe de plus en plus évidents, mais de la concaténation d'une chaîne de caractères est vraiment la même chose.

void foo( object o )
{
    o = new Object( );  // original reference still points to old value on the heap
}

18voto

Ryan Fernandes Points 3938

java.lang.String est immuable.

Je déteste les coller URL, mais http://java.sun.com/javase/6/docs/api/java/lang/String.html est essentiel pour vous de lire et de comprendre si vous êtes dans le java-land

8voto

janetsmith Points 1584

les objets sont passés par référence, les primitives sont passés par valeur.

La chaîne n'est pas un primitif, c'est un objet, et c'est un cas particulier de l'objet.

C'est pour l'économie de mémoire but. Dans la JVM, il y a une chaîne de la piscine. Pour chaque chaîne créée, JVM va essayer de voir si la même chaîne existent dans la chaîne de la piscine, et le point à elle si il y avait déjà un.

public class TestString
{
    private static String a = "hello world";
    private static String b = "hello world";
    private static String c = "hello " + "world";
    private static String d = new String("hello world");

    private static Object o1 = new Object();
    private static Object o2 = new Object();
    /**
     * @param args
     */
    public static void main(String[] args)
    {
    	// TODO Auto-generated method stub


    	System.out.println("a==b:"+(a == b));
    	System.out.println("a==c:"+(a == c));

    	System.out.println("a==d:"+(a == d));
    	System.out.println("a.equals(d):"+(a.equals(d)));



    	System.out.println("o1==o2:"+(o1 == o2));

    	passString(a);
    	passString(d);

    }

    public static void passString(String s)
    {
    	System.out.println("passString:"+(a == s));
    }

}

a==b:true
a==c:true
a==d:false
a.equals(d):true
o1==o2:false
passString:true
passString:false

l' == est la vérification de l'adresse de mémoire (de référence), et l' .est égale à la vérification du contenu (valeur)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X