2012-06-25 4 views
8

Est-ce que l'implémentation du pool de mémoire String de Java suit le modèle flyweight? Pourquoi j'ai ce doute, je vois qu'il n'y a pas d'état extrinsèque impliqué dans Intern. Dans GoF, j'ai lu qu'il devrait y avoir un bon équilibre entre l'état intrinsèque et extrinsèque. Mais en interne tout est intrinsèque. Ou devons-nous dire qu'il n'y a pas de règle stricte en ce qui concerne les attributs et juste partager des objets pour réduire la mémoire est suffisant pour l'appeler un poids mouche.Est-ce que Java's String Intern est un poids mouche?

S'il vous plaît aidez-moi à comprendre.

Répondre

2

Indépendamment de l'internalisation, Java String utilise le modèle de poids mouche en partageant le char[] entre une chaîne et ceux dérivés de celle-ci via substring et des appels de méthodes similaires. Cela a un revers, cependant: si vous prenez une petite sous-chaîne d'une énorme chaîne, l'énorme char[] ne sera pas éligible pour la récupération de place.

Note: de la version 1.7.0_06 OpenJDK est le dessus devenu obsolète: le code a été modifié de sorte que le non char[] est plus partagé entre les instances. substring() crée un nouveau tableau.

+0

maintien de l'état intrinsèque dans un objet mouche et transmission d'informations d'état extrinsèque - devons-nous nous en préoccuper? Parce que dans le livre GoF, je vois plus d'importance attachée à la séparation intrinsèque/extrinsèque. Ici, en char [] flyweight, qu'est-ce qui est intrinsèque et extrinsèque? –

+0

C'est simple - 'char []' est entièrement intrinsèque, et la chaîne que l'objet représente est entièrement extrinsèque. En utilisant une chaîne, vous ne savez même pas que le 'char []' existe. –

+0

L'implémentation de HotSpot change finalement pour utiliser une longueur précise 'char []' (ou vraisemblablement 'byte []') sans champs de décalage et de longueur. Vraiment avoir le 'char []' comme une allocation distincte devrait être éliminé aussi bien. –

4

Oui la mise en œuvre String.intern() suit le modèle de poids mouche.

Comme le dit javadoc

Renvoie une représentation canonique pour l'objet chaîne. Un groupe de chaînes , initialement vide, est maintenu en mode privé par la classe String. Lorsque la méthode interne est appelée, si le pool contient déjà une chaîne égale à cet objet String comme déterminé par la méthode equals (Object) , la chaîne du pool est renvoyée. Sinon, cet objet String est ajouté au pool et une référence à cet objet String est renvoyée.

Il s'ensuit que pour deux chaînes s et t, s.intern() == t.intern() est vrai si et seulement si les mêmes (t) sont vrais.

Toutes les chaînes littérales et expressions de constante de type chaîne sont internées. Les chaînes littérales sont définies dans §3.10.5 du langage Java Spécification

Les cordes intériorisés résident dans l'espace « Perm Gen » et sur les objets chaîne récuperés .intern() vous pouvez utiliser l'opérateur == parce que .intern() retourne toujours la même objet pour des valeurs égales.

Rappelez-vous ensuite que la méthode .intern() ne produit pas de fuites, car la JVM est aujourd'hui capable d'éliminer le pool. Essayez également de lire ceci article.

+0

Mais le poids mouche consiste à partager les objets internes de l'objet. Interner est juste la mise en cache des objets entiers. Je ne vois pas d'ajustement ici. –

+0

Ma question, "est le partage pour sauver la mémoire seule qualifie pour l'appeler mouche poids?" indépendamment des détails de mise en œuvre comme les états extrinsèques/intrinsèques .. –

+0

Peut-être que ce que je lis est faux, mais sur Wikipedia aussi l'échantillon retourne et cache l'ensemble de l'objet ([Flyweight pattern] (http://en.wikipedia.org/wiki/Flyweight_pattern)). Peut-être que quelqu'un d'autre peut clarifier le modèle. – dash1e

-1

Poids mouche est sur le partage de l'objet immmutables internes. Interner est juste la mise en cache des objets entiers.

+0

Depuis les chaînes sont immuables, je ne comprends pas votre point – Mishax

0

Vous avez correctement identifié que Interning et Flyweight sont basés sur la même idée: la mise en cache et le partage d'un état commun. Avec un poids mouche, dans le cas extrême où il n'y a pas d'état intrinsèque à stocker, il n'y a pas besoin d'exister. Seul le pointeur vers l'état extrinsèque reste, puis Flyweight est devenu Interning.

Si interner "vraiment" est ou n'est pas une sorte de poids mouche est juste un débat sur les définitions. Ce qui importe le plus, c'est de comprendre comment on peut être considéré comme un exemple spécialisé de l'autre, alors vous êtes bon.

0

Tout comme d'autres l'ont indiqué, String.intern() concerne uniquement la mise en cache. Il renvoie la référence à la chaîne de caractères déjà stockée dans le pool. De cette façon, il est similaire au modèle flyweight, car il utilise les objets existants, ce qui réduit la consommation de mémoire et augmente les performances (bien que intern ait ses propres performances de recherche dans le pool de chaînes). Par conséquent, ces deux peuvent sembler similaires, mais ils ne le sont pas réellement.

Questions connexes