http://kohlerm.blogspot.co.uk/2009/01/is-javalangstringintern-really-evil.html
afirma que String.equals()
utiliza "=="
para comparar String
objetos antes, de acuerdo con
http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html
compara las longitudes de cadenas y luego el contenido.
(Por cierto, las cadenas de códigos de productos en un catálogo de ventas pueden tener la misma longitud: BIC0417 es un casco de seguridad para ciclistas, TIG0003 es un tigre macho adulto vivo; probablemente necesite todo tipo de licencias para pedir uno de esos. Y tal vez sea mejor que pidas un casco de seguridad al mismo tiempo).
Por lo tanto, parece que obtiene un beneficio al reemplazar sus cadenas por su intern()
versión, pero obtiene seguridad, legibilidad y cumplimiento estándar, sin usar "==" equals()
en su programación. Y la mayor parte de lo que voy a decir depende de que eso sea cierto, si es cierto.
¿Pero String.equals()
prueba que le pasó una cadena y no algún otro objeto antes de usar "=="
? No estoy calificado para decirlo, pero supongo que no, porque abrumadoramente la mayoría de estas equals()
operaciones serán de cadena a cadena, por lo que la prueba casi siempre se pasa. De hecho, priorizar "==" en el interior String.equals()
implica la confianza de que con frecuencia está comparando la Cadena con el mismo objeto real.
Espero que nadie se sorprenda de que las siguientes líneas produzcan un resultado de "falso":
Integer i = 1;
System.out.println("1".equals(i));
Pero si cambias i
a i.toString()
en la segunda línea, por supuesto que sí true
.
Los lugares donde podría esperar un beneficio de la pasantía incluyen Set
y Map
, obviamente. Espero que las cadenas internas tengan sus códigos hash en caché ... Creo que eso sería un requisito. Y espero no haber regalado una idea que podría ganarme un millón de dólares. :-)
En cuanto a la memoria, también es obvio que ese es un límite importante si su volumen de cadenas es grande, o si desea que la memoria utilizada por el código de su programa sea muy pequeña. Si su volumen de cadenas -distinct- es muy grande, entonces puede ser el momento de considerar el uso de un código de programa de base de datos dedicado para administrarlos y un servidor de base de datos separado. Del mismo modo, si puede mejorar un programa pequeño (que necesita ejecutarse en 10000 instancias simultáneamente) haciendo que no almacene sus cadenas en absoluto.
Se siente un desperdicio crear una nueva cadena y luego descartarla de inmediato para su intern()
sustituto, pero no hay una alternativa clara, excepto para mantener la cadena duplicada. Entonces, realmente el costo de ejecución es buscar su cadena en el grupo interno y luego permitir que el recolector de basura elimine el original. Y si es un literal de cadena, entonces ya viene internado de todos modos.
Me pregunto si el intern()
código de programa malintencionado puede abusar de él para detectar si algunas cadenas y sus referencias a objetos ya existen en el intern()
grupo y, por lo tanto, existen en otra parte de la sesión de Java, cuando eso no se debe saber. Pero eso solo sería posible cuando el código del programa ya se esté utilizando de manera confiable, supongo. ¡Aún así, es algo a considerar sobre las bibliotecas de terceros que incluye en su programa para almacenar y recordar sus números PIN de cajero automático!