1、Primitive vs Reference variable
primitive變量有默認值
primitive變量存儲值,reference變量存儲對象在heap中的handle
primitive變量賦值是值的拷貝(互不影響),reference變量賦值是handle的拷貝(操作會(huì )影響另一方)
primitive變量使用==比較,reference變量使用equals()比較
primitive變量作為參數傳遞的是值,reference變量作為參數傳遞的是handle的拷貝
primitive變量參數的值在方法內被修改不影響原有值,reference變量參數修改handle不影響原有值但使用handle可以修改內部的值
primitive變量作為方法的返回值時(shí)返回的是值,返回reference變量時(shí)返回的是handle可以繼續在方法外使用
primitive變量存儲在stack,reference變量存儲在heap
2、Static vs Non Static class
類(lèi)分為頂級類(lèi)和嵌套內部類(lèi)(還有特殊的匿名類(lèi))
頂級類(lèi)不能被定義為static,嵌套內部類(lèi)可以選擇是否為static
嵌套內部類(lèi)如果是static的話(huà)一般叫嵌套類(lèi),非static的叫內部類(lèi)
嵌套類(lèi)和內部類(lèi)的創(chuàng )建方法不同:
Outer.Nested nested = new Outer.Nested();
Outer.Inner inner = new Outer().new Inner();
嵌套類(lèi)可以被看做外部類(lèi)的一個(gè)靜態(tài)成員,可以在static方法中被使用
嵌套類(lèi)不可以訪(fǎng)問(wèn)外部類(lèi)的非static成員,內部類(lèi)可以
3、Interface vs Abstract Class
抽象類(lèi)只能extend一個(gè),接口可以implement多個(gè)
抽象類(lèi)中可以定義非抽象方法,接口中不能定義非抽象方法(JDK8默認方法除外)
抽象類(lèi)中即使沒(méi)有抽象方法也可以標記為abstract
抽象類(lèi)可以添加方法不影響子類(lèi),接口中添加方法需要修改所以它的實(shí)現類(lèi)
抽象類(lèi)適合代碼重用,接口適合類(lèi)型同一
接口沒(méi)有方法實(shí)現更易于解耦
接口可以實(shí)現依賴(lài)注入
接口里的變量默認是public final
接口不可實(shí)例化,抽象類(lèi)不可實(shí)例化但可以invoked
4、Error vs Exception
常見(jiàn)Error:OutOfMemoryError
Error不需要try-catch即使catch了也無(wú)法解決,Exception異常catch后可做后續處理
RuntimeException表示的是程序代碼的錯誤,Erro多為系統環(huán)境上致命錯誤
5、ArrayList vs LinkedList
ArrayList后臺通過(guò)數組實(shí)現,LinkedList通過(guò)鏈表實(shí)現(嵌套類(lèi)存儲前后節點(diǎn))
LinkedList不只是實(shí)現了List還實(shí)現了Deque(FIFO)。add(),poll()
添加元素:ArrayList-O(1) LinkedList-O(1)
刪除元素:ArrayList-O(n) LinkedList-O(n/2)
獲取元素:ArrayList-O(1) LinkedList-O(n/2)