硬核!20 道經典 Java 基礎面試題

前言

大家好,我是陌溪

最近整理了 20 道 Java 基礎面試題,大家一起加油哈

1. ArrayList 和 LinkedList 有什麼區別?

可以從它們的底層數據結構、效率、開銷進行闡述哈

2. final, finally, finalize 的區別

3. 重寫和重載的區別

4. Java 8 的接口新增了哪些特性?

JDK8 的新特性

5. 兩個對象的 hashCode() 相同,則 equals() 是否也一定爲 true?

兩個對象 equals 相等,則它們的 hashcode 必須相等,如果兩個對象的 hashCode() 相同,則 equals() 不一定爲 true。

hashCode 的常規協定:

在 Java 應用程序執行期間,在對同一對象多次調用 hashCode 方法時,必須一致地返回相同的整數,前提是將對象進行 equals 比較時所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。

兩個對象的 equals() 相等,那麼對這兩個對象中的每個對象調用 hashCode 方法都必須生成相同的整數結果。

兩個對象的 equals() 不相等,那麼對這兩個對象中的任一對象上調用 hashCode 方法不要求一定生成不同的整數結果。但是,爲不相等的對象生成不同整數結果可以提高哈希表的性能。

6. 抽象類和接口有什麼區別

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

BIO 是同步並阻塞的,NIO 是同步非阻塞,AIO 是異步非阻塞。

  • BIO:線程發起 IO 請求,不管內核是否準備好 IO 操作,從發起請求起,線程一直阻塞,直到操作完成。

  • NIO:線程發起 IO 請求,立即返回;內核在做好 IO 操作的準備之後,通過調用註冊的回調函數通知線程做 IO 操作,線程開始阻塞,直到操作完成。

  • AIO:線程發起 IO 請求,立即返回;內存做好 IO 操作的準備之後,做 IO 操作,直到操作完成或者失敗,通過調用註冊的回調函數通知線程做 IO 操作完成或者失敗。

BIO 是一個連接一個線程。,NIO 是一個請求一個線程。,AIO 是一個有效請求一個線程。

  • BIO:同步並阻塞,服務器實現模式爲一個連接一個線程,即客戶端有連接請求時服務器端就需要啓動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。

  • NIO:同步非阻塞,服務器實現模式爲一個請求一個線程,即客戶端發送的連接請求都會註冊到多路複用器上,多路複用器輪詢到連接有 I/O 請求時才啓動一個線程進行處理。

  • AIO:異步非阻塞,服務器實現模式爲一個有效請求一個線程,客戶端的 IO 請求都是由 OS 先完成了再通知服務器應用去啓動線程進行處理。

8. String,Stringbuffer,StringBuilder 的區別

String:

StringBuffer:

StringBuilder:

9. 靜態代理和動態代理的區別

靜態代理中代理類在編譯期就已經確定,而動態代理則是 JVM 運行時動態生成,靜態代理的效 率相對動態代理來說相對高一些,但是靜態代理代碼冗餘大,一單需要修改接口,代理類和委 託類都需要修改。

10. JAVA 中的幾種基本數據類型是什麼,各自佔用多少字節呢

J2bQjE

對於 boolean,官方文檔未明確定義,它依賴於 JVM 廠商的具體實現。邏輯上理解是佔用 1 位,但是實際中會考慮計算機高效存儲因素

感興趣的小夥伴,可以去看官網

11. Comparator 與 Comparable 有什麼區別?

12. JDK 動態代理和 CGLIB 動態代理的區別

13. String 類能被繼承嗎,爲什麼。

首先,String 是一個 final 修飾的類,final 修飾的類不可以被繼承。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

String 類爲什麼不能被繼承呢?

有兩個原因:

14. 說說 Java 中多態的實現原理

舉個例子吧,假設有個 Fruit 父類,一個 taste 味道方法,兩個子類 Apple 和 Pear,如下:

abstract class Fruit {
    abstract String taste() ;
}

class Apple extends Fruit {
    @Override
    String taste() {
        return "酸酸的";
    }
}

class Pear extends Fruit {
    @Override
    String taste() {
        return "甜甜的";
    }
}
public class Test {
    public static void main(String[] args) {
        Fruit f = new Apple();
        System.out.println(f.taste());
    }
}

程序運行,當調用對象 Fruit f 的方法 taste 時,JVM 查找 Fruit 對象類的方法表以確定 taste 方法的直接引用地址,到底來自 Apple 還是 Pear,確定後才真正調用對應子類的 taste 方法,

15. 說下面向對象四大特性

封裝、繼承、多態、抽象。

16. int 和 Integer 有什麼區別,還有 Integer 緩存的實現

這裏考察 3 個知識點吧:

看個 Integer 的緩存的例子,加深一下印象哈:

Integer a = 10;
Integer b = 10;

Integer c = 129;
Integer d = 129;
System.out.println(a == b);
System.out.println(c == d);
輸出結果
true
false

17. 說說反射的用途及實現原理,Java 獲取反射的三種方法

這道面試題,看我這篇文章哈:談談 Java 反射:從入門到實踐,再到原理

Java 獲取反射的三種方法

18. & 和 && 的區別

19. Java 中 IO 流分爲幾種?

20.Java 有哪些數據類型

定義:Java 語言是強類型語言,對於每一種數據都定義了明確的具體的數據類型,在內存中分 配了不同大小的內存空間。

基本數據類型

引用數據類型

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/yCsAPhPsc5Cn8yJF7CoGGw