java初學者常見的問題
本文為那些准Java程序員們準備了一系列廣為流傳的Java最佳編程實踐:
1. 優先返回空集合而非null
如果程序要返回一個不包含任何值的集合,確保返回的是空集合而不是null。這能節省大量的」if else」檢查。
1. 謹慎操作字元串
如果兩個字元串在for循環中使用+操作符進行拼接,那麼每次循環都會產生一個新的字元串對象。這不僅浪費內存空間同時還會影響性能。類似的,如果初始化字元串對象,盡量不要使用構造方法,而應該直接初始化。比方說:
1. 避免無用對象
創建對象是Java中最昂貴的操作之一。因此最好在有需要的時候再進行對象的創建/初始化。如下:
1. 數組與ArrayList之爭
開發人員經常會發現很難在數組和ArrayList間做選擇。它們二者互有優劣。如何選擇應該視情況而定。
· 數組是定長的,而ArrayList是變長的。由於數組長度是固定的,因此在聲明數組時就已經分配好內存了。而數組的操作則會更快一些。另一方面,如果我們不知道數據的大小,那麼過多的數據便會導致ArrayOutOfBoundException,而少了又會浪費存儲空間。
· ArrayList在增刪元素方面要比數組簡單。
· 數組可以是多維的,但ArrayList只能是一維的。
1. try塊的finally塊沒有被執行
看下下面這段代碼:
從代碼來看,貌似finally塊中的println語句應該會被執行5次。但當程序運行後,你會發現finally塊只執行了4次。第5次迭代的時候會觸發exit函數的調用,於是這第5次的finally便永遠也觸發不到了。原因便是——System.exit會掛起所有線程的執行,包括當前線程。即便是try語句後的finally塊,只要是執行了exit,便也無力回天了。
在調用System.exit時,JVM會在關閉前執行兩個結束任務:
首先,它會執行完所有通過Runtime.addShutdownHook註冊進來的終止的鉤子程序。這一點很關鍵,因為它會釋放JVM外部的資源。
接下來的便是Finalizer了。可能是System.runFinalizersOnExit也可能是Runtime.runFinalizersOnExit。finalizer的使用已經被廢棄有很長一段時間了。finalizer可以在存活對象上進行調用,即便是這些對象仍在被其它線程所使用。而這會導致不可預期的結果甚至是死鎖。
1. 判斷奇數
看下這幾行代碼,看看它們是否能用來準確地判斷一個數是奇數?
看似是對的,但是每執行四便會有一個錯誤的結果(用數據說話)。考慮到負奇數的情況,它除以2的結果就不會是1。因此,返回值是false,而這樣是不對的。
代碼可以修改成這樣:
這麼寫不光是負奇數的問題解決了,並且還是經過充分優化過的。因為算術運算和邏輯運行要比乘除運算更高效,計算的結果也會更快。
單引號與雙引號的區別
看起來這段代碼會返回」Haha」,但實際返回的是Ha169。原因就是用了雙引號的時候,字元會被當作字元串處理,而如果是單引號的話,字元值會通過一個叫做基礎類型拓寬的操作來轉換成整型值。然後再將值相加得到169。
1. 一些防止內存泄露的小技巧
內存泄露會導致軟體的性能降級。由於Java是自動管理內存的,因此開發人員並沒有太多辦法介入。不過還是有一些方法能夠用來防止內存泄露的。
· 查詢完數據後立即釋放資料庫連接
· 儘可能使用finally塊
· 釋放靜態變數中的實例
1. 避免死鎖
死鎖出現的原因有很多。避免死鎖不是一句話就能解決的。通常來說,當某個同步對象在等待另一個同步對象所擁有的資源上的鎖時,便會產生死鎖。
試著運行下下面的程序。它會告訴你什麼是死鎖。這個死鎖是由於兩個線程都在等待對方所擁有的資源,因此會產生死鎖。它們會一直等待,沒有誰會先放手。
輸出:
但如果調用的順序變一下的話,死鎖的問題就解決了。
輸出:
1. 替Java省點內存
某些Java程序是CPU密集型的,但它們會需要大量的內存。這類程序通常運行得很緩慢,因為它們對內存的需求很大。為了能提升這類應用的性能,可得給它們多留點內存。因此,假設我們有一台擁有10G內存的Tomcat伺服器。在這台機器上,我們可以用如下的這條命令來分配內存:
· Xms = 最小內存分配
· Xmx = 最大內存分配
· XX:PermSize = JVM啟動時的初始大小
· XX:MaxPermSize = JVM啟動後可分配的最大空間
1. 冪運算
Java是通過異或操作來進行冪運算的。Java對於冪運算有兩種處理方式:
· 乘積:
· pow方法:在無法使用乘積的情況下可以使用pow方法。
不到萬不得已不要使用Math.pow。比方說,當指數是小數的時候。因為Math.pow要比乘積慢300-600倍左右。
1. 如何處理空指針異常
空指針異常是Java中很常見的異常。當你嘗試調用一個null對象上的方法時便會拋出這個異常。比如:
在上述例子中,school為空或者listStudents()為空都可能會拋出了NullPointerException。因此最好檢查下對象是否為空以避免類似情況。
1.JSON編碼
JSON是數據存儲及傳輸的一種協議。與XML相比,它更易於使用。由於它非常輕量級以及自身的一些特性,現在JSON在網路上已經是越來越流行了。常見的數據結構都可以編碼成JSON然後在各個網頁間自由地傳輸。不過在開始編碼前,你得先安裝一個JSON解析器。在下面的例子中,我們將使用json.simple庫來完成這項工作 (網頁鏈接)。
下面是編碼成JSON串的一個簡單的例子。
輸出:
1. 簡單字元串查找
Java提供了一個庫函數叫做indexOf()。這個方法可以用在String對象上,它返回的是要查找的字元串所在的位置序號。如果查找不到則會返回-1。
1. 列出目錄下的文件
你可以用下面的代碼來列出目錄下的文件。這個程序會遍歷某個目錄下的所有子目錄及文件,並存儲到一個數組裡,然後通過遍曆數組來列出所有文件。
1. 一個簡單的IO程序
Java提供了FileInputStream以及FileOutputStream類來進行文件的讀寫操作。FileInputStream的構造方法會接收輸入文件的路徑作為入參然後創建出一個文件的輸入流。同樣的,FileOutputStream的構造方法也會接收一個文件路徑作為入參然後創建出文件的輸出流。在處理完文件之後,一個很重要的操作就是要記得」close」掉這些流。
※java程序員的表白書
※Java運算符優先順序表
※為什麼Java是華爾街上最炙手可熱 三門編程語言之一
※這些才是JAVA和C加加的核心區別
※JAVA學習 基礎入門
TAG:java學習吧 |
※Anitama新聲:新人獎投稿者的常見問題
※Android不常見問題索引
※Smalley 常見問題答疑:彈簧
※Python爬蟲面試常見問題
※MySQL Mysqldump 常見問題和處理
※你遇到的問題,它是problem,還是question?
※Samsung承認Android Oreo更新後可能存在隨機重新啟動問題
※原來舞蹈真的有balance的問題
※用深度學習解決Bongard問題
※etcd集群之常見問題
※Cimatron編程注意的問題術語
※有關webscraper的問題,看這個就夠了
※Belle&Sebastian:如何解決人類的問題?
※Linux 面試常見問題匯總
※二分類logistic回歸,更新幾個常見問題的解決方法
※關於Pinterest的眾多問題,我們一 一解答
※FAQ詳解「Meltdown和Spectre」問題,接踵而來的「Skyfall和Solace」是否僅是騙局?
※iPhoneX 又曝新問題
※如何通過距離度量學習解決Street-to-Shop問題
※如何通過距離度量學習解決 Street-to-Shop 問題