面試 Java 基礎八股文十問十答 第一期

作者:程序員小白條,個人博客

從今天開始,將會更新我自己收集和總結的八股文。有需要面試的小夥伴可以收藏一下這個系列,一定會有所幫助!

⭐點贊⭐收藏⭐不迷路!⭐

內容概覽:

面試 Java 基礎八股文十問十答 第一期_八股

1.JDK和JRE有什麼區別?

答:

  • 首先要了解中文名稱
  • JDK(Java Development Kit) Java開發工具包
  • JRE (Java Runtime Environment) Java運行環境
  • JVM (Java virtual machine) Java虛擬機

JDK = JRE +Java開發工具(比如你用的Javac.exe 編譯源碼 轉化成字節碼)

JRE = JVM + Java的核心類庫(比如awt javaFx(界面) )

2.Java的重要特點説幾個

答:

  • 面向對象(OOP)
  • 健壯、強類型機制(Java靜態語言,像JS,PHP,Python動態語言,不用指明類型,聲明的時候簡單,但優點也是缺點,所以JS->TS,用泛型會更加安全,在多態的向上傳型和向下轉型的過程中也會減少類型轉化次數)、異常處理機制(try catch finally(可以省略),注意trc catch 塊中有return 阻擋不了fianlly執行)、垃圾自動收集(system,gc(),弱引用,軟引用,強引用,虛引用之類的問題)
  • 跨平台性(指的是編譯後的字節碼文件是跨平台性的,比如windows->Linux OR mac) 因為操作系統(OS)是在硬件上的第一層軟件
  • 解釋性語言,編譯性語言比如:c/c++,解釋性語言JS,PHP,Java,解釋性語言編譯後不能直接被機器執行,需要一個環境(解釋器JVM),Java既可以説是解釋性又可以説是編譯性,解釋性主要是跨平台性,編譯性主要是Java代碼需要編譯才能運行,主流説法還是解釋性語言。

3.Java的基本數據類型有哪些?

  • byte、short、char、int、long、float、double、boolean

補充:類,接口類,數組,枚舉.註解,字符串都屬於引用類型

  • 存儲位置的區別:
  • 如果在方法中定義的基本數據類型,是在棧中存放,因為都聽説過方法棧,在方法中定義的引用類型,它的內存地址值放在棧中,而該變量所指向的對象放在堆中,感覺和string為什麼是不可變的差不多,底層維護的private final char value[] 單個字符內容可變,但是數組的引用地址不可變。
  • 如果是全局變量,那麼不管是引用類型還是基本數據類型都放在堆中

4.==和equals的區別是什麼?

  • == 可以判斷基本數據類型和引用類型
  • == 判斷基本數據類型,比較的是值是否相等
  • == 判斷引用類型,比較的地址是否相等
  • equals是Object類中的方法,Object類還有clone()克隆,創建對象的一種方式,toString()全類名+@+哈希值的十六進制,notify()隨機喚醒線程配置synchornized使用,wait()線程等待,釋放當前鎖,hashCode(),getClass()等等。equals只能用於比較引用類型
  • 當你想比較兩個對象中的內容是否相等,記得重寫equals,不然判斷的是兩個的地址,肯定不同,判斷的是對象的內容

5.final在Java中有什麼引用?

  • 修飾基本數據類型,表示常量,比如CACHE_SIZE = 10
  • 修飾引用數據類型,比如對象,數組,則該對象,數組本身內容可以修改,但地址的引用不能改變
  • 修飾全局變量時必須在定義時,賦初值,當然賦初值有很多位置,比如:定義時候、構造器(構造函數)、代碼塊,當然final+static 一起的話,構造器就不能進行賦初值了,靜態的類加載相關的,構造器是對象實例哦,跟this,super差不多
  • 修飾方法,表示不被重寫,當然重寫肯定是父類和子類,也不必多説,重載是一個類中
  • 修飾類,表示不可繼承類,比如String
  • 別把fianl修飾類,和實例化掛鈎,final只是不能繼承,不是抽象類的概念哦
  • 已經是final類,就沒有必要用fianl修飾方法,因為方法重寫是在繼承的基礎只上的
  • final+static 效率更高,可以從接口那塊看出來,默認常量,public static fianl 編譯器底層做了優化

6.Math.round、Math.ceil、Math.floor用法

  • round可以用+0.5,然後向下取整(小於等於)
  • 比如Math.round(-11.3) = -11,Math.round(-11.8)= -12
  • floor:向下取整 Math.floor(11.3) = 11;Math.floor(-11.3) = -12;
  • ceil: 向上取整 Math.ceil(11.3) = 12; Math.ceil(-11.3) = 11;
  • ceil是天花板的意思,floor是地板,應該很容易記憶

7.String兩種創建對象的區別

  • 方法一: 直接賦值: String s = "xiaobaitiao"
  • 方法二:調用構造器: String s2 = new String ("xiaobaitiao")
  • 方法一過程; 先從常量池查看是否有"xiaobaitiao",如果有,直接指向,如果沒有,重新創建,然後指向,S最終指向的是常量池的空間地址 創建0或1個對象
  • 方法二過程: 先在堆中創建空間,裏面維護了一個value屬性,指向常量池的xiaobaitiao空間,如果常量池沒有"xiaobaitiao",重新創建,如果有,通過value指向,S2最終指向的是堆中的空間地址 創建1或2個對象
  • 補充: intern()方法,會查看常量池是否包含此字符串用equals方法確定,返回的是常量池的地址對象

8.抽象類和普通類的區別在哪裏?

  • 抽象類不能被實例化
  • 抽象類可以(可以沒有)有抽象方法,沒有方法體
  • 有抽象方法,一定是抽象類
  • abstract只能修飾類和方法
  • 抽象類的子類必須實現抽象類中的所有抽象方法,除非子類也是抽象類
  • 抽象方法不能使用private,final和靜態來修飾,因為與重寫相違背

9.接口和抽象類有什麼區別和聯繫?

  • 聯繫
  • 接口和抽象類都不能被實例化
  • 接口和抽象類都闊以包含抽象方法
  • 區別
  • 接口是可以被一個類實現多個,而抽象類因為Java是單繼承機制,只能直接繼承一個
  • 抽象類可以定義普通成員變量和靜態常量,接口中只能定義靜態常量,不能定義普通成員變量
  • 抽象類,説到底還是一個類,可以與構造器完成初始化操作,接口不能包含構造器
  • JDK1.8接口中可以有方法體,因為添加了靜態方法和默認方法,JDK1.9添加私有方法

10.BIO、NIO、AIO有什麼區別?

  • BIO是同步阻塞的 (JDK1.4之前)
  • NIO同步非阻塞 (JDK1.4)
  • AIO異步非阻塞 (JDK1.7)
  • 異步和同步的區別:在於調用者,如果是同步,調用者調用接口,需要等到接口返回數據,才做其他工作,如果是異步,調用者調用接口後,直接做其他工作,不用等待接口返回數據。
  • 阻塞和非阻塞區別:在於被調用者,如果是阻塞:被調用者做完調用者給的任務後給出反饋,這是阻塞,如果是非阻塞,被調用者直接給出反饋,然後再幹活,這是非阻塞。