Wie das Sprichwort sagt: „Details entscheiden über Erfolg oder Misserfolg“, und das gilt insbesondere für die Programmierung.
Kürzlich habe ich an einem Projekt teilgenommen, das mir dies zutiefst bewusst gemacht hat.
Dieses Projekt ist Teil des Empfehlungssystems. Der Teil, für den ich verantwortlich bin, ist die MapRedcue-Programmierung zur Berechnung der Ähnlichkeit zwischen Videos! Ein anderer Kollege hat Sqoop verwendet, um die von mir berechneten Ergebnisse in die Datenbank für Online-Anrufe zu importieren.
Während des Importvorgangs tritt immer eine java.lang.NumberFormatException auf, weil sein Sqoop keine Leerzeilen oder Leerzeichen filtert. Mein Ähnlichkeitsergebnis ist nicht falsch. Später kopierte er einen Teil der Ähnlichkeitsergebnisse in Notepad und stellte fest, dass einige Daten Leerzeichen enthielten. Er las sie direkt ein und konvertierte sie dann, aber natürlich ging etwas schief. Ich weiß nicht, ob Sqoop Leerzeichen filtern kann, aber mein Programm kann die Ausgabeergebnisse steuern, daher rufe ich für jedes Ausgabeergebnis die Methode trim() der Klasse java.lang.String auf. Irgendwann ist das Problem gelöst.
Leerzeichen verursachen immer kleinere Probleme, die aber nicht ignoriert werden können. Um Leerzeichen zu eliminieren, denken Sie daran, die Methode trim() aufzurufen.
Ein weiteres Problem besteht darin, dass beim Vergleich von Kapselungsklassen grundlegender Datentypen möglicherweise nicht die numerischen Werte verglichen werden, sondern die Speicheradressen!
Im Prozess der Ähnlichkeitsberechnung gibt es eine Stelle, an der eine Gleichheitsbeurteilung zwischen java.lang.Long-Typen erforderlich ist. Als ich feststellte, dass das endgültige Ergebnis der Ähnlichkeitsausgabe falsch war, untersuchte ich die Ursache und landete schließlich hier. Der Originalcode lautet wie folgt:
if(lg1 == lg2){ return true; }
lg1 und lg2 sind beide vom Typ java.lang.Long. Hier möchte ich beurteilen, ob die Werte von lg1 und lg2 gleich sind Denken Sie im Allgemeinen daran, dass die gekapselte Klasse von Java beim Vergleich konvertiert wird, also habe ich es so geschrieben! Wenn man es aber auf diese Weise schreibt, kann es auch relativ groß sein, nicht der numerische Wert, sondern die jeweilige Adresse im Speicher.
Ich habe diese Frage bei Google gesucht. Es wurde online gesagt, dass der Typ java.lang.Float und der Typ java.lang.Double „==" verwenden, um Gleichheitsurteile zu treffen, und in Basisdaten umgewandelt werden müssen Die Typen java.lang.Integer und java.lang.Long müssen nicht konvertiert werden, Java konvertiert sie automatisch. Meine eigenen Tests widersprechen dieser Aussage jedoch. Das Folgende ist der Testcode:
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)); } }
Laufergebnisse:
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
Wie aus den Ergebnissen ersichtlich ist, gilt „==" nur, wenn den Typen Integer und Long direkt Werte zugewiesen werden. kann verwendet werden, um Gleichheit zu bestimmen, und wird in der übrigen Zeit falsch sein.
Das heißt, in den übrigen Fällen handelt es sich hauptsächlich um die Adresse, an der die Variable im Speicher gespeichert ist, nicht um den Wert der Variablen.
Warum weisen dann die Typen Integer und Long direkt Werte zu und das Ergebnis ist wahr, während die Typen Float und Double direkt Werte zuweisen und das Ergebnis falsch sind? Ich vermute, dass Java selbst über Optimierungsmaßnahmen verfügt, d. h. beim direkten Zuweisen von Werten zu den Typen Integer und Long werden Objekte der Typen Integer und Long nicht im Speicher erstellt, sondern direkt auf die Basisdatentypen int und optimiert lang, daher wird „=“ verwendet. ="Das Ergebnis ist nur dann wahr, wenn sie gleich sind.
Aus Sicherheitsgründen ist es bei der Beurteilung, dass die Werte der gekapselten Klassenvariablen gleich sind, am besten, die Werte für die „==“-Beurteilung direkt herauszunehmen oder Gleichheit zu verwenden Methode, das heißt
lg1.equals(lg2)
Kleine Details wie diese Wenn Sie es nicht herausfinden, kann es irgendwann zu Problemen kommen.
Details entscheiden über Erfolg oder Misserfolg. Es gibt viele Details, auf die man bei der Java-Programmierung achten muss. Wir werden hier nur ein oder zwei besprechen.
Das obige ist der detaillierte Inhalt vonDetails, auf die bei der Java-Programmierung geachtet werden muss. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!