175 votes

Dois-je utiliser string.isEmpty() ou "".equals(string) ?

Je le teste généralement en même temps qu'un string == null Je ne suis donc pas vraiment préoccupé par un test de sécurité nul. Lequel dois-je utiliser ?

String s = /* whatever */;
...
if (s == null || "".equals(s))
{
    // handle some edge case here
}

o

if (s == null || s.isEmpty())
{
    // handle some edge case here
}

Sur cette note - est-ce que isEmpty() même faire autre chose que return this.equals(""); o return this.length() == 0; ?

27 votes

Gardez à l'esprit que isEmpty() est uniquement Java 6+.

1 votes

Vous pourriez créer une méthode d'aide Util.String.hasValue(String s) qui vérifie les nullités, les vides et les espaces pour gérer tous les cas.

5 votes

@ColinD Probablement pas un problème - J2SE 5.0 a terminé sa période de fin de vie il y a quelque temps.

253voto

Michael Mrozek Points 44120

Le principal avantage de "".equals(s) c'est que vous n'avez pas besoin de le contrôle de la nullité ( equals vérifiera son argument et retournera false s'il est nul), ce dont vous ne semblez pas vous soucier. Si vous ne vous souciez pas de s étant nul (ou qui le vérifient d'une autre manière), j'utiliserais définitivement s.isEmpty() ; ça montre exactement ce que vous vérifiez, vous vous souciez de savoir si oui ou non s est vide, et non si elle est égale à la chaîne vide

30 votes

Merci pour l'explication. Je sais maintenant pourquoi il faut privilégier "".equals(str) plutôt que str.equals("") ! Je me suis toujours demandé pourquoi les autres utilisent si souvent cette méthode, mais ne tenaient pas compte des valeurs nulles. Génial :-)

10 votes

À mon avis, la vérification de la valeur nulle est toujours nécessaire dans les exemples ci-dessus, car nous supposons que la condition doit être vraie pour une valeur nulle. s == null || "".equals(s)

0 votes

Je sais que c'est un vieux sujet et je suis désolé d'y revenir, mais j'ai une question. Que faire si nous faisons quelque chose comme ceci : if ("".equals(value.getValue().toString().trim())) où, value.getValue() renvoie une valeur de type objet. Le toString est donc nécessaire. Donc, le .equals s'occuperait-il toujours de la valeur nulle (au cas où value ou .getValue() renvoie null) ?

84voto

David Young Points 1586

String.equals("") est en fait un peu plus lent qu'un simple isEmpty() appel. Les chaînes de caractères stockent une variable de comptage initialisée dans le constructeur, puisque les chaînes de caractères sont immuables.

isEmpty() compare la variable count à 0, tandis que equals vérifiera le type, la longueur de la chaîne, puis itérera sur la chaîne pour la comparer si les tailles correspondent.

Donc, pour répondre à votre question, isEmpty() en fera beaucoup moins, et c'est une bonne chose.

3 votes

Je pense que dans ce cas la différence ne s'applique pas ; il n'y aura jamais d'itération sur les chaînes à comparer, parce que les tailles ne correspondront pas (à moins que la chaîne soit vide, et alors il n'y a pas de caractères à itérer).

2 votes

C'est vrai mais avec les égaux, il faut d'abord vérifier la référence pour voir s'il s'agit du même objet, puis un instanceof, puis un cast en String, une vérification de la longueur, et enfin l'itération. Si les deux chaînes de caractères étaient vides, il s'agirait d'une simple vérification de référence.

0 votes

Le code source de la classe String est disponible java2s.com/Open-Source/Java-Document/6.0-JDK-Core/lang/java/

17voto

Fabian Steeg Points 24261

Outre les autres problèmes mentionnés, vous devez tenir compte des points suivants isEmpty() a été introduit en 1.6, donc si vous l'utilisez, vous ne pourrez pas exécuter le code sur Java 1.5 ou moins.

4 votes

Ce n'est absolument pas un problème pour moi.

1 votes

De plus, cette réponse date maintenant de 6 ans. J'espère que personne n'a plus besoin d'utiliser un ancien système comme Java 1.5.

1 votes

Il y a en fait beaucoup de choses qui peuvent se briser lors de la mise à jour d'une version de Java. C'est moins critique pour une application back-end qui tourne sur un gros serveur, mais c'est important pour les applications clientes. Les bibliothèques graphiques et les stratégies de collecte des déchets sont souvent affectées par les mises à jour majeures et mineures de Java. En plus de cela, les logiciels clients peuvent fonctionner sur différents systèmes d'exploitation et parfois avec une mémoire limitée, ce qui signifie que vous n'aurez souvent pas le budget/les ressources nécessaires pour tout tester. - Oui, j'ai des clients qui s'en tiennent encore à Java 5 en 2017.

15voto

CoolBeans Points 11615

Vous pouvez utiliser apache commons StringUtils isEmpty() ou isNotEmpty().

2 votes

@2019 et nous avons toujours besoin d'une bibliothèque tierce pour cela :sigh :

2voto

Kylar Points 3435

Cela n'a pas vraiment d'importance. "".equals(str) est plus clair à mon avis.

isEmpty() renvoie à count == 0 ;

48 votes

Je dirais str.isEmpty() est beaucoup plus clair que "".equals(str) . Il se lit comme ce que vous vérifiez. C'est une question d'opinion, je suppose.

7 votes

Je pense que certaines personnes préfèrent faire "".equals(str) pour éviter les NPE. Personnellement, je n'aime pas cela car je préfère vérifier d'abord que la chaîne de caractères n'est pas nulle.

0 votes

@CoolBeans Yep. Cela dit, les questions disent : donc je ne suis pas vraiment inquiet au sujet d'un test de sécurité nul. .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X