Comme le dit le proverbe : « Les détails déterminent le succès ou l'échec », et cela est particulièrement vrai pour la programmation.
Récemment, j'ai participé à un projet qui m'a fait prendre conscience de cela profondément.
Ce projet fait partie du système de recommandation. La partie dont je suis responsable est la programmation MapRedcue pour calculer la similarité entre les vidéos ! Un autre collègue a utilisé Sqoop pour importer les résultats que j'ai calculés dans la base de données pour les appels en ligne.
Pendant le processus d'importation de données, une exception java.lang.NumberFormatException se produit toujours. Je pense que c'est la raison pour laquelle son Sqoop ne filtre pas les lignes vides ou les espaces. Mon résultat de similarité n'est pas faux. Plus tard, il a copié une partie des résultats de similarité dans le Bloc-notes et a découvert que certaines données comportaient des espaces. Il les a lues directement puis les a converties, mais bien sûr, quelque chose s'est mal passé. Je ne sais pas si Sqoop peut filtrer les espaces, mais mon programme peut contrôler les résultats de sortie, j'appelle donc la méthode trim() de la classe java.lang.String pour chaque résultat de sortie. Finalement, le problème est résolu.
Les espaces posent toujours quelques problèmes mineurs, mais ils ne peuvent être ignorés. Pour éliminer les espaces, pensez à appeler la méthode trim().
Un autre problème est que lors de la comparaison des classes d'encapsulation de types de données de base, il se peut que ce ne soient pas les valeurs numériques qui sont comparées, mais les adresses mémoire !
Dans le processus de calcul de similarité, il existe un endroit où un jugement d'égalité entre les types java.lang.Long est requis. Lorsque j’ai découvert que le résultat final de similarité était incorrect, j’ai enquêté sur la cause et j’ai finalement atterri ici. Le code original est comme ceci :
if(lg1 == lg2){ return true; }
lg1 et lg2 sont tous deux de type java.lang.Long Ici, je veux déterminer si les valeursde lg1 et lg2 sont égales. Je me souvenais seulement qu'en général, les classes encapsulées de Java effectueraient une conversion lors de la comparaison, alors je l'ai écrit comme ça ! Mais l'écrire de cette façon peut aussi être relativement important, non pas la valeur numérique, mais leurs adresses respectives en mémoire.
J'ai recherché cette question sur Google. Il a été dit en ligne que le type java.lang.Float et le type java.lang.Double utilisent "==" pour porter des jugements d'égalité et doivent être convertis en données de base. types, java.lang.Integer. et java.lang.Long n'ont pas besoin d'être convertis, Java les convertira automatiquement. Cependant, mes propres tests contredisent cette affirmation. Voici le code du test :
package org.jindao.basic; /** * @author * @date 2013年10月25日 上午7:30:47 */ public class BasicTest { public static void main(String[] args) { Integer ig1 = 3; Integer ig2 = 3; System.out.println("Integer ig1 = 3,Integer ig2 = 3 ig1==ig2的结果为:"+(ig1==ig2)); Integer ig3 = new Integer(3); Integer ig4 = new Integer(3); System.out.println("Integer ig3 = new Integer(3),Long ig4 = new Integer(3) ig3==ig4的结果为:"+(ig3==ig4)); Long lg1 = 3l; Long lg2 = 3l; System.out.println("Long lg1 = 3l,Long lg2 = 3l lg1==lg2的结果为:"+(lg1==lg2)); Long lg3 = new Long(3); Long lg4 = new Long(3); System.out.println("Long lg3 = new Long(3),Long lg4 = new Long(3) lg3==lg4的结果为:"+(lg3==lg4)); Float flt1 = 3.2f; Float flt2 = 3.2f; System.out.println("Float flt1 = 3.2f,Float flt2 = 3.2f flt1==flt2的结果为:"+(flt1==flt2)); Float flt3 = new Float(3.2); Float flt4 = new Float(3.2); System.out.println("Float flt3 = new Float(3.2),Float flt4 = new Float(3.2)) flt3==flt4的结果为:"+(flt3==flt4)); Double db1 = 3.2; Double db2 = 3.2; System.out.println("Double db1 = 3.2,Double db2 = 3.2 db1==db2的结果为:"+(db1==db2)); Double db3 = new Double(3.2); Double db4 = new Double(3.2); System.out.println("Double db3 = new Double(3.2),Double db4 = new Double(3.2) db3==db4的结果为:"+(db3==db4)); } }
Résultats d'exécution :
Integer ig1 = 3,Integer ig2 = 3 ig1==ig2的结果为:true Integer ig3 = new Integer(3),Long ig4 = new Integer(3) ig3==ig4的结果为:false Long lg1 = 3l,Long lg2 = 3l lg1==lg2的结果为:true Long lg3 = new Long(3),Long lg4 = new Long(3) lg3==lg4的结果为:false Float flt1 = 3.2f,Float flt2 = 3.2f flt1==flt2的结果为:false Float flt3 = new Float(3.2),Float flt4 = new Float(3.2)) flt3==flt4的结果为:false Double db1 = 3.2,Double db2 = 3.2 db1==db2的结果为:false Double db3 = new Double(3.2),Double db4 = new Double(3.2) db3==db4的结果为:false
Comme le montrent les résultats, uniquement lorsque les types Integer et Long se voient attribuer des valeurs directement, utilisez "== "Ce ne sera vrai que lorsqu'il sera jugé égal, et ce sera faux dans les autres cas.
C'est-à-dire que le reste des cas concerne principalement l'adresse où la variable est stockée dans la mémoire, et non la valeur de la variable.
Alors pourquoi les types Integer et Long attribuent-ils directement des valeurset le résultat est vrai, alors que les types Float et Double attribuent directement des valeurset le résultat est faux ? Je suppose que Java lui-même a des mesures d'optimisation, c'est-à-dire que lors de l'attribution directe de valeurs aux types Integer et Long, les objets de types Integer et Long ne sont pas créés dans la mémoire, mais sont directement optimisés pour les types de données de base int et long, donc "= est utilisé. =" Le résultat ne sera vrai que s'ils sont égaux.
Par souci de sécurité, pour juger que les valeurs des variables de classe encapsulées sont égales, il est préférable de retirer directement les valeurspour le jugement "==", ou d'utiliser les égaux méthode, c'est-à-dire
lg1.equals(lg2)
Comme ces petits détails, s'ils ne sont pas compris, peuvent causer des problèmes à un moment donné.
Les détails déterminent le succès ou l'échec. Il y a de nombreux détails auxquels il faut prêter attention dans la programmation Java. Nous n'en discuterons qu'un ou deux ici.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!