http://kohlerm.blogspot.co.uk/2009/01/is-javalangstringintern-really-evil.html
affirme que String.equals()
utilise "=="
pour comparer des String
objets avant, selon
http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html
il compare les longueurs de chaînes, puis le contenu.
(Soit dit en passant, les chaînes de code de produit dans un catalogue de vente sont susceptibles d'être toutes de la même longueur - BIC0417 est un casque de sécurité de cycliste, TIG0003 est un tigre mâle adulte vivant - vous avez probablement besoin de toutes sortes de licences pour en commander un. Et il vaut peut-être mieux commander un casque de sécurité en même temps.)
Il semble donc que vous ayez un avantage à remplacer vos cordes par leur intern()
version, mais vous obtenez la sécurité - et la lisibilité et la conformité standard - -sans- en utilisant "==" pour equals()
dans votre programmation. Et la plupart de ce que je vais dire dépend de ce qui est vrai, si c'est vrai.
Mais String.equals()
teste-t-on que vous lui avez passé une chaîne et non un autre objet, avant de l'utiliser "=="
? Je ne suis pas qualifié pour le dire, mais je suppose que non, car la plupart des equals()
opérations de ce type seront de chaîne en chaîne, de sorte que le test est presque toujours réussi. En effet, prioriser "==" à l'intérieur String.equals()
implique une confiance que vous comparez fréquemment la chaîne au même objet réel.
J'espère que personne n'est surpris que les lignes suivantes produisent un résultat "faux":
Integer i = 1;
System.out.println("1".equals(i));
Mais si vous passez i
à i.toString()
la deuxième ligne, c'est sûr true
.
Les lieux où vous pourriez espérer bénéficier d'un stage incluent Set
et Map
, évidemment. J'espère que les chaînes internes ont leurs codes de hachage mis en cache ... Je pense que ce serait une exigence. Et j'espère que je n'ai pas simplement donné une idée qui pourrait me rapporter un million de dollars. :-)
En ce qui concerne la mémoire, il est également évident que c'est une limite importante si votre volume de chaînes est important, ou si vous voulez que la mémoire utilisée par votre code de programme soit très petite. Si votre volume de chaînes -distinct- est très important, il peut être temps d'envisager d'utiliser un code de programme de base de données dédié pour les gérer, et un serveur de base de données distinct. De même, si vous pouvez améliorer un petit programme (qui doit s'exécuter dans 10000 instances simultanément) en ne lui stockant pas du tout ses chaînes.
Il semble inutile de créer une nouvelle chaîne, puis de la jeter immédiatement pour son intern()
substitut, mais il n'y a pas d'alternative claire, sauf pour conserver la chaîne en double. Donc, vraiment, le coût d'exécution consiste à rechercher votre chaîne dans le pool interne puis à permettre au garbage collector de se débarrasser de l'original. Et si c'est un littéral de chaîne, il est déjà interné de toute façon.
Je me demande si intern()
un code de programme malveillant peut abuser pour détecter si certaines chaînes et leurs références d'objet existent déjà dans le intern()
pool, et donc existent ailleurs dans la session Java, alors que cela ne devrait pas être connu. Mais cela ne serait possible que lorsque le code du programme est déjà utilisé de manière fiable, je suppose. Pourtant, c'est quelque chose à considérer sur les bibliothèques tierces que vous incluez dans votre programme pour stocker et mémoriser vos numéros PIN ATM!