常言道:“細節決定成敗”,程式設計更是如此。
近期,我參加的一個項目,讓我對此體會深刻。
這個專案屬於推薦系統的一部分,我負責的一塊是進行MapRedcue編程,計算影片之間的相似度!另一位同事就把我計算出來的結果用Sqoop匯入到資料庫中,供線上呼叫。
在導入資料的過程中,總是爆出java.lang.NumberFormatException異常,我認為是他那裡的原因,他的Sqoop沒有進行空行或空格過濾,我的相似度結果是沒有錯的。後來他把一部分相似度結果複製到Notepad裡面,發現有的資料有空格,他是直接讀入,然後進行轉換,當然就出現問題了。我不知道Sqoop能不能進行空格過濾,但是,我的程式可以控制輸出的結果,所以就對每一個輸出結果都呼叫了java.lang.String類別的trim()方法。最終問題解決。
空格,總是會造成一些小問題,但不容忽視。消除空格,記得呼叫trim()方法。
另一個問題是基本資料型別的封裝類別進行比較的時候,可能不是比較的數值,而是記憶體的位址!
相似度計算的過程中,有一個地方需要進行java.lang.Long類型之間的相等判斷。我發現最終的相似度輸出結果不正確時,排查原因,最終定位到這裡。原來的程式碼是這樣的:
if(lg1 == lg2){ return true; }
lg1和lg2都是java.lang.Long類型,我在這裡是想判斷lg1和lg2的數值是否相等,之前,我只是籠統地記得,Java的封裝類別進行比較的時候會進行轉換的,所以就這樣寫了!但是這樣寫也可能比較大不是數值,而是他們各自在記憶體中的位址。
我用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型別直接賦數值的時候,使用「==」判斷相等才會為true,其餘的時候都為false。
也就是說其餘的情況比較多都是變數在記憶體存放的位址,並不是變數的數值。
那為什麼Integer和Long型別直接賦數值,結果為true,而Float和Double型別直接賦數值,結果為false呢?我猜測,Java本身有最佳化措施,就是給Integer和Long型別直接賦數值的時候,記憶體裡面並沒有建立Integer和Long類型的對象,而是直接優化為基本資料型態int和long,所以是用「= =」判斷相等,結果才會為true。
為了保險起見,當判斷封裝類別變數的數值相等時,最好直接取出數值來進行「==」判斷,或是使用equals方法,即
lg1.equals(lg2)
像這些小細節,如果不搞清楚,說不定什麼時候就會造成*煩。
細節決定成敗,Java程式設計還有很多需要注意的細節,這裡只探討一二。
以上是Java程式設計中那些需要注意的細節的詳細內容。更多資訊請關注PHP中文網其他相關文章!

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。

Java的強類型系統通過類型安全、統一的類型轉換和多態性確保了平台獨立性。 1)類型安全在編譯時進行類型檢查,避免運行時錯誤;2)統一的類型轉換規則在所有平台上一致;3)多態性和接口機制使代碼在不同平台上行為一致。

JNI會破壞Java的平台獨立性。 1)JNI需要特定平台的本地庫,2)本地代碼需在目標平台編譯和鏈接,3)不同版本的操作系統或JVM可能需要不同的本地庫版本,4)本地代碼可能引入安全漏洞或導致程序崩潰。

新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境