ことわざにあるように、「成功か失敗は細部が決まる」ということですが、これは特にプログラミングに当てはまります。
最近、それを深く実感するプロジェクトに参加しました。
このプロジェクトはレコメンデーション システムの一部であり、私が担当しているのは動画間の類似性を計算する MapRedcue のプログラミングです。別の同僚は Sqoop を使用して、私が計算した結果をオンライン通話用のデータベースにインポートしました。
データをインポートするプロセス中に、常に java.lang.NumberFormatException が発生します。これが原因だと思います。彼の Sqoop では空白行やスペースがフィルターされません。私の類似度結果は正しいです。その後、類似度の結果の一部をメモ帳にコピーしたところ、一部のデータにスペースが含まれていることがわかり、それを直接読み込んで変換しましたが、当然ながら問題が発生しました。 Sqoop がスペースをフィルタリングできるかどうかはわかりませんが、私のプログラムでは出力結果を制御できるため、出力結果ごとに java.lang.String クラスの trim() メソッドを呼び出します。最終的には問題は解決されます。
スペースは常に小さな問題を引き起こしますが、無視することはできません。スペースを削除するには、trim() メソッドを忘れずに呼び出してください。
もう 1 つの問題は、基本データ型のカプセル化クラスを比較する場合、比較されるのは数値ではなくメモリ アドレスである可能性があることです。
類似度計算の過程で、java.lang.Long型間の同一性判定が必要な箇所があります。最終的な類似度の出力結果が間違っていることが分かり、原因を調査した結果、ここにたどり着きました。元のコードは次のとおりです:
if(lg1 == lg2){ return true; }
lg1 と lg2 は両方とも java.lang.Long 型です。 ここでは lg1 と lg2 の値が等しいかどうかを判断したいと思います。 以前、Java のencapsulationクラスは比較に使用するので、 のときに変換されるのでこんな感じに書きました!ただし、この方法で記述すると、数値ではなく、メモリ内のそれぞれのアドレスが比較的大きくなる可能性があります。
この質問をGoogleで検索したところ、java.lang.Float型とjava.lang.Double型は等価判定に「==」を使用しているため、基本的なデータ型であるJavaに変換する必要があると書かれていました。 .lang.Integer および java.lang .Long は変換する必要はありません。Java が自動的に変換します。ただし、私自身のテストはこの声明と矛盾しています。テストコードは以下の通りです:
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)); } }
実行結果:
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
結果からわかるように、Integer型とLong型に値が直接代入されている場合のみ、「==」を用いて等価であると判定され、残りの時間は false です。
つまり、残りの場合は変数の値ではなく、変数がメモリに格納されているアドレスがほとんどです。
では、なぜ Integer 型と Long 型は値を直接代入して結果が true になるのに、Float 型と Double 型は値を直接代入して結果が false になるのでしょうか?おそらくJava自体に最適化対策が施されているのだと思います。つまり、Integer型やLong型に直接値を代入する場合、Integer型やLong型のオブジェクトはメモリ上に作成されず、基本データ型であるintやLongに直接最適化されるのでしょう。長いため、"= が使用されます。 ="結果は、それらが等しい場合にのみ true になります。
念のため、カプセル化されたクラス変数の値が等しいと判定する場合は、「==」判定の値を直接取り出すか、equalsメソッドを使用するのがベストです。
lg1.equals(lg2)
このような細かい点が、はっきりと理解していないと、トラブルの原因になるのではないかと思います。
Java プログラミングでは注意が必要な詳細が多数ありますが、ここでは 1 つか 2 つだけ説明します。
以上がJava プログラミングで注意する必要がある詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。