Maison >Java >javaDidacticiel >Pourquoi 'CaseInsensitiveString cis = new CaseInsensitiveString('Polish')' est-il acceptable alors que 'String s = new String('silly')' est déconseillé pour l'optimisation de la mémoire

Pourquoi 'CaseInsensitiveString cis = new CaseInsensitiveString('Polish')' est-il acceptable alors que 'String s = new String('silly')' est déconseillé pour l'optimisation de la mémoire

DDD
DDDoriginal
2024-11-14 14:09:02373parcourir

Why is

Optimisation de la mémoire de chaînes Java : comprendre "String s = new String("silly")"

Des inquiétudes ont été soulevées concernant la recommandation de évitez d'écrire du code Java comme "String s = new String("silly")". Bien que ce conseil soit valable pour optimiser l'utilisation de la mémoire dans le cas d'objets String, il peut ne pas être applicable à d'autres classes.

Pourquoi "CaseInsensitiveString cis = new CaseInsensitiveString("Polish")" est-il acceptable ?

L'objet "cis" est une instance de la classe CaseInsensitiveString. Contrairement à String, CaseInsensitiveString est une classe définie par l'utilisateur qui nécessite qu'un constructeur crée un objet. Par conséquent, la syntaxe "CaseInsensitiveString cis = new CaseInsensitiveString("Polish")" est nécessaire pour initialiser l'objet avec la valeur de chaîne spécifiée.

Comment faire en sorte que CaseInsensitiveString se comporte comme String pour une initialisation littérale ?

Pour activer l'initialisation littérale de CaseInsensitiveString comme c'est le cas pour String, on pourrait implémenter le suivant :

  • Créez une méthode de fabrique personnalisée : Définissez une méthode statique dans la classe CaseInsensitiveString qui prend un littéral comme argument et renvoie une instance de la classe initialisée avec cette valeur. Cette méthode imiterait l'appel de constructeur implicite qui se produit pour les littéraux de chaîne.
  • Implémentez la méthode valueOf() : Remplacez la méthode valueOf() héritée de Object, qui est utilisée en interne par Java pour créer de nouvelles instances String à partir de littéraux. En fournissant une implémentation personnalisée, on pourrait créer de nouveaux objets CaseInsensitiveString directement à partir de littéraux.

Pourquoi est-il acceptable de transmettre directement un littéral à String ?

String est une classe spéciale en Java. Il dispose d'un pool prédéfini de chaînes internes, où les littéraux de chaîne en double sont stockés comme références au même objet. Cela élimine le besoin de plusieurs objets String pour la même valeur de chaîne, réduisant ainsi la consommation de mémoire.

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