12萬字的java面試題及答案整理(2024新版)

码路编程發表於2024-10-24

前言

本來想著給自己放鬆一下,刷刷部落格,慕然回首,final有哪些用法?static都有哪些用法?java的精度演算法?java運算邏輯?異常處理?似乎有點模糊了,那就大概看一下Java基礎面試題吧。好記性不如爛鍵盤

*** 12萬字的java面試題整理 ***

final有哪些用法?

final也是很多面試喜歡問的地方,但我覺得這個問題很無聊
通常能回答下以下5點就不錯了:

  1. 被final修飾的類不可以被繼承
  2. 被final修飾的方法不可以被重寫
  3. 被final修飾的變數不可以被改變.如果修飾引用,那麼表示引用不可變,引用指向的內容可變.
  4. 被final修飾的方法,JVM會嘗試將其內聯,以提高執行效率
  5. 被final修飾的常量,在編譯階段會存入常量池中.

除此之外,編譯器對final域要遵守的兩個重排序規則更好:

  • 在建構函式內對一個final域的寫入,與隨後把這個被構造物件的引用賦值給一個引用變數,這兩個操作
    之間不能重排序 初次讀一個包含final域的物件的引用,與隨後初次讀這個final域,這兩個操作之間不能重排序.
final int y;
A() {
    y = 1; // 寫入final域
    // 建構函式中的其他程式碼...
}

A a = new A(); // 將物件引用賦值給a

在A物件的建構函式中,對y的賦值操作必須在new A()表示式的結果被賦給a之前發生。編譯器或處理器不能對這兩個操作進行重排序,以確保當透過a訪問y時,看到的是已經初始化好的值。(具體可以瞭解java編譯時重排序)

static都有哪些用法?

所有的人都知道static關鍵字這兩個基本的用法:靜態變數和靜態方法.也就是被static所修飾的變數/方法都屬於類的靜態資源,類例項所共享.
除了靜態變數和靜態方法之外,static也用於靜態塊,多用於初始化操作:

public calss PreCache{
  static{
    //執行相關操作
   }
}

外static也多用於修飾內部類,此時稱之為靜態內部類.

最後一種用法就是靜態導包,即 import static
import static是在JDK 1.5之後引入的新特性,可以用來指定匯入某個類中的靜態資源,並且不需要使用類名,可以直接使用資源名,比如:

import static java.lang.Math.*;
public class Test{
  public static void main(String[] args){
    //System.out.println(Math.sin(20));傳統做法
    System.out.println(sin(20));
  }
}

3*0.1 == 0.3返回值是什麼

false,因為有些浮點數不能完全精確的表示出來.

a=a+b與a+=b有什麼區別嗎?

+= 運算子會進行隱式自動型別轉換,此處a+=b隱式的將加操作的結果型別強制轉換為持有結果的型別,而a=a+b則不會自動進行型別轉換.如:

byte a = 127;
byte b = 127;
b = a + b; // 報編譯錯誤:cannot convert from int to byte
b += a;

以下程式碼是否有錯,有的話怎麼改?

short s1= 1;
s1 = s1 + 1;

有錯誤.short型別在進行運算時會自動提升為int型別,也就是說 s1+1 的運算結果是int型別,而s1是short型別,此時編譯器會報錯.

short s1= 1;
s1 += 1;

+=運算子會對右邊的表示式結果強轉匹配左邊的資料型別,所以沒錯.

try catch finally,try裡有return,finally還執行麼?

執行,並且finally的執行早於try裡面的return

結論:
1、不管有木有出現異常,finally塊中程式碼都會執行;
2、當try和catch中有return時,finally仍然會執行;
3、finally是在return後面的表示式運算後執行的(此時並沒有返回運算後的值,而是先把要返回的
值儲存起來,管finally中的程式碼怎麼樣,返回的值都不會改變,任然是之前儲存的值),所以函式
返回值是在finally執行前確定的;
4、finally中最好不要包含return,否則程式會提前退出,返回值不是try或catch中儲存的返回值。

Excption與Error包結構

Java可丟擲(Throwable)的結構分為三種型別:被檢查的異常(CheckedException),執行時異常
(RuntimeException),錯誤(Error)。

1. 執行時異常

定義:RuntimeException及其子類都被稱為執行時異常
特點:Java編譯器不會檢查它。也就是說,當程式中可能出現這類異常時,倘若既沒有透過throws宣告丟擲它",也沒有用try-catch語句捕獲它,還是會編譯透過。
常見的五種執行時異常:
ClassCastException(類轉換異常)
IndexOutOfBoundsException(陣列越界)
NullPointerException(空指標異常)
ArrayStoreException(資料儲存異常,運算元組是型別不一致)
BufferOverflowException

2. 被檢查異常

定義:Exception類本身,以及Exception的子類中除了"執行時異常"之外的其它子類都屬於被檢查異常。
特點 : Java編譯器會檢查它。 此類異常,要麼透過throws進行宣告丟擲,要麼透過try-catch進行捕獲處理,否則不能透過編譯。例如,CloneNotSupportedException就屬於被檢查異常。當透過clone()介面去克隆一個物件,而該物件對應的類沒有實現Cloneable介面,就會丟擲CloneNotSupportedException異常。被檢查異常通常都是可以恢復的。
如:
IOException
FileNotFoundException
SQLException

3. 錯誤

定義 : Error類及其子類。
特點 : 和執行時異常一樣,編譯器也不會對錯誤進行檢查。
當資源不足、約束失敗、或是其它程式無法繼續執行的條件發生時,就產生錯誤。程式本身無法修
復這些錯誤的。例如,VirtualMachineError就屬於錯誤。出現這種錯誤會導致程式終止執行。OutOfMemoryError、ThreadDeath。
Java虛擬機器規範規定JVM的記憶體分為了好幾塊,比如堆,棧,程式計數器,方法區等

相關文章