天天看點

Java基礎學習筆記整理

  1. 程序和線程的差別 程序是系統資源配置設定的最小機關,線程是系統排程和分派的最小機關,一個程序可包括多個線程,一個線程隻能屬于一個程序, 程序是獨享資源,線程間可共享資源和記憶體,程序切換比線程切換開銷大,程序結束時所屬的所有線程均結束,多線程程式設計比多程序複雜度高.
  2. 程序間通信的方式 管道(半雙工,隻能父子程序間),命名管道FIFO,消息隊列,信号量,共享記憶體,socket
  3. 線程間通信的方式高. 全局變量, synchronize前提下使用wait,notfy,notfiAll, lock condition ,locksupport
  4. Equals和==的差別 ==基本類型是比較值,引用類型比較的是記憶體位址值; equals是隻能比較引用類型的記憶體位址值.
  5. 重寫和重載的差別重載是同一類中存在多個同名函數,方法名相同,參數清單不同,和傳回值無關;

    重寫是需要繼承的前提,子類重寫父類的方法,要求傳回類型,方法名和參數清單相同,參數清單的通路修飾符必須大于等于父類的,(父類私有方法不能被重寫).

  6. 重寫equals的注意事項:滿足離散數學的特性:自反,對稱,傳遞,一緻,非空性;需要重新hashcode方法

    不能被重寫的方法:final,static,private

  7. 轉發forward和重定向redirect差別:轉發隻請求一次,redirect請求兩次,轉發在服務端,redirect在服務端,轉發不會改變URL,redirect會改變URL,轉發請求域中的資訊不會丢失,轉發隻能轉發到web項目的其他路徑,redirect可以通路到web項目外其他網址.

    forward使用場景:通路servlet處理業務邏輯,forward到JSP處顯示處理結果

    redirect使用場景,送出表單,成功後redirect到另一個JSp防止表單重複送出.

  8. Java基本資料類型3類共八種,字元類型char,布爾類型Boolean,數值類型byte,short,int,long,浮點數類型float,doubl
  9. Java垃圾回收機制Java虛拟機執行Java程式時,把記憶體劃分為兩種類型,線程共享的方法區和堆,線程私有的虛拟機棧,本地方法棧和程式計數器.堆是存放對象執行個體,是垃圾收集器管理的主要區域,成為GC堆.
  10. 要回收哪些區域2個:方法區和堆需要GC;
  11. 不需要回收的區域3個:程式計數器,JVM棧,本地方法棧,因為他們的生命周期和線程同步,會随着線程銷毀,記憶體自動釋放;
  12. 方法區如何判斷需要回收:廢棄常量和無用類,廢棄常量可通過可達性判斷,類需要滿足1)所有執行個體被回收,2)加載該類的class_loader被回收,3)類的對象沒有在任何地方被引用,無法在任何地方通過反射通路該類的方法.
  13. 常用的垃圾回收算法:标記-清除算法,複制法,标記整理法,分代收集算法(根據對象存活周期不同分為新生代和老生代新生代分為Eden,S0,S1=8:1:1,
  14. 判斷是不是垃圾:引用計數法,可達性算法,
  15. 垃圾回收器: serial GC(收集工作是單線程的,無需維護複雜的資料結構,初始化簡單) ,ParNew GC(多線程),CMSGC基于标記清除算法,盡量減少停頓時間,Parrallel GC吞吐量優先,新生代和老生代GC并行進行,更高效.
  16. GC是什麼時候觸發的由于對象進行了分代處理,是以垃圾回收區域,時間不一樣,兩種類型,Mintor Gc,Full Gc ;

    Mintor GC,新對象生成且在Eden申請空間失敗時觸發Mintor GC,清除非存活對象,并把尚且存活的對象移動到Survivor區.

    Full GC ,需要對整個堆進行回收,JVM調優時很大一部分是對這個進行調優,可能的原因:1)年老代被寫滿,2)持久代被寫滿,3)System.gc()被調用,4)上一次GC之後heap的各域配置設定政策動态變化

  17. JVM檢視GC指令jstat -gc 程序号 5000(每5秒顯示一次)
  18. 建立線程的4種方式1)n繼承Thread對象重寫run方法

    2)實作Runnable 接口重寫run方法

    3)實作Callable接口,使用FutureTask類建立線程

    4)使用線程池建立啟動線程,使用工具類Executor建立線程池

  19. 如何保證多線程并發的安全Synchronized,LOCK可以解決原子性問題

    Synchronized,volatile,LOCK 可以解決可見性問題

    HappensBefore 規則可以解決有序性問題

  20. 線程的生命周期1 初始化,可運作,阻塞,無限時等待,有限時等待,終止/休眠

    線程池是生産者-消費者模式,工具類ThreadPollExecutor ,可以建立定長,可緩存的,單線程的,任務可竊取線程池

    包含5種狀态,running,shutdown,stop,tidying,terminated

    Synchronized隻有一個線程可以獲得鎖,執行代碼,阻塞其他線程,控制等待和喚醒需要結合wait()和notfy() notifyAll() ,

  21. volatile保證了不同線程對共享變量進行操作時的可見性,解決有序性問題

    死鎖由于兩個或多個線程互相持有所需的資源,倒置一直處于等待其他線程釋放資源的狀态,無法繼續執行,一般隻能重新開機

  22. 死鎖發生的條件:互斥,占有且等待,不可搶占,循環等待;
  23. 避免死鎖的方法:一次性申請所有的資源,進一步申請資源時如果申請不到,主動釋放占有的資源,按序申請資源,按序加鎖;
  24. sleep和wait差別sleep是Thread類的靜态本地方法,wait是OBject類成員本地方法,sleep可以在任何地方使用,wait隻能在同步方法或同步代碼塊中使用,sleep會釋放CPU資源,不釋放鎖,wait4會釋放鎖,當調用notify方法采用機會競争擷取對象鎖