How To Compare Strings With == in Java Cómo comparar cadenas con == en Java
Almost every java developer finds one fine morning that he cannot compare String with “==” as he has been doing with int or char . Casi todos los desarrolladores de Java se encuentra una multa por la mañana que él no se pueden comparar con String "==" como lo ha venido haciendo con char o int. Then either he finds out or someone kindly tells him that objects cannot be compared with “==”. A continuación, ya sea que se encuentre fuera o alguien que amablemente le dice que los objetos no se puede comparar con "==". He has to use equals(Object) method. Él tiene que utilizar es igual a (Objeto) método. However rarely, if ever, he realizes that it is possible to use == to compare two String for equality. There are two great The benefit s of being able to use == for String comparison - improved performance and memory usage reduction. Sin embargo rara vez, si acaso, se da cuenta de que es posible usar == para comparar dos String por la igualdad. Hay dos grandes s El beneficio de ser capaz de usar == para la comparación de cadenas - mejorar el rendimiento y la reducción de uso de memoria.
To achieve this you need to call the magic method - intern() on a String. Para lograr este objetivo es necesario que usted llame a la magia método - intern () en una cadena.
String class internally maintains a private pool of strings which are initially empty. String clase internamente mantiene una piscina privada de cadenas que son inicialmente vacía.
When the intern() method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Cuando el pasante () se invoca el método, si la piscina ya contiene una cadena igual a esta cadena como objeto determinado por la equals (Object) método, entonces la cadena de la piscina se le regresa. Otherwise, this String object is added to the pool and a reference to this String object is returned. De lo contrario, este objeto String se agrega a la piscina y una referencia a este objeto String se devuelve.
All literal strings and string-valued constant expressions are interned. Todas las cadenas de literales de cadena y un valor constante de expresiones son internados.
So if you compare an intern ed String with another intern ed String or String constant then you can safely use == instead of (or in addition to) equals(Object) method. Por lo tanto, si usted compara un interno ed String con otro interno ed String o String constante entonces usted puede utilizar con seguridad == en lugar de (o además de) equivale a (Objeto) método.
This is widely used while processing large XML documents where the tags are interned for faster comparison and lower memory consumption . Esto es ampliamente utilizado en el procesamiento de grandes documentos XML donde las etiquetas están internados más rápido para la comparación y el menor consumo de memoria.
Update: Based two comments below by Christian and Markus, I re-evaluated the validity of touted performance benefit. Actualización: la base por debajo de dos observaciones por Christian y Markus, volver a evaluar la validez de rendimiento promociona beneficio. With JDK 1.5 (I tested with) there isn’t any performance difference between equals(Object) and == for String. Con el JDK 1.5 (he probado con) no hay ninguna diferencia de rendimiento entre iguales (Objeto) y == para String. It is most likely because of equals implementation which first does a == comparison anyway as pointed out by Lo más probable es porque de igual aplicación que primero hace una comparación de todos modos == como señaló Markus Kohler Markus Kohler . Thanks for correcting me guys. Gracias por la corrección de los chicos me.
PS. PD. It is amazing how Java is improving over the versions. Es asombroso cómo Java es la mejora de más de las versiones. Several previous assumptions of performance are not valid anymore. Varios supuestos anteriores de rendimiento no son válidas ya. There goes another. Hay va otra. I wonder when String concatenation with + operator will follow suit. Me pregunto cuando concatenación de cadenas con + operador seguir su ejemplo.
Filed under Filed under Headline News Headline News , How To Cómo , Java Software El software de Java , Tech Note Nota técnica | |
| |
RSS 2.0 RSS 2,0 | |
Email this Article Enviar artículo
You may also like to read También puede leer |





February 26th, 2006 at 3:52 am 26 de febrero de 2006, a las 3:52 am
This is highly problematic. Esto es muy problemático. intern() will pollute the intern constant pool and you will not get the entries out of the pool. intern () contaminan el constante piscina interior y no te las entradas de la piscina. I think it is the best to use a private data structure mimicking the behaviour. Creo que es la mejor para utilizar una estructura de datos privados que imitan el comportamiento.
February 26th, 2006 at 8:13 am 26 de febrero de 2006, a las 8:13 am
Hi, Hola,
I’m not sure whether using intern should really be recommended. No estoy seguro de si el uso interno debe ser recomendado.
Actually if you compare the speed of intern versus a simple hashmap at least on SUN JDK 1.4 the hashmap is much faster. En realidad si se compara la velocidad de interior frente a un simple hashmap al menos en el JDK de Sun 1,4 el hashmap es mucho más rápido. Another point is the String.equals first compares for == anyway. Otro punto es la primera String.equals compara == para todos modos. So there’s almost no point to use == directly. Así que hay casi ningún momento de utilizar == directamente.
You are right some XML parsers use intern, but I’m not sure that is optimal. Tiene usted razón algunos analizadores XML uso interno, pero no estoy seguro de que es óptimo. They may save some memory by using intern instead of a simple HashMap. Ellos pueden guardar parte de la memoria mediante el uso interno en lugar de una simple HashMap.
Regards, Recuerdos,
Markus
February 26th, 2006 at 9:00 am 26 de febrero de 2006, a las 9:00 am
Thanks for the correction. Gracias por la corrección. I checked with sample code and you guys are absolutely right. Lo comprobé con el código de muestra y ustedes tienen toda la razón. With current versions of JDK (I tested with 1.5) I couldn’t find any performance difference. Con las versiones actuales de JDK (he probado con 1.5) no pude encontrar ninguna diferencia de rendimiento.
However I couldn’t understand the “intern() will pollute the intern constant pool and you will not get the entries out of the pool” part. Sin embargo yo no podía entender el "interior () contaminan el constante piscina interior y no te las entradas de la piscina".
Do you mean not being able to garbage collect? ¿Quiere decir no ser capaz de recoger la basura?
Christian, can you please clarify? Christian, ¿puede aclarar por favor?
February 27th, 2006 at 2:29 am 27 de febrero de 2006, a las 2:29 am
Older JVMs will put .intern()’ed strings into a pool of strings that live for the duration of the JVM instance. Mayores pondrá JVM. Intern () 'ed cadenas en un conjunto de cuerdas que vivir durante toda la duración de la JVM ejemplo. Thus, if a long-living process uses .intern() on dynamic strings, it will eventually run out of memory. Así, si un largo proceso que viven los usos. Pasante () en la dinámica de las cadenas, finalmente se queda sin memoria.
A quick test is this program: Una prueba rápida es este programa:
public static void main(String[] args) {public static void main (String [] args) (while (true) {while (true) (System.out.println(String.valueOf(Math.random()).intern());System.out.println (String.valueOf (Math.random ()). Pasante ());})})- it may run out of memory. -- Que puede quedarse sin memoria.
March 1st, 2006 at 2:14 am 1 de marzo de 2006, a las 2:14 am
Hi, Hola,
Regarding your last comment, it was my understanding that since 1.5 there are no performance advantages to doing: En cuanto a su último comentario, es mi entendimiento que, desde 1,5 no hay ventajas de rendimiento a hacer:
StringBuffer buff = New StringBuffer(”first bit”);StringBuffer buff = Nueva StringBuffer ( "primer bit");buff.append(” next bit”);buff.append ( "al lado bit");instead of: en lugar de:
String myString = “first bit”+”next bit”;String myString = "primer bit signo" + "poco";as most 1.5 jvm implement the string + operator using the StringBuffer class anyway. ya que la mayoría de JVM 1,5 aplicar la cadena + operador usando la clase StringBuffer de todos modos.
Please correct me if I am wrong. Por favor, corrija si me equivoco.
March 23rd, 2006 at 11:35 am Marzo 23 de 2006, a las 11:35 am
In your specific case, En su caso concreto,
String myString = "first bit"+"next bit";String myString = "primer bit signo" + "poco";is still better, since the compiler will do the es aún mejor, ya que el compilador hará la
optimization while compiling - so it will compile to the same bytecode as optimización durante la compilación de - por lo que se compilará con el mismo bytecode como
String myString = "first bitnext bit";String myString = "primera bitnext poco";But for the more general case where it is not constant strings, you are almost right. Sin embargo, para el caso más general en que no es constante cuerdas, que son casi la derecha.
The only difference is that in java 1.5 the compiler will use a StringBuilder - it’s just like StringBuffer, but without the synchronisation. La única diferencia es que en java el 1,5 compilador utilizar un StringBuilder - es igual que StringBuffer, pero sin la sincronización. With some JVM’s, this might make the + version marginally faster. Con un poco de la JVM, esto podría hacer la versión + marginalmente más rápido.
As well as more readable. Así como más legible.
Now, if you start doing multiple concatenations in different statements, it is a different matter. Ahora, si usted empezar a hacer múltiples concatenaciones en diferentes estados, es una cuestión diferente. In that case, using an explicit StringBuilder will save the jvm from constructing a lot of temporary StringBuilders. En ese caso, la utilización de un explícito StringBuilder salvará la JVM de la construcción de una gran cantidad de StringBuilders temporal.
It will be much faster to do Será mucho más rápido que hacer
StringBuilder result = new StringBuilder();StringBuilder resultado = new StringBuilder ();for(int i = 0; ifor (int i = 0; ithan que
String result = “”;String resultado = "";for(int i = 0; ifor (int i = 0; iMarch 23rd, 2006 at 11:37 am Marzo 23 de 2006, a las 11:37 am
Whoops - the parser ate my <’s. ¡Vaya - el parser comió mi < 's.
Anyway, you get my menaing. De todos modos, usted obtiene mi menaing.
March 23rd, 2006 at 11:44 am Marzo 23 de 2006, a las 11:44 am
Yes Sí
April 2nd, 2006 at 5:25 am 2 de Abril, 2006 a las 5:25 am
Hi Hola
I am in urgent need for the program in java which compares two huge strings and return boolean value Estoy en urgente necesidad de que el programa en java que compara dos grandes cadenas y restablecer valor booleano
Do help me by giving the appraoch and code ¿Me ayudan dando la appraoch y el código
with regards con respecto a
seenu
April 3rd, 2006 at 3:38 am 3 de Abril, 2006 a las 3:38 am
String.equals() String.equals ()
December 24th, 2006 at 12:09 pm 24, 2006 a las 12:09 pm
out.println(” user from form”);String name3= request.getParameter(”uname”);out.println(name3); out.println ( "usuario de forma"); String name3 = request.getParameter ( "uname"); out.println (name3);
out.println(”user from DB”);String name1= rs.getString(”uname”);out.println(name1); out.println ( "usuario de la base de datos"); String name1 = rs.getString ( "uname"); out.println (name1);
String test=name1; String prueba = name1;
out.println(”pass from DB”);String name2= rs.getString(”pass”);out.println(name2); out.println ( "pasar de la base de datos"); String name2 = rs.getString ( "pass"); out.println (name2);
out.println(” pass from form”);String name4= request.getParameter(”pass”);out.println(name4); out.println ( "pasar de forma"); name4 String = request.getParameter ( "pass"); out.println (name4);
if (name3.equals(name1)) if (name3.equals (name1))
{ (
out.println(”Authentication successful- usewwerwrwrname is correct”); out.println ( "autenticación exitosa-usewwerwrwrname es correcta");
} )
else { else (
out.println(”kindly check your usernasame and/or password”); out.println ( "la amabilidad de comprobar su usernasame y / o contraseña");
} )
the above are my codes, i get the output in the jsp page as : lo anterior son mis códigos, me da la salida en la página jsp como:
user from form krishna usuario de forma Krishna
user from DB krishna DB usuario de Krishna
pass from DB krishna DB pasar de Krishna
pass from form krishna pasar de forma Krishna
kindly check your usernasame and/or password la amabilidad de comprobar su usernasame y / o contraseña
what is wrong in my statement… the strings are same, but the if clause is not executed.. ¿qué hay de malo en mi declaración… las cuerdas son iguales, pero si la cláusula no es ejecutado .. will be kindful to know the answer.. se kindful saber la respuesta ..
January 26th, 2007 at 10:33 am 26 de enero de 2007, a las 10:33
Krishna: you may want to make sure there’s no trailing spaces by doing: Krishna: puede que quiera asegurarse de que no hay espacios de hacerlo:
if (name3.trim().equals(name1.trim()))… if (name3.trim (). equals (name1.trim ()))…
Or even compare case-insensitively by using O incluso comparar casos y mediante el uso de insensitively
name.toUpper(); // I think name.toUpper (); / / creo
At least if you want to be Microsoftish Por lo menos si quieren ser Microsoftish
otherwise I see not problems with your code… (other than calling passwords for “name” — be careful with variable names or it will come back and bite you some day… had a colleague that used zib and zob and variations thereof for his variable names… guess how fun that was to work with? ;o) de otro modo no veo problemas con su código… (que no sea llamando a las contraseñas de "nombre" - tenga cuidado con los nombres de variables o de lo contrario volver a morder usted algún día… había un colega que utiliza y ZIB zob y las variantes de los mismos por su nombres de variables … Supongo que la forma en que fue divertido trabajar con?; O)
HTH
/Erik / Erik
March 1st, 2008 at 8:38 am 1 de marzo de 2008 a 8:38 am
how to uncompare 2 strings?? cómo uncompare 2 cadenas?
if (arr3[u].equalsIgnoreCase(search)) if (arr3 [u]. equalsIgnoreCase (búsqueda))
is to compare es para comparar
how about the right this?? acerca de cómo este derecho?
if (arr3[u] NOT EQUAL TO (search)); if (arr3 [u] no equivale a (búsqueda));
what is tha code for that?? lo que es tha código para que?