Android&java基礎面試題總結(2)

更新日期2019-4-8

volatile關鍵字

volatile:一個線程修改了volatile修飾的變量,其他線程立即可見(可見),volatile修飾的變量在修改之後強制更新到主存,,並讓其他線程的這個變量的緩存無效,使得再次向主存讀取值。

volatile修飾的變量不能保證原子性操作

volatile用於作爲狀態標誌位或單例的雙重檢查這些常用場景。性能優於Synchronized同步。

TCP 三次握手四次揮手(有的面試者低概率會問這個問題)

握手:

  1. 客戶端向服務端發送建立連接請求,
  2. 服務器接收請求,反饋給客戶端
  3. 客戶端收到反饋,建立連接

揮手:

  1. 客戶端向服務器端發送斷開連接的請求
  2. 服務器端收到請求,反饋給客戶端
  3. 客戶端發送斷開連接請求,客戶端自己斷開連接
  4. 服務端收到斷開請求或者長時間沒有搜到請求就斷開

ArrayList,LinkList,Vector區別

  • 都是實現了list接口。
  • ArrayList和Vector區別基於數組,就有查詢優勢,LinkList是鏈表具有刪除優勢。
  • vector是同步的,ArrayList不同步,vector效率低於ArrayList

java內存分配

  • JVM的內存可分爲3個區:堆(heap)、棧(stack)和方法區(method,也叫靜態區)
  • 每個java進程可能包含一個或者多個線程,每一個Java進程對應唯一一個JVM實例,每一個JVM實例唯一對應一個堆,每一個線程有一個自己私有的棧。
  • 進程所創建的所有類的實例(也就是對象)或數組(指的是數組的本身,不是引用)都放在堆中,並由該進程所有的線程共享。
  • 雖然Java中所有對象的存儲空間都是在堆中分配的,但是這個對象的引用卻是在棧中分配,也就是說在建立一個對象時在堆和棧中都分配內存,在堆中分配的內存實際存放這個被創建的對象的本身,而在棧中分配的內存只是存放指向這個堆對象的引用而已。
  • 局部變量 new 出來時,在棧空間和堆空間中分配空間,當局部變量生命週期結束後,棧空間立刻被回收,堆空間區域等待GC回收。

堆區:

  1. 存儲的全部是對象,每個對象都包含一個與之對應的class的信息(class的目的是得到操作指令) ;
  2. jvm只有一個堆區(heap),且被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身和數組本身;

棧區:

  1. 每個線程包含一個棧區,棧中只保存基礎數據類型本身和自定義對象的引用;
  2. 每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問;

方法區(靜態區)

  1. 被所有的線程共享,方法區包含所有的class(class是指類的原始代碼,要創建一個類的對象,首先要把該類的代碼加載到方法區中,並且初始化)和static變量。
  2. 方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變量。

http://www.importnew.com/18548.html

類加載的三種方式

類加載機制

類生命週期

加載(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸載(Unloading)

加載

在加載階段(可以參考java.lang.ClassLoader的loadClass()方法),虛擬機需要完成以下3件事情:

  1. 通過一個類的全限定名來獲取定義此類的二進制字節流(並沒有指明要從一個Class文件中獲取,可以從其他渠道,譬如:網絡、動態生成、數據庫等);
  2. 將這個字節流所代表的靜態存儲結構轉化爲方法區的運行時數據結構;
  3. 在內存中生成一個代表這個類的java.lang.Class對象,作爲方法區這個類的各種數據的訪問入口;

加載階段和連接階段(Linking)的部分內容(如一部分字節碼文件格式驗證動作)是交叉進行的,加載階段尚未完成,連接階段可能已經開始,但這些夾在加載階段之中進行的動作,仍然屬於連接階段的內容,這兩個階段的開始時間仍然保持着固定的先後順序。

驗證

驗證是連接階段的第一步,這一階段的目的是爲了確保Class文件的字節流中包含的信息符合當前虛擬機的要求,並且不會危害虛擬機自身的安全。

類加載週期

加載(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)

對於靜態字段,只有直接定義這個字段的類纔會被初始化

Java中的常量池,實際上分爲兩種形態:靜態常量池和運行時常量池。

靜態常量池,運行時常量池

  1. 所謂靜態常量池,即*.class文件中的常量池,class文件中的常量池不僅僅包含字符串(數字)字面量,還包含類、方法的信息,佔用class文件絕大部分空間。這種常量池主要用於存放兩大類常量:字面量(Literal)和符號引用量(Symbolic References),字面量相當於Java語言層面常量的概念,如文本字符串,聲明爲final的常量值等,符號引用則屬於編譯原理方面的概念,包括瞭如下三種類型的常量:

    • 類和接口的全限定名
    • 字段名稱和描述符
    • 方法名稱和描述符
  2. 而運行時常量池,則是jvm虛擬機在完成類裝載操作後,將class文件中的常量池載入到內存中,並保存在方法區中,我們常說的常量池,就是指方法區中的運行時常量池。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章