1. 程式人生 > >閱讀筆記:基礎知識(Java篇)

閱讀筆記:基礎知識(Java篇)

1. GC機制(垃圾回收機制)

  • 找到垃圾的方法:引用計數法、可達性分析法

  • 回收垃圾的方法:標記清除演算法、複製演算法、標記整理法、分代演算法

2. JVM記憶體劃分

  • 執行緒私有:程式計數器、JVM虛擬機器棧、本地方法棧
  • 執行緒公有:堆、方法區、執行時常量池

3. 會發生OOM的區域

  • 堆:記憶體洩漏
  • JVM虛擬機器棧和本地方法棧:遞迴迴圈
  • 方法區:早期類載入過多會OOM,現在一般不會

4. 類載入過程

1.載入:將位元組碼資料從不同的資料來源讀取到JVM記憶體,並對映為JVM認可的資料結構

2.連結:

    1. 驗證:校驗位元組資訊是否符合規範,避免惡意資訊和不規範資料危害JVM執行安全
    2. 準備:建立靜態變數,併為靜態變數開闢記憶體空間
    3. 解析:將符號引用替換為直接引用

3.初始化:為靜態變數賦值,並執行靜態程式碼塊中的邏輯

5. 雙親委派模型

1.類載入器分類

    • 啟動類載入器:主要載入jre/lib下的jar檔案
    • 擴充套件類載入器:主要載入jre/lib/ext下的jar檔案
    • 應用程式類載入器:主要載入classpath下的檔案

2.雙親委派模型:當載入一個類時,優先使用父類載入器載入,當父類載入器無法載入時才使用子類載入器去載入

6. HashMap的原理

  • 可以看作是陣列+連結串列的組合。陣列被分為一個個的桶。雜湊值決定了鍵值對在陣列中的定址。具有相同雜湊值的鍵值對會組成連結串列(避免雜湊衝突)。當連結串列長度超過閾值(預設是8)的時候會觸發樹化,連結串列會變成樹形結構。

7. HashMap需要關注的4個方法

1.hash方法

    • 將key的hashCode值的高位資料移位到低位進行異或運算。這麼做的原因是有些key的hashCode值的差異集中在高位,而雜湊定址是忽略容量以上高位的,這種做法可以有效避免雜湊衝突

2.put方法(步驟)

    1. 通過hash方法獲取hash值,根據hash值定址
    2. 如果未發生碰撞,直接放到桶中
    3. 如果發生碰撞,則以連結串列形式放在桶後
    4. 當連結串列長度大於閾值後會觸發樹化,將連結串列轉換為紅黑樹
    5. 如果陣列長度達到閾值,會呼叫resize方法擴容

3.get方法(步驟)

    1. 通過hash方法獲取hash值,根據hash值定址
    2. 如果與定址到桶的key相同,直接返回對應的value
    3. 如果發生衝突,分兩種情況。如果是樹,則呼叫getTreeNode獲取value;如果是連結串列,則迴圈遍歷查詢對應的value

4.resize方法(步驟)

    1. 將原陣列擴充套件為原來的2倍
    2. 重新計算index索引值,將原節點重新放到新的陣列中。這一步可以將原先衝突的節點分散到新的桶中 

8. sleep和wait的區別

  • sleep方法是Thread類中的靜態方法,wait是Object類中的方法
  • sleep並不會釋放同步鎖,而wait會釋放同步鎖
  • sleep可以在任何地方使用,而wait方法只能在同步方法或者同步方法塊中使用
  • sleep中必須傳入時間,而wait可以傳也可以不傳,不傳時間的話只有notify或者notifyAll才能喚醒,傳時間的話在時間之後會自動喚醒

9. final、finally、finalize的區別

  • final可以修飾類、變數和方法。修飾類代表這個類不可被繼承,修飾變數代表此變數不可被改變,修飾方法表示此方法不可被重寫(override)
  • finally是保證重點程式碼一定會執行的一種機制。通常是使用try-finally或者try-catch-finally來進行檔案流的關閉等操作
  • finalize是Object類中的一個方法。它的設計目的是保證物件在垃圾回收前完成特定資源的回收。finalize機制已不推薦使用,並且在JDK9已經被標記為deprecated

10. 常見的單例模式

  • 餓漢式、雙重判斷的懶漢式、靜態內部類實現的單例(最推薦的方式)、列舉實現的單例

單例物件例項需要有volatile修飾,是因為:mInstance = new SingleTon()包含三個操作(給mInstance分配記憶體,呼叫SingleTon的構造方法初始化成員變數,將mInstance指向分配的記憶體空間),又由於JVM會發生指令重排,所以可能呼叫順序會發生錯誤。這樣會導致報錯。而volatile的作用有保持可見性和禁止指令重排

11. java中引用型別的區別

  • 強引用:指的是通過new物件建立的引用,垃圾回收器即使在記憶體不足的情況下也不會回收具有強引用的物件
  • 軟引用:是通過SoftRefrence實現的,在記憶體不足之前會被垃圾回收器回收。可用於儲存一些記憶體敏感的快取
  • 弱引用:是通過WeakRefrence實現的,垃圾回收器只要掃描到就會將其回收。可用於儲存一些記憶體敏感的快取
  • 虛引用:是通過FanttomRefrence實現的,隨時有可能被回收。可用於跟蹤物件被垃圾回收的活動,當一個虛引用關聯的物件被GC回收之前會受到一條系統通知

12. volatile的原理是在生成的彙編程式碼中多了一個lock字首指令,這個字首指令相當於一個記憶體屏障,這個屏障有三個作用

  1. 確保指令重排的時候不會把屏障後的指令排在屏障前,確保不會把屏障前的指令排在屏障後
  2. 修改快取中的共享變數後立即重新整理到主存中
  3. 當執行寫操作時會導致其他CPU中的快取無效

13. http與https的區別

  • https需要CA證書,很少免費,需要一定費用
  • http是明文傳輸,安全性低;而https是http的基礎上通過ssl加密,安全性高
  • 預設埠不同。http是80,https是443

14. https的加密演算法

  • 稱加密:加密和解密用的都是相同的祕鑰,優點是速度快,缺點是安全性低。常見的演算法有DES、AES等等
  • 非對稱加密:非對稱加密有一個金鑰對,分為公鑰和私鑰。一般來說,私鑰自己持有,公鑰可以公開給對方,優點是安全性比對稱加密高,缺點是資料傳輸效率比對稱加密低。採用公鑰加密的資訊只有對應的私鑰可以解密。常見的演算法有RSA等

正式場景中一般都是採用對稱加密和非對稱加密結合的方式,使用非對稱加密來完成祕鑰的傳遞,然後使用對稱加密實現資料的傳遞。這樣保證了安全性又提高了傳輸效率

大家如果有什麼疑問或者建議可以通過評論或者郵件的方式聯絡我,歡迎大家的評論~