195 votes

Il est conseillé d’utiliser java.lang.String.intern() ?

La Javadoc sur String.intern() ne donne pas beaucoup de détails. (En un mot: Elle renvoie une représentation canonique de la chaîne, permettant l'internement des chaînes de comparer à l'aide d' ==)

  • Quand puis-je utiliser cette fonction en faveur d' String.equals()?
  • Des effets indésirables non mentionnés dans la Javadoc, c'est à dire plus ou moins optimisation par le compilateur JIT?
  • Existe-il d'autres usages de l' String.intern()?

195voto

Daniel Brückner Points 36242

Ce qui a (presque) rien à voir avec la comparaison de chaînes de caractères. Chaîne de stage est destinée à la sauvegarde de la mémoire si vous avez beaucoup de cordes avec le même contenu dans votre application. En utilisant String.intern() la demande n'ont qu'un seul exemple, dans le long terme et un effet secondaire est que vous pouvez exécuter rapidement la référence de comparaison d'égalité au lieu ordinaire de comparaison de chaîne (mais ce n'est généralement pas conseillé, car il est vraiment facile à casser, en oubliant de faire un stage d'une seule instance).

127voto

dfa Points 54490

Quand puis-je utiliser cette fonction en faveur de Chaîne.equals()

lorsque vous avez besoin de vitesse puisque vous pouvez comparer des chaînes par référence (== est plus rapide que d'égal à égal)

Des effets indésirables non mentionnés dans la Javadoc?

Le principal inconvénient est que vous devez vous rappeler pour vous assurer que vous faites réellement stagiaire() toutes les chaînes que vous allez comparer. Il est facile d'oublier de faire un stage() toutes les chaînes et ensuite, vous pouvez obtenir point de prêter à des résultats incorrects. Aussi, l'intérêt de tous, s'il vous plaît être sûr de très clairement le document que vous êtes en s'appuyant sur les cordes internalisé.

Le deuxième inconvénient, si vous décidez d'internaliser les chaînes, c'est que le stagiaire() la méthode est relativement cher. Il a à gérer la piscine de chaînes uniques de sorte qu'il n'juste un peu de travail (même si la chaîne a déjà été intériorisée). Alors, soyez prudent dans votre code la conception de sorte que vous, par exemple, stagiaire() toutes les chaînes d'entrée de sorte que vous n'avez pas à vous soucier plus.

(à partir de JGuru)

MODIFIER

Comme Michael Borgwardt dit: Troisième inconvénient: l'internement des Chaînes de vivre dans la PermGen space, qui est généralement assez petit, vous risquez de rencontrer un OutOfMemoryError avec beaucoup d'espace de segment de mémoire.

** EDIT ** Dans Java 7 – la chaîne de la piscine a été transféré sur le tas. Cela signifie que vous n'êtes plus limité par une zone de mémoire de taille fixe.

40voto

Gili Nachum Points 1178

``est certainement garbage collectée dans la JVM moderne.
Ce qui suit est jamais à court de mémoire, en raison de l’activité de la GC :

Pour en savoir plus (de moi) sur le mythe du non GCed String.intern().

16voto

mik1 Points 273

J'ai récemment écrit un article sur la Chaîne.stagiaire() mise en œuvre en Java 6, 7 et 8: Chaîne de caractères.stagiaire en Java 6, 7 et 8 - chaîne de mise en commun.

J'espère qu'elle doit contenir suffisamment d'informations sur la situation actuelle de la chaîne de mise en commun en Java.

En un mot:

  • Évitez String.intern() dans la version 6 de Java, car il va dans le PermGen
  • Préférez String.intern() dans Java 7 Et Java 8: il utilise 4-5x moins de mémoire que le roulement de votre propre pool d'objet
  • Assurez-vous de syntoniser -XX:StringTableSize (la valeur par défaut est probablement trop petite; fixer un nombre Premier)

14voto

aleroot Points 30853

La comparaison de chaînes avec == est beaucoup plus rapide qu'avec equals()

5 Fois plus rapide, mais depuis que la Chaîne de comparaison habituellement ne représente qu'un faible pourcentage du total des temps d'exécution d'une application, le gain global est beaucoup plus petit, et le gain final sera dilué à quelques pour cent.

Chaîne de caractères.stagiaire() tirez la chaîne à l'écart de Tas et de le mettre dans PermGen

Chaîne intériorisé sont mises dans une autre zone de stockage : Génération Permanente qui est une zone de la machine qui est réservé pour les objets non-utilisateur, telles que les Classes, les Méthodes internes et d'autres JVM objets. La taille de cette zone est limitée et est beaucoup plus précieux que le tas. Cette surface plus petite que le Tas il y a plus de probabilité d'utiliser tout l'espace et d'obtenir une OutOfMemoryException.

Chaîne de caractères.stagiaire() string sont des ordures collectées

Dans les nouvelles versions de JVM aussi intériorisé chaîne sont des ordures collectées lorsqu'il n'est pas référencé par un objet quelconque.

En gardant à l'esprit le 3 ci-dessus point que vous pouvez déduire de cette Chaîne stagiaire() pourrait être utile que dans quelques situations où vous faire beaucoup de comparaison de chaînes de caractères, mais il est préférable de ne pas utiliser internes chaîne si vous ne savez pas exactement ce que vous faites ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X