­

Java開發工程師面試-基礎

JDK、JRE、JVM有什麼區別?

  • JDK:Java Development Kit 針對Java程序員的產品
  • JRE:Java Runtime Environment是運行Java的環境集合
  • JVM:Java虛擬機用於運行Java位元組碼文件,跨平台的核心
    在這裡插入圖片描述

常用數字類型的區別

在這裡插入圖片描述

寫出程序執行結果,並說明原因

在這裡插入圖片描述

  • 打印結果:yes
  • 分析:
    float類型在內存中的存儲形式為科學計算法,表達為4.2123456E7,只保留了小數點後7位。
  • 補充:
  1. 浮點數存儲分為三部分:
    符號位(Sign):0代表正數,1代表負數
    指數位(Exponent):用於存儲科學計數法中的指數部分
    尾數位(Mantissa):用於存儲尾數部分
  2. 單精度是1位符號,8位指數,23位小數
  3. 雙精度是1位符號,11位指數,52位小數

編程題:隨機生成30~100之間的整

在這裡插入圖片描述

面向對象的三大特徵

  • 封裝:將同一類事物的功能包裝在一起,只對外提供訪問接口
       好處:
       1. 實現專業的分工(你是使用者只需要關心怎麼使用就行,無需了解具體實現細節)
       2. 減少代碼耦合(面向接口開發,互不干擾)
       3. 可以自由修改類的內部結構(只要不影響使用者的功能,都可以隨意改造)
  • 繼承:從已有的類派生出新的類,新的類可以有已有類的屬性和行為,並拓展新的功能
  • 多態:
       多態是同一個行為具有多個不同表現形式或形態的能力
       多態是同一個接口,使用不同的實例而執行不同操作

接口和抽象類的異

在這裡插入圖片描述

靜態和實例變量(方法)的區別:

  • 語法區別:靜態變量前要加static關鍵字,實例則不用
  • 隸屬區別:實例變量屬於某個對象的屬性,而靜態屬於類
  • 運行區別:靜態變量在JVM加載類時創建,實例變量在實例化對象時創建
  • 位置區別:靜態變量存放在JVM方法區,無法被回收;實例變量存放在堆中,不用就被回收

父子類實例化過程分析

public class Parent {
   private static String name = initName();
   private int age = initAge();
   private static String initName(){
      System.out.println("1父類靜態變量初始化");
      return "程序員Forlan";
   }
   private int initAge(){
      System.out.println("2父類普通變量初始化");
      return 100;
   }
   static {
      System.out.println("3父類靜態代碼塊");
   }
   {
      System.out.println("4父類非靜態代碼塊");
   }
   public Parent(){
      System.out.println("5父類構造函數");
   }
}
public class Son extends Parent{
   private static String name = initName();
   private int age = initAge();
   private static String initName(){
      System.out.println("6子類靜態變量初始化");
      return "程序員Forlan";
   }
   private int initAge(){
      System.out.println("7子類普通變量初始化");
      return 100;
   }
   static {
      System.out.println("8子類靜態代碼塊");
   }
   {
      System.out.println("9子類非靜態代碼塊");
   }
   public Son(){
      System.out.println("10子類構造函數");
   }
}

public static void main(String[] args) {
   new Son();
}

  • 輸出結果順序為:13682457910
  • 三個原則:
    靜態優先
    父類優先
    非靜態塊優先於構造函數
  • 注意:
    靜態變量和靜態代碼塊,誰寫前面誰先執行
    非靜態變量和非靜態代碼塊,誰寫前面誰先執行

JAVA異常體系

在這裡插入圖片描述在這裡插入圖片描述

String中「==」 和equals程序分析

在這裡插入圖片描述

  • 結果:
    true
    true
    false
    true
    false
  • 分析:
    ==比較的是地址,equals比較的是值
    創建後就不可變(被final修飾),保存在方法區中的常量池
    s2是引用類型,Java編譯器在編譯期間無法確定數值,只有在運行時才能確定具體的值,所以s2+”def”會產生一個新的內存地址,分配給s5
    new String()創建的字符串不保存在常量池

String、StringBuilder、StringBuffer的區別

在這裡插入圖片描述

List和Set的區別

在這裡插入圖片描述

Lsit比較

在這裡插入圖片描述

Set比較

在這裡插入圖片描述

Object類hashCode()和equals()的區別

  • equals()方法用來判斷兩個對象是否相同
  • hashCode()返回一個int,代表該對象的內部地址
    在這裡插入圖片描述

Java IO中有幾種類型的流

在這裡插入圖片描述

JVM的內存組成

在這裡插入圖片描述

  • 共享區:對於所有線程都可以訪問的
  1. 堆:用於保存程序運行時的變量
  2. 方法區:包含靜態內容
  • 私有區:對於線程來說是私有的,其他線程無法直接訪問
  1. 程序計數器:行號計數器,在程序跳轉時,我們要記住跳轉行號是多少,方便程序進行還原
  2. 虛擬機棧:包含方法執行時的狀態,每個方法都會形成一個棧幀
  3. 本地方法棧:用於在調用操作系統級別的底層方法,才會存放方法的棧幀

Java垃圾回收

  • GC(Garbage Collection)用於回收不再使用的內存
  • GC負責3項任務:分配內存、確保引用、回收內存
  • GC回收是依據某個沒有任何引用,則可以被回收
  • 通過有向圖記錄對象,判斷是否可達

垃圾回收(GC)算法

  • 標記-清除算法
  • 複製算法
  • 標記-整理算法
  • 分代收集算法
    詳細可看//www.cnblogs.com/huozhonghun/p/JVM2.html

Java中內存泄露的場景

  • 靜態集合類
  • 各種連接
  • 監聽器
  • 不合理的作用域

對象的淺複製與深複製區別

  • 淺複製:只對對象及變量值進行複製,引用對象地址不變
  • 深複製:不僅對象及變量值進行複製,引用對象也進行複製

感謝耐心觀看!!!
如有不足,歡迎指出,一起成長!
如有幫助,請點贊給予支持,感謝!

Tags: