Cordes de Java: “String s = new String(”idiot“);”

Je suis une C++ gars de l'apprentissage de Java. Je suis en train de lire Efficace Java et quelque chose me troublait. Il est dit de ne jamais écrire le code comme ceci:

String s = new String("silly");

Parce qu'il crée inutile String objets. Mais au lieu de cela, il devrait être écrit comme ceci:

String s = "No longer silly";

Ok bien loin...Cependant, compte tenu de cette classe:

public final class CaseInsensitiveString {
    private String s;
    public CaseInsensitiveString(String s) {
        if (s == null) {
            throw new NullPointerException();
        }
        this.s = s;
    }
    :
    :
}

CaseInsensitiveString cis = new CaseInsensitiveString("Polish");
String s = "polish";
  1. Pourquoi est la première instruction ok? Ne devrait-elle pas être

    CaseInsensitiveString cis = "Polish";

  2. Comment puis-je faire CaseInsensitiveString se comportent comme des String de sorte que la déclaration ci-dessus est OK (avec et sans l'extension String)? Quel est-il de Chaîne de fait, il est OK pour simplement être en mesure de passer un littéral comme ça? De ma compréhension, il n'existe pas de constructeur de copie" concept en Java?

  • String str1 = "foo"; String ch2 = "foo"; les Deux str1 et str2 appartient à tha même objet String, "foo", b'coz pour Java gère les Chaînes dans StringPool, est donc une nouvelle variable se réfère à la même Chaîne, il n'est pas en créer un autre plutôt attribuer la même alerady présents dans StringPool. Mais lorsque nous faisons cela: String str1 = new String("toto"); String str2 = new String("toto"); Ici, les deux str1 et str2 appartient à différents Objets, b'coz new String() de force de créer un nouvel Objet de type String.
InformationsquelleAutor JavaNewbie | 2008-12-02