How To Compare Strings With == in Java Comment comparer les cordes avec == 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 . Presque tous les développeur Java trouve un beau matin qu'il ne peut pas comparer avec String "==" comme il l'a fait avec int ou char. Then either he finds out or someone kindly tells him that objects cannot be compared with “==”. Ensuite, soit il découvre ou quelqu'un de bien vouloir lui dit que les objets ne peuvent être comparés avec "==". He has to use equals(Object) method. Il doit utiliser equals (Object) méthode. 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. Mais rarement, sinon jamais, il se rend compte qu'il est possible d'utiliser == pour comparer deux cordes pour l'égalité. Il existe deux grandes s L'avantage d'être en mesure d'utiliser == pour la comparaison String - amélioration des performances et de réduction de l'utilisation de la mémoire.
To achieve this you need to call the magic method - intern() on a String. Pour ce faire vous devez appeler la méthode magique - intérieur () sur une chaîne de caractères.
String class internally maintains a private pool of strings which are initially empty. String maintient l'intérieur de la classe une piscine privée de cordes qui sont initialement vide.
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. Lorsque le stagiaire () est invoqué, si la piscine contient déjà une chaîne égale à cette chaîne objet tel que déterminé par le equals (Object) méthode, puis la chaîne de la piscine est de retour. Otherwise, this String object is added to the pool and a reference to this String object is returned. Sinon, cette chaîne objet est ajouté à la piscine et une référence à la présente String objet est de retour.
All literal strings and string-valued constant expressions are interned. Toutes les chaînes littérales et chaîne de valeur constante expressions sont internés.
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. Donc, si vous comparez un stagiaire ed String avec un autre stagiaire ed String String constante ou alors vous pouvez utiliser == au lieu de (ou en plus) est égal à: (Objet) méthode.
This is widely used while processing large XML documents where the tags are interned for faster comparison and lower memory consumption . Cela est largement utilisé lors du traitement de grands documents XML où les balises sont internées pour comparaison plus rapide et plus faible consommation de mémoire.
Update: Based two comments below by Christian and Markus, I re-evaluated the validity of touted performance benefit. Mise à jour: D'après deux commentaires ci-dessous par Christian et Markus, je ré-évalué la validité de vanté la performance. With JDK 1.5 (I tested with) there isn’t any performance difference between equals(Object) and == for String. Avec JDK 1.5 (je l'ai testé avec) il n'existe aucune différence de performance entre égaux (Objet) et == pour String. It is most likely because of equals implementation which first does a == comparison anyway as pointed out by Il est très probable que la mise en œuvre d'égal à égal qui a d'abord fait une comparaison == de toute façon, comme l'a souligné Markus Kohler Markus Kohler . Thanks for correcting me guys. Merci pour la correction moi les gars.
PS. It is amazing how Java is improving over the versions. Il est étonnant de constater à quel Java est l'amélioration de plus de versions. Several previous assumptions of performance are not valid anymore. Plusieurs hypothèses de rendement ne sont pas plus valables. There goes another. Il est un autre. I wonder when String concatenation with + operator will follow suit. Je me demande chaîne concaténation avec l'opérateur + suivront cet exemple.
Filed under Classé sous Headline News Headline News , How To Comment , Java Software Logiciel de Java , Tech Note Note technique | |
| |
RSS 2.0 RSS 2,0 | |
Email this Article Envoyer cet article
You may also like to read Vous mai également à lire |





February 26th, 2006 at 3:52 am Février 26, 2006 at 3:52 am
This is highly problematic. C'est très problématique. intern() will pollute the intern constant pool and you will not get the entries out of the pool. stagiaire () polluer le stagiaire constante piscine et vous n'obtiendrez pas les entrées de la piscine. I think it is the best to use a private data structure mimicking the behaviour. Je pense que c'est le meilleur d'utiliser une structure de données privées imitant le comportement.
February 26th, 2006 at 8:13 am Février 26, 2006 at 8:13 am
Hi, Salut,
I’m not sure whether using intern should really be recommended. Je ne suis pas sûr si l'utilisation interne devrait être recommandé.
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 fait, si l'on compare la vitesse du stagiaire par rapport à un simple hashmap au moins sur SUN JDK 1,4 la hashmap est beaucoup plus rapide. Another point is the String.equals first compares for == anyway. Un autre point est le premier String.equals compare pour == de toute façon. So there’s almost no point to use == directly. Il ya donc presque inutile d'utiliser == directement.
You are right some XML parsers use intern, but I’m not sure that is optimal. Vous avez raison certains parseurs XML usage interne, mais je ne suis pas sûr que est optimale. They may save some memory by using intern instead of a simple HashMap. Ils mai économiser en utilisant la mémoire interne au lieu d'une simple HashMap.
Regards, Observe,
Markus
February 26th, 2006 at 9:00 am Février 26th, 2006 at 9:00 am
Thanks for the correction. Merci pour la correction. I checked with sample code and you guys are absolutely right. J'ai vérifié avec des exemples de code et vous êtes tout à fait raison. With current versions of JDK (I tested with 1.5) I couldn’t find any performance difference. Dans l'état actuel des versions du JDK (je l'ai testé avec la version 1.5) Je ne pourrions trouver aucun différence de performance.
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. Mais je ne pouvais pas comprendre le «stagiaire () polluer le stagiaire constante piscine et vous n'obtiendrez pas les entrées de la piscine».
Do you mean not being able to garbage collect? Voulez-vous dire de ne pas être en mesure de collecter les ordures?
Christian, can you please clarify? Christian, pouvez-vous préciser s’il vous plaît?
February 27th, 2006 at 2:29 am Février 27, 2006 at 2:29 am
Older JVMs will put .intern()’ed strings into a pool of strings that live for the duration of the JVM instance. Âgées mettra JVM. Intern () 'ed cordes dans un groupe de chaînes qui vivent pour la durée de la JVM exemple. Thus, if a long-living process uses .intern() on dynamic strings, it will eventually run out of memory. Ainsi, si un long processus vivant utilise. Intern () sur la dynamique des cordes, elle finit par manquer de mémoire.
A quick test is this program: Un test rapide est l'objectif de ce programme:
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 ()). Intern ());})})- it may run out of memory. -- Mai à court de mémoire.
March 1st, 2006 at 2:14 am Mars 1st, 2006 at 2:14 am
Hi, Salut,
Regarding your last comment, it was my understanding that since 1.5 there are no performance advantages to doing: En ce qui concerne votre dernière remarque, il était Je crois comprendre que, depuis 1,5 n'ya pas d'avantages en matière de performances à faire:
StringBuffer buff = New StringBuffer(”first bit”);StringBuffer buff = Nouvelle StringBuffer ( "premier bit");buff.append(” next bit”);buff.append ( "à côté bit");instead of: au lieu de:
String myString = “first bit”+”next bit”;String machaine = "premier bit" + "à côté bit";as most 1.5 jvm implement the string + operator using the StringBuffer class anyway. car la plupart des 1,5 jvm mettre en œuvre la chaîne opérateur + en utilisant la classe StringBuffer de toute façon.
Please correct me if I am wrong. S’il vous plaît me corriger si je me trompe.
March 23rd, 2006 at 11:35 am Mars 23, 2006 at 11:35 am
In your specific case, Dans votre cas précis,
String myString = "first bit"+"next bit";String machaine = "premier bit" + "à côté bit";is still better, since the compiler will do the est encore mieux, puisque le compilateur fera le
optimization while compiling - so it will compile to the same bytecode as optimisation lors de la compilation - de manière à compiler, à la même comme bytecode
String myString = "first bitnext bit";String machaine = "premier bitnext peu";But for the more general case where it is not constant strings, you are almost right. Mais pour les cas plus général où il n'est pas constante des chaînes, vous êtes presque droit.
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 seule différence est que, dans 1,5 java le compilateur utilise un StringBuilder - c'est comme StringBuffer, mais sans la synchronisation. With some JVM’s, this might make the + version marginally faster. Avec un peu de JVM, ce qui pourrait rendre la + version légèrement plus rapide.
As well as more readable. Ainsi que plus lisible.
Now, if you start doing multiple concatenations in different statements, it is a different matter. Maintenant, si vous commencer à faire des enchaînements multiples dans différents états, c'est une autre affaire. In that case, using an explicit StringBuilder will save the jvm from constructing a lot of temporary StringBuilders. Dans ce cas, en utilisant un StringBuilder explicite permettra de sauver la JVM de la construction d'un grand nombre de StringBuilders temporaire.
It will be much faster to do Il sera beaucoup plus rapide de le faire
StringBuilder result = new StringBuilder();StringBuilder result = new StringBuilder ();for(int i = 0; ifor (int i = 0; ithan que
String result = “”;String result = "";for(int i = 0; ifor (int i = 0; iMarch 23rd, 2006 at 11:37 am Mars 23, 2006 at 11:37 am
Whoops - the parser ate my <’s. Désolé - l'analyseur Ate My < 'art
Anyway, you get my menaing. Quoi qu'il en soit, vous obtenez mon menaing.
March 23rd, 2006 at 11:44 am Mars 23, 2006 at 11:44 am
Yes Oui
April 2nd, 2006 at 5:25 am 2 avril 2006 à 5:25 am
Hi Salut
I am in urgent need for the program in java which compares two huge strings and return boolean value Je suis un besoin urgent pour le programme en java qui compare les deux chaînes de caractères énormes et retour valeur booléenne
Do help me by giving the appraoch and code Est-ce que m'aider en donnant le code et appraoch
with regards en ce qui concerne
seenu
April 3rd, 2006 at 3:38 am Avril 3rd, 2006 at 3:38 am
String.equals() String.equals ()
December 24th, 2006 at 12:09 pm Décembre 24th, 2006 at 12:09 pm
out.println(” user from form”);String name3= request.getParameter(”uname”);out.println(name3); out.println ( "utilisateur de forme"); String name3 = request.getParameter ( "uname"); out.println (name3);
out.println(”user from DB”);String name1= rs.getString(”uname”);out.println(name1); out.println ( "utilisateur de DB"); String nom1 = rs.getString ( "uname"); out.println (nom1);
String test=name1; String test = nom1;
out.println(”pass from DB”);String name2= rs.getString(”pass”);out.println(name2); out.println ( "passer de la DB"); String name2 = rs.getString ( "pass"); out.println (nom2);
out.println(” pass from form”);String name4= request.getParameter(”pass”);out.println(name4); out.println ( "de forme"); String name4 = request.getParameter ( "pass"); out.println (name4);
if (name3.equals(name1)) if (name3.equals (nom1))
{ (
out.println(”Authentication successful- usewwerwrwrname is correct”); out.println ( "authentification réussie usewwerwrwrname-est correcte");
} )
else { else (
out.println(”kindly check your usernasame and/or password”); out.println ( "de bien vouloir vérifier votre usernasame et / ou mot de passe");
} )
the above are my codes, i get the output in the jsp page as : ci-dessus sont mes codes, je obtenir la production dans les jsp page:
user from form krishna utilisateur sous forme de Krishna
user from DB krishna PB utilisateur de Krishna
pass from DB krishna PB passer de Krishna
pass from form krishna passer de la forme Krishna
kindly check your usernasame and/or password de bien vouloir vérifier votre usernasame et / ou mot de passe
what is wrong in my statement… the strings are same, but the if clause is not executed.. ce qui ne va pas dans ma déclaration… les cordes sont les mêmes, mais si la clause n'est pas exécuté .. will be kindful to know the answer.. sera kindful à connaître la réponse ..
January 26th, 2007 at 10:33 am 26 janvier 2007 à 10:33 am
Krishna: you may want to make sure there’s no trailing spaces by doing: Krishna: mai vous voulez être sûr il n'ya pas les espaces en faisant:
if (name3.trim().equals(name1.trim()))… if (name3.trim (). égal à: (name1.trim ()))…
Or even compare case-insensitively by using Ou encore comparer insensitively cas en utilisant
name.toUpper(); // I think name.toUpper () / / je pense
At least if you want to be Microsoftish Au moins si vous voulez être 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) sinon je vois pas de problèmes avec votre code… (autres que les mots de passe d'appel pour "nom" - être prudent avec les noms de variables ou il reviendra et vous mordre un jour… a un collègue qui était Zib et zob et les variations de celle-ci pour son noms des variables … Comment deviner que le plaisir était de travailler? O)
HTH
/Erik / Erik
March 1st, 2008 at 8:38 am 1er mars 2008 chez 8:38 am
how to uncompare 2 strings?? comment uncompare 2 cordes?
if (arr3[u].equalsIgnoreCase(search)) if (arr3 [u]. equalsIgnoreCase (recherche))
is to compare est à comparer
how about the right this?? sur la façon dont ce droit?
if (arr3[u] NOT EQUAL TO (search)); if (arr3 [u] ne correspond pas à (recherche));
what is tha code for that?? ce qui est tha code pour que?