2015-12-18 2 views
0

Je sais que les chaînes de Java doivent être comparées en utilisant .equals() et sans utiliser l'opérateur ==.Comparaison de chaînes dans Java 6 vs Java 7

Mais dans le ci-dessous le code il y a une primaryObserverId qui a une valeur de ""

Le ci-dessous if état fonctionne bien sur Java 6, mais échoue sur Java 7

String primaryObserverId = request.getParameter("primary_observer_id"); 
     if(primaryObserverId == null || primaryObserverId=="") 
      primaryObserverId = RoleMap.getUserIdForThisSession(session.getId()); 

besoin de savoir pourquoi ce code fonctionnait sur Java 6 et pas sur Java 7.

Je sais comment le concept de String Pool fonctionne pour les littéraux de chaîne dans Java, je veux juste connaître la raison de ce comportement abrupt.

peut utiliser la version différente de GlassFish peut causer un problème que j'utilise GlassFish-2.1 avec Java 6 et GlassFish-4.1 avec Java 7

+1

Autre chose. PAS de changement avec la version. –

+0

Etes-vous sûr que vous obtenez "" dans Java 6 et 7? – Joker

+2

Sur Java 6, c'était juste de la chance: les littéraux sont "mis en cache" et "" == "" fonctionne mais la nouvelle chaîne ("") == "" ne fonctionne pas. – Mikey

Répondre

0

Toutes les chaînes littérales en java sont placés dans une zone spéciale du tas comme ils sont obligatoires. Donc, si vous avez une variable qui est initialisée à une chaîne vide, cette chaîne est ajoutée au tas. Si vous avez une autre variable qui est initialisée à une chaîne vide, alors elle contiendra une référence à la chaîne vide déjà sur le tas plutôt que d'en créer une nouvelle. Donc, il semble que votre problème est que lorsque vous exécutez votre application dans Java 6 pour une raison quelconque, une chaîne vide est sur le tas à ce point, vous pouvez donc vérifier que les deux chaînes sont exactement le même objet. Cependant, lorsqu'il est exécuté dans Java 7, il n'y a pas de chaîne vide sur le tas, donc les deux chaînes doivent être des objets complètement différents. Pour une explication plus complète, voir this article.

0

== compare l'adresse en mémoire alors que equals() compare si 2 objets sont véritablement équivalent, dans votre cas, il est plus logique à l'utilisateur la méthode equals() comme Servlet crée la chaîne de ne pas utiliser la piscine, donc ils ne sont pas == mais ils sont significativement équivalents, donc equals.

String primaryObserverId = request.getParameter("primary_observer_id"); 

if(primaryObserverId == null || "".equals(primaryObserverId)){ 
      primaryObserverId = RoleMap.getUserIdForThisSession(session.getId()); 
}