2013-09-23 7 views
-2

Java Question: Suppose que str est une variable String. L'instruction str = new String ("Hello World"); est équivalent à ?Supposons que str est une variable String. L'instruction str = new String ("Hello World"); est équivalent à?

Voici mes choix ...

a.

new String = "Hello World"; 

c.

str = "Hello World"; 

b.

String new = "Hello World"; 

d.

"Hello World"; 
+0

[link1] (http://stackoverflow.com/questions/6191086/whats-the-difference-between-string-and-new-string) - [lien2] (http://stackoverflow.com/questions/ 6952581/quoi-est-la-différence-entre-chaînes-allouées-en-utilisant-nouveau-opérateur-sans-ne) – Husam

+0

Est équivalent à créer intentionnellement 2 chaînes .. "Hello World" s'il n'existe pas dans la "piscine" "et une nouvelle allocation avec la même valeur. – nachokk

+0

@nachokk Le littéral * existe * dans le pool: il est placé là par le compilateur. – EJP

Répondre

6

Il est équivalent à déclarer et initialiser à la fois:

String str = new String("Hello World"); 

Vous n'avez pas besoin de faire new String("...") bien. Vous avez déjà un littéral String. Vous pouvez juste faire:

String str = "Hello World"; 

Sinon, vous prenez le premier, objet String canonique ("Hello World") et en utilisant inutilement pour initialiser un second objet (new String(...)) avec le même texte.

Edit: Selon les choix que vous avez posté maintenant, ce n'est pas exactement équivalent àtoute d'entre eux. Comme expliqué plus en détail par les autres réponses, "Hello World" a une différence subtile (pourtant importante) à new String("Hello World"), donc ce n'est pas exactement équivalent à str = "Hello World". D'un autre côté, les trois autres options ne compilent pas du tout, ce qui est certainement la réponse voulue.

2

Beaucoup de réponses ont raison sur l'internalisation. Prenez ce programme:

public static void main(String[] args) { 
    String str1 = "Hello"; 
    String str2 = "Hello"; 
    String str3 = new String("Hello"); 
    String str4 = "He"; 
    System.out.println(str1 == str2); // true 

    System.out.println(str1 == str3); // false 

    System.out.println(str1 == str3.intern()); // true 

    str4 = str4.concat("llo"); 
    System.out.println(str1 == str4.intern()); // true 

} 

Les questions intéressantes sont le point 2 et 3. new crée toujours un nouvel objet (comme par JLS 12.5), si str1 != str3. Qu'est-ce qui se passe avec l'internalisation est que le nouvel objet pointe vers l'internalisé, que vous pouvez récupérer avec String.intern(). De même, un autre String créé sous une forme complètement indépendante des littéraux d'origine (str4) est également "interné".

+0

Encore plus de réponses se sont trompés, pour une raison quelconque: - | – EJP

Questions connexes