Maison  >  Article  >  Java  >  Pourquoi est-il nécessaire d'utiliser « new » lors de la création d'un objet « CaseInsensitiveString » mais pas d'un objet « String » ?

Pourquoi est-il nécessaire d'utiliser « new » lors de la création d'un objet « CaseInsensitiveString » mais pas d'un objet « String » ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-13 08:23:02763parcourir

Why is it necessary to use `new` when creating a `CaseInsensitiveString` object but not a `String` object?

Création de chaînes en Java : le cas de "String s = new String("silly")"

Lors de la création de chaînes en Java, il est crucial de comprendre le comportement de la classe String. Contrairement à de nombreuses autres classes Java, les littéraux String créent automatiquement des objets String sans avoir besoin du mot-clé new. Cependant, la création d'un nouvel objet String à l'aide de l'opérateur new est explicitement déconseillée, car cela peut entraîner une consommation inutile de mémoire.

Pour illustrer cela, considérons le code suivant :

String s = "No longer silly";

Dans ce Dans ce cas, le littéral "Plus idiot" est directement affecté à la variable s, ce qui entraîne la création d'un seul objet String. Cependant, l'extrait de code suivant :

String s = new String("silly");

crée un objet String supplémentaire inutile. Pour éviter cela, il est recommandé d'utiliser l'affectation littérale autant que possible, comme le montre le premier exemple.

Cependant, il peut y avoir des situations où il est nécessaire de créer des objets String de manière dynamique. Par exemple, considérons la classe suivante :

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

Dans ce scénario :

  1. Pourquoi la première instruction est-elle correcte ? Ne devrait-il pas s'agir de CaseInsensitiveString cis = "Polish";?
    La première instruction, CaseInsensitiveString cis = new CaseInsensitiveString("Polish");, est correcte. Bien qu'il soit généralement recommandé d'utiliser une affectation littérale pour les objets String, cette règle ne s'applique pas aux objets d'autres classes, telles que CaseInsensitiveString. Dans ce cas, le mot-clé new est nécessaire pour créer une nouvelle instance de la classe CaseInsensitiveString.
  2. Comment faire en sorte que CaseInsensitiveString se comporte comme String pour que l'instruction ci-dessus soit OK (avec et sans extension String) ? Qu'est-ce qui fait que String permet de simplement pouvoir lui transmettre un littéral comme celui-là ? D'après ma compréhension, il n'y a pas de concept de « constructeur de copie » en Java ?
    La classe String en Java a un comportement unique par rapport aux autres classes. Plus précisément, les littéraux sont implicitement convertis en objets String, éliminant ainsi le besoin d'une construction explicite. Cela autorise des instructions telles que String s = "Polish"; sans appeler le nouvel opérateur. Il n’existe pas de concept équivalent de « constructeur de copie » en Java. Au lieu de cela, la classe String fournit l'immuabilité et un constructeur prédéfini qui accepte une séquence de caractères, telle qu'une chaîne littérale, pour créer un nouvel objet String.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn