Répondez à une :
L'une des questions d'entretien Java les plus populaires est la suivante : qu'est-ce qu'un objet immuable (objet immuable), quels sont les avantages des objets immuables et dans quelles circonstances doit-il être utilisé ou, plus précisément, pourquoi la classe String de Java devrait-elle être définie sur un ? type immuable ?
Les objets immuables, comme leur nom l'indique, sont des objets qui ne peuvent pas être modifiés après leur création. Un exemple typique est la classe String en Java.
Copiez le code comme suit :
Chaîne s = "ABC" ;
s.toLowerCase();
Comme ci-dessus, s.toLowerCase() ne modifie pas la valeur de "ABC", mais crée une nouvelle classe String "abc", puis pointe la nouvelle instance vers la variable s.
Les objets immuables présentent de nombreux avantages par rapport aux objets mutables :
1) Les objets immuables peuvent améliorer l’efficacité et la sécurité de String Pool. Si vous savez qu'un objet est immuable, alors lorsque vous devez copier le contenu de l'objet, vous n'avez pas besoin de le copier lui-même mais simplement son adresse. La copie de l'adresse (généralement la taille d'un pointeur) nécessite très peu de mémoire. et est très efficace. Cela n'affectera pas les autres variables faisant référence à cet "ABC" en même temps.
2) Les objets immuables sont sans danger pour les multi-threads, car lorsque plusieurs threads s'exécutent en même temps, la valeur d'un objet mutable est susceptible d'être modifiée par d'autres processus, ce qui entraînera des résultats imprévisibles, et l'utilisation d'objets immuables est ceci. la situation peut être évitée.
Bien sûr, il existe d'autres raisons, mais la principale raison pour laquelle Java définit String comme immuable est l'efficacité et la sécurité.
Réponse deux :
Il s'agit d'une question ancienne mais toujours populaire. La conception d'une chaîne immuable en Java est le résultat de la prise en compte de divers facteurs. Pour comprendre ce problème, vous devez intégrer des considérations structurelles et de sécurité dans ce qui suit. , je vais faire un résumé de diverses raisons.
1. Nécessité d'un pool constant de chaînes
Le pool constant de chaînes (pool de chaînes, pool interne de chaînes, pool de rétention de chaînes) est une zone de stockage spéciale dans la mémoire tas Java. Lors de la création d'un objet String, si la valeur de chaîne existe déjà dans le pool de constantes, elle ne sera pas créée. objet, mais une référence à un objet existant.
Comme le montre le code suivant, un seul objet String réel sera créé dans la mémoire tas.
Copiez le code comme suit :
Chaîne s1 = "abcd" ;
Chaîne s2 = "abcd" ;
Le diagramme schématique est le suivant :
Si l'objet chaîne est autorisé à changer, cela entraînera diverses erreurs logiques. Par exemple, la modification d'un objet affectera un autre objet indépendant. À strictement parler, l'idée de ce pool constant est une méthode d'optimisation.
Veuillez réfléchir : si le code est le suivant, s1 et s2 pointeront-ils toujours vers le même objet String ?
Copiez le code comme suit :
Chaîne s1= "ab" + "cd" ;
Chaîne s2= "abc" + "d" ;
Cette question est peut-être contre-intuitive pour les novices, mais étant donné que les compilateurs modernes effectueront des optimisations régulières, ils pointeront tous vers le même objet dans le pool constant. Vous pouvez également utiliser des outils tels que jd-gui pour afficher le document de classe compilé.
2. Autoriser les objets String à mettre en cache HashCode
Le code de hachage des objets String en Java est fréquemment utilisé, par exemple dans des conteneurs tels que hashMap.
L'immuabilité des chaînes garantit l'unicité du code de hachage, afin qu'il puisse être mis en cache en toute confiance. Il s'agit également d'une méthode d'optimisation des performances, ce qui signifie qu'il n'est pas nécessaire de calculer un nouveau code de hachage à chaque fois. Il y a le code suivant dans la définition. de la classe String :
Copiez le code comme suit :
hachage int privé ; // utilisé pour mettre en cache HashCode
3. Sécurité
String est utilisé comme paramètre par de nombreuses classes Java (bibliothèques), telles que l'URL de l'adresse de connexion réseau, le chemin du fichier et les paramètres String requis par le mécanisme de réflexion. Si String n'est pas corrigé, cela entraînera divers risques de sécurité.
S'il y a le code suivant :
Copiez le code comme suit :
connexion booléenne (chaîne s) {
si (!isSecure(s)) {
lancer une nouvelle SecurityException();
}
// Si String peut être modifié ailleurs, divers problèmes/erreurs inattendus se produiront ici.
causeProblème(s);
}
De manière générale, les raisons pour lesquelles String est immuable incluent des considérations de conception, des problèmes d'optimisation de l'efficacité et de sécurité. En fait, c'est aussi la réponse à de nombreux « pourquoi » dans les entretiens Java.
Réponse 3 : Avantages de l’immuabilité de la classe String
String est la classe la plus couramment utilisée dans tous les langages. Nous savons qu'en Java, String est immuable et définitif. Java enregistre également un pool de chaînes au moment de l'exécution, ce qui fait de String une classe spéciale.
Avantages de l'immuabilité de la classe String
1. Le regroupement de chaînes n’est possible que lorsque les chaînes sont immuables. L'implémentation du pool de chaînes peut économiser beaucoup d'espace de mémoire au moment de l'exécution, car différentes variables de chaîne pointent vers la même chaîne dans le pool. Mais si la chaîne est variable, alors l'internement de chaîne ne sera pas possible (Note du traducteur : l'internement de chaîne signifie qu'une seule chaîne différente est enregistrée, c'est-à-dire que plusieurs chaînes identiques ne seront pas enregistrées.), car dans ce cas, si une variable change sa valeur, les valeurs des autres variables pointant vers cette valeur changeront également.
2. Si la chaîne est variable, cela entraînera de sérieux problèmes de sécurité. Par exemple, le nom d'utilisateur et le mot de passe de la base de données sont transmis sous forme de chaînes pour obtenir la connexion à la base de données, ou dans la programmation socket, le nom d'hôte et le port sont transmis sous forme de chaînes. Parce qu'une chaîne est immuable, sa valeur ne peut pas être modifiée, sinon les pirates peuvent exploiter des failles et modifier la valeur de l'objet pointé par la chaîne, provoquant ainsi une vulnérabilité de sécurité.
3. Étant donné que les chaînes sont immuables, elles sont multi-thread-safe et la même instance de chaîne peut être partagée par plusieurs threads. Cela élimine le besoin d'utiliser la synchronisation en raison de problèmes de sécurité des threads. Les chaînes elles-mêmes sont thread-safe.
4. Les chargeurs de classes utilisent des chaînes et l'immuabilité assure la sécurité afin que la bonne classe soit chargée. Par exemple, si vous souhaitez charger la classe java.sql.Connection et que cette valeur est remplacée par myhacker.Connection, cela entraînera des dommages inconnus à votre base de données.
5. La chaîne étant immuable, le hashcode est mis en cache lors de sa création et n'a pas besoin d'être recalculé. Cela rend les chaînes très appropriées comme clés dans Maps, et les chaînes peuvent être traitées plus rapidement que les autres objets clés. C'est pourquoi les clés de HashMap utilisent souvent des chaînes.
Ce qui précède est mon résumé des avantages de l’immuabilité des chaînes.