Java面試題基礎

Java基礎(不斷更新)

大廠非常重視Java基礎

Java 是值傳遞還是引用傳遞?有引用傳遞嗎?

原文參考:https://juejin.im/post/5bce68226fb9a05ce46a0476

值傳遞和引用傳遞

  • 值傳遞:在方法被調用時,實參通過形參把它的內容副本傳入方法內部,也就是方法內部操作的是實參值的一個拷貝副本,方法內對形參的任何操作不會影響到實參的原始內容。
  • 引用傳遞:在方法調用時,實參的地址通過方法調用傳入形參,形參和實參指向同一個地址,對形參的操作會影響實參的內容。
    在Java中都是值傳遞,不存在引用傳遞,也就是說傳遞的都是一個副本。只不過在傳遞過程中:基本數據類型原始內容和副本都是存儲實際值,並且在不同的棧中,因此形參的操作不會影響原始的內容。
    引用類型,如果形參和實參指向同一個對象地址,形參的操作會影響實參的實際內容;如果形參被改動指向的對象地址,形參的改變不會影響實參的內容。

形參和實參

  • 形參:方法被調用時需要傳遞的參數,它只有在方法被調用時纔有意義,纔會被分配內存。方法執行完成,就會被釋放
  • 實參:方法被調用時傳入的參數,它在方法被調用前已經初始化了。

JVM 內存分配

Java運行過程:通過java編譯器將.Java文件編譯爲.class文件,JVM開闢一片內存空間(數據運行區域),通過類加載器加到書就運行區域來存儲執行期間需要存儲的數據和信息。

JVM 內存劃分:

  • 虛擬機棧:是線程私有的,一個被調用的方法對於一個棧幀,每個棧幀中包含:局部變量表,操作數棧,指向運行時常量池的引用,方法返回地址。
  • 堆:一個JVM只有一個堆,堆是線程共享的。
  • 方法區:是一塊線程內存共享的內存邏輯區域,在JVM中只有一個方法區,是線程共享的,也是線程安全的,方法區存儲的內容包括:類的路徑名,常量池,靜態變量,類型引用等。
  • 本地方法棧:功能和虛擬機棧是基本一致的,並且也是線程私有的,它們的區別在於虛擬機棧是爲執行Java方法服務的,而本地方法棧是爲執行本地方法服務的。
  • 程序計數器:線程私有的。記錄着當前線程所執行的字節碼的行號指示器,在程序運行過程中,字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、異常處理、線程恢復等基礎功能都需要依賴計數器完成。

數據的存儲:

  • 基本數據類型的局部變量(方法體內的定義的變量),變量名和值都直接存儲在棧中,棧中的數據在當前線程下是共享的,基本數據類型的數據本身是不會改變的,當局部變量重新賦值時,並不是在內存中改變值的內容,而是在棧中尋找是否已存在需要賦值的數據,(如不存在重新開闢內存空間存儲新的值),然後將基本數據類型的局部變量的引用指向新的地址。
  • 基本數據類型的成員變量:定義在類體內,變量名和值都存儲在堆中,其生命週期和對象的是一致的。
  • 基本數據類型的靜態變量:靜態變量隨類創建而創建,隨類消失而消失,變量名和值都存放在方法區的常量池內。
  • 引用數據類型的存儲:變量名存在棧中,變量值存放的是對象的地址。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章