當前位置:
首頁 > 最新 > Java 新手問題匯總

Java 新手問題匯總

Java的是目前最流行的編程語言之一 - 它可以用來編寫的Windows程序或者是網路應用,移動應用,網路程序,消費電子產品,機頂盒設備,它無處不在。

有超過30億的設備是運行在Java之上的根據Oracle的統計數據,光是使用中的Java卡就有50億。

超過900萬程序員選擇使用的Java進行開發,它是最受開發人員歡迎的語言,同時也是最流行的開發平台。

本文為那些準的Java程序員們準備了一系列廣為流傳的Java的最佳編程實踐

優先返回空集合而非空

如果程序要返回一個不包含任何值的集合,確保返回的是空集合而不是null。這能節省大量的「if else」檢查。

public class getLocationName { return(null == cityName?「」:cityName); }

謹慎操作字元串

如果兩個字元串在用於循環中使用+操作符進行拼接,那麼每次循環都會產生一個新的字元串對象。這不僅浪費內存空間同時還會影響性能。類似的,如果初始化字元串對象,盡量不要使用構造方法,而應該直接初始化比方說:

// Slower instantiation String bad = new String(「另一個字元串對象」); //更快的實例化字元串good =「另一個字元串對象」

避免無用對象

創建對象是Java的中最昂貴的操作之一因此最好在有需要的時候再進行對象的創建/初始化如下。:

import java.util.ArrayList; import java.util.List; 公職 人員 public List getEmployees(){ //僅在需要時初始化 if(null == Employees){ Employees = new ArrayList(); } 返回員工; } }

數組與ArrayList的之爭

開發人員經常會發現很難在數組和ArrayList的間做選擇。它們二者互有優劣。如何選擇應該視情況而定。

import java.util.ArrayList; public class arrayVsArrayList { public static void main(String [] args){ int [] myArray = new int [6]; myArray [7] = 10; // ArraysOutOfBoundException //聲明ArrayList。添加和刪除元素很容易。 ArrayList myArrayList = new ArrayList (); myArrayList.add(1); myArrayList.add(2); myArrayList.add(3); myArrayList.add(4); myArrayList.add(5); myArrayList.remove(0); for(int i = 0; i

數組是定長的,而ArrayList的是變長的。由於數組長度是固定的,因此在聲明數組時就已經分配好內存了。而數組的操作則會更快一些。另一方面,如果我們不知道數據的大小,那麼過多的數據便會導致ArrayOutOfBoundException,而少了又會浪費存儲空間。

ArrayList的在增刪元素方面要比數組簡單。

數組可以是多維的,但ArrayList的只能是一維的。

嘗試塊的最後塊沒有被執行

看下下面這段代碼:

public class shutDownHooksDemo { public static void main(String [] args){ for(int i = 0; i

從代碼來看,貌似最後塊中的的println語句應該會被執行5次。但當程序運行後,你會發現最終塊只執行了4次。第5次迭代的時候會觸發出口函數的調用,於是這第5次的最後便永遠也觸發不到了。原因便是--System.exit會掛起所有線程的執行,包括當前線程。即便是嘗試語句後的最終塊,只要是執行了退出,便也無力回天了。

在調用System.exit時,JVM會在關閉前執行兩個結束任務:

首先,它會執行完所有通過Runtime.addShutdownHook註冊進來的終止的鉤子程序。這一點很關鍵,因為它會釋放JVM外部的資源。

接下來的便是終結了。可能是System.runFinalizersOnExit也可能是Runtime.runFinalizersOnExit.finalizer的使用已經被廢棄有很長一段時間了.finalizer可以在存活對象上進行調用,即便是這些對象仍在被其它線程所使用。而這會導致不可預期的結果甚至是死鎖。

public class shutDownHooksDemo { public static void main(String [] args){ for(int i = 0; i

判斷奇數

看下這幾行代碼,看看它們是否能用來準確地判斷一個數是奇數?

public boolean oddOrNot(int num){ return num%2 == 1; }

看似是對的,但是每執行四便會有一個錯誤的結果(用數據說話)。考慮到負奇數的情況,它除以2的結果就不會是1.因此,返回值是假的,而這樣是不對的。

代碼可以修改成這樣:

public boolean oddOrNot(int num){ return(num&1)!= 0; }

這麼寫不光是負奇數的問題解決了,並且還是經過充分優化過的。因為算術運算和邏輯運行要比乘除運算更高效,計算的結果也會更快。

單引號與雙引號的區別

看起來這段代碼會返回」哈哈」,但實際返回的是Ha169。原因就是用了雙引號的時候,字元會被當作字元串處理,而如果是單引號的話,字元值會通過一個叫做基礎類型拓寬的操作來轉換成整型值。然後再將值相加得到169。

一些防止內存泄露的小技巧

內存泄露會導致軟體的性能降級。由於Java的是自動管理內存的,因此開發人員並沒有太多辦法介入。不過還是有一些方法能夠用來防止內存泄露的。

查詢完數據後立即釋放資料庫連接

儘可能使用最後塊

釋放靜態變數中的實例

避免死鎖

死鎖出現的原因有很多。避免死鎖不是一句話就能解決的。通常來說,當某個同步對象在等待另一個同步對象所擁有的資源上的鎖時,便會產生死鎖。

試著運行下下面的程序。它會告訴你什麼是死鎖。這個死鎖是由於兩個線程都在等待對方所擁有的資源,因此會產生死鎖。它們會一直等待,沒有誰會先放手。

public class DeadlockDemo { public static Object addLock = new Object(); public static Object subLock = new Object(); public static void main(String args []){ MyAdditionThread add = new MyAdditionThread(); MySubtractionThread sub = new MySubtractionThread(); add.start(); sub.start(); } private static class MyAdditionThread extends Thread { public void run(){ synchronized(addLock){ int a = 10,b = 3; int c = a + b; System.out.println(「Addition Thread:」+ c); System.out.println(「Holding First Lock ...」); 嘗試 catch(InterruptedException e){} System.out.println(「Addition Thread:Waiting for AddLock ...」); synchronized(subLock){ System.out.println(「Threads:Holding Add and Sub Locks ...」); } } } } private static class MySubtractionThread extends Thread { public void run(){ synchronized(subLock){ int a = 10,b = 3; int c = a - b; System.out.println(「Subtraction Thread:」+ c); System.out.println(「Holding Second Lock ...」); 嘗試 catch(InterruptedException e){} System.out.println(「Subtraction Thread:Waiting for SubLock ...」); synchronized(addLock){ System.out.println(「Threads:Holding Add and Sub Locks ...」); } } } } }

輸出:

添加線程:13 減法線程:7 握住第一鎖定... 保持第二鎖... 添加線程:等待AddLock ... 減法線程:等待SubLock ...

但如果調用的順序變一下的話,死鎖的問題就解決了。

public class DeadlockSolutionDemo { public static Object addLock = new Object(); public static Object subLock = new Object(); public static void main(String args []){ MyAdditionThread add = new MyAdditionThread(); MySubtractionThread sub = new MySubtractionThread(); add.start(); sub.start(); } private static class MyAdditionThread extends Thread { public void run(){ synchronized(addLock){ int a = 10,b = 3; int c = a + b; System.out.println(「Addition Thread:」+ c); System.out.println(「Holding First Lock ...」); 嘗試 catch(InterruptedException e){} System.out.println(「Addition Thread:Waiting for AddLock ...」); synchronized(subLock){ System.out.println(「Threads:Holding Add and Sub Locks ...」); } } } } 私有靜態類MySubtractionThread擴展Thread { 公共無效的run(){ 同步(addLock){ INT A = 10,B = 3; int c = a - b; System.out.println(「Subtraction Thread:」+ c); System.out.println(「Holding Second Lock ...」); 嘗試 catch(InterruptedException e){} System.out.println(「Subtraction Thread:Waiting for SubLock ...」); synchronized(subLock){ System.out.println(「Threads:Holding Add and Sub Locks ...」); } } } } }

輸出:

添加線程:13 控制第一鎖... 添加線程:等待AddLock ... 線程:保持添加和子鎖定... 減法線程:7 持有第二個鎖... 減法線程:等待SubLock ... 線程:控制添加和子鎖...


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 java學習吧 的精彩文章:

影響Java EE性能的十大問題
新手學習Java需要學習哪些基礎?
java常用基礎面試知識點
web前端 開發學習誤區及正確學方法
Java編程語言 基礎知識的要點

TAG:java學習吧 |

您可能感興趣

Anitama新聲 新手村的大Boss
Opus Magnum新手操作教程
Flatpak 新手指南
TensorFlow手把手教你概率編程:TF Probability內置了開源教材,新手友好
適合新手練手的Python項目-絕對乾貨
新手入門套餐,Shopify建站常見問題解答
新手使用Google SEO前,需了解的六大問題
新手游《Idola Phantasy Star Saga》預約活動開啟
EA收購手游開發商Industrial Toys 開發新手游
新手攻略3分鐘玩轉Hustle Castle
Android Q beta 2 新手勢,新彈窗
Vintage手袋PK全新手袋,你會怎麼選? 【新手袋圖鑑】
主攻 AI 功能?Essential 官方透露正研發另一款新手機
Microsoft Launcher更新:增加新手勢
什麼是pip?Python新手入門指南
新手入門 Powershell滲透利用
Docker、Kubernetes 新手開發「必備指南」
刀塔卡牌Artifact新手指南
Kevin Hart對牌壇新手開設撲克課程
iPhone XS新手機殼Apple Watch新錶帶上架