JAVA 面試的一些總結
自己 java 面試的一些總結
java 基礎
-
== 與 equals 的區別
== 直接比較棧記憶體引用的資料,對於基礎資料型別棧記憶體直接引用的就是值,所以可以直接使用。常量字串由於儲存在字串常量池,所以可以常量字串直接比較也會返回
true
。 equals 定義在 Object物件裡面,Object 原始碼裡面 equals 方法呼叫的就是 ==。所有包裝類都有對 equals 方法的覆蓋。
自己定義的類需要覆蓋equals 方法,必須要覆蓋
hashCode
方法以下內容摘自<> 覆蓋equals時總要覆蓋hashCode,一個很常見的錯誤根源在沒有覆蓋hashCode方法。在每個覆蓋了equals方法的類中,也必須覆蓋hashCode方法。如果不這樣做的話,就會違反Object.hashCode的通用約定,從而導致該類無法結合所有基於雜湊的集合一起正常工作,這樣的集合包括HashMap、HashSet和Hashtable。
同時equals 需要滿足下面幾條定義:
- 自反性。對於任何非null的引用值x,x.equals(x)必須返回true
- 對稱性。對於任何非null的引用值x和y,當且僅當y.equals(x)返回true時,x.equals(y)必須返回true。
- 傳遞性。對於任何非null的引用值x、y和z,如果x.equals(y)返回true,並且y.equals(z)返回true,那麼x.equals(z)則必須返回true。
- 一致性。對於任何非null的引用值x、y,只要equals的比較操作在物件中所用的資訊沒有被修改,多次呼叫x.equals(y)就會一直返回true,或者一致返回false。
- 對於任何非null的引用值x,x.equals(null)必須返回false。
-
說下 String,StringBuffer和StringBuilder
String 為了安全性和效率問題所以設計成了
final
,所以在沒有StringBuffer 和 StringBuilder 的情況下。字串的每次拼接都會生成多個物件還要將字串推到字元常量池。String更多細節點選 為瞭解決字串拼接的效率問題,推出了
StringBuffer
。StringBuffer 是一個執行緒安全類。可能是因為StringBuffer 底層是字元陣列,考慮到陣列擴容的情況會導致髒資料。所以採用執行緒安全的方式。但是StringBuffer 基本沒有用到的場景,在多執行緒還是單執行緒的情況下都是用 StringBuilder
append
等操作是執行緒安全的,多執行緒情況下也保證不了資料的完整性 1.5 之後java 就推出了
StringBuilder
是一個執行緒不安全的類,StringBuilder 和 buffer 的區別就是方法上沒有加synchronized
關鍵字。StringBuilder 出現之後,String str = "Hello," + "World";
這種程式碼編譯的時候都會替換成用StringBuilder拼接。 -
多執行緒
主要說出四個類:Runnable(1.8 之後是變成函式式介面了),Thread,Callable(1.8 之後是變成函式式介面了),FutureTask
-
Runnable
:只是一個標識性的介面,裡面有個run
方法 -
Thread
:建構函式負責接收Runnable
的,start()
方法通過JNI
呼叫不同系統的底層生成一個執行緒,並讓執行緒處於就緒狀態。由CPU
執行緒的什麼時候執行什麼時候切換。 -
Callable
:和 Runnable 差不多的一個介面,只是帶有返回值。 -
FutureTask
:間接繼承 Runnable,兩個建構函式,一個可以接收 Runnable和一個固定值,一個接收Callable。執行也是傳遞給Thread 然後執行start 方法。FutureTask 還有一些API 方法可自行查閱。
-
-
執行緒池
手動寫執行緒會造成浪費,所以實際程式設計中我們都是使用執行緒池來操作執行緒。
用
ExecutorService
來接收Executors
執行緒工廠裡面的不同執行緒池策略,執行緒池裡面又包含很多引數可以設定。詳情參閱這裡 Spring 框架還有對執行緒池的進一步的封裝。
-
IO
IO 主要分類兩大類:
位元組流
(對 byte 進行操作)和字元流
(對 char 進行操作)。兩者的根本區別在於字元流
有個緩衝區對位元組進行處理。 常用的有:
buffer:使用了快取區操作,提高效率
Piped:管道流,多執行緒的情況下使用的
IO 牽扯的東西太多了,能力有限不多寫了,除去傳統的
BIO
還有NIO
和AIO
。具體的大家多看看別人具體對IO 寫的文章吧
Spring 框架系列
-
Spring 的IOC
Spring 實現IOC 的方式是通過DI(依賴注入),通過配置的方式將bean 儲存到Spring 的容器(BeanFactory)。當我們需要某個類的時候都是通過Spring 去獲取。
-
Spring 的AOP
AOP 是通過動態代理來實現的,Spring 有兩種動態代理的方式(JDK自帶的和CGLIB),動態代理主要應用到了反射機制。主要應用在日誌和事務上面。
-
SpringMVC
MQ 和Redis
掘金裡面已經有很多對redis
寫的很好的文章了。
MQ 推薦這一篇:90%的Java程式設計師,都扛不住這波訊息中介軟體的面試四連炮!
還有很多內容沒有寫到,首先因為自己也沒有理解透徹,再次已經有了很好的文章了就不在這裡東施效顰了