2020整年java面試題總結,包含BATJ一線大廠1200多道面試題含答案解析!

前言

2020年一半兒快要過去了,總結了上半年各種Java面試題,初中級和中高級都有,包括Java OOP面試題、Java集合/泛型面試題、Java異常面試題、Java種的IO與NIO面試題、Java反射面試題、Java序列化面試題、Java註解面試題、多線程與併發面試題、JVM面試題、MySQL面試題、Redis面試題、Memcached面試題、MongoDB面試題、String面試題、Spring Boot面試題、Spring Cloud面試題、RabbitMQ面試題、Dubbo 面試題、MyBatis 面試題、ZooKeeper 面試題、數據結構面試題、算法面試題、Elasticsearch 面試題、Kafka 面試題、微服務面試題、Linux面試題。java

Java OOP面試題108道

一、什麼是B/S架構?什麼是C/S架構mysql

(1)B/S(Browser/Server),瀏覽器/服務器程序程序員

(2)C/S(Client/Server),客戶端/服務端,桌面應用程序web

二、Java都有哪些開發平臺?面試

(1) JAVA SE:主要用在客戶端開發算法

(2)JAVA EE:主要用在web應用程序開發spring

(3)JAVA ME:主要用在嵌入式應用程序開發sql

三、什麼是JDK?什麼是JRE?mongodb

(1)JDK:java development kit:java開發工具包,是開發人員所須要安裝的環境數據庫

(2)JRE:java runtime environment:java運行環境,java程序運行所須要安裝的環境

四、Java語言有哪些特色

(1) 簡單易學、有豐富的類庫

(2) 面向對象(Java最重要的特性,讓程序耦合度更低,內聚性更高)

(3)與平臺無關性(JVM是Java跨平臺使用的根本)

(4) 可靠安全

(5)支持多線程

Java集合/泛型面試題24道

ArrayList和linkedList的區別

Array(數組)是基於索引(index)的數據結構,它使用索引在數組中搜索和讀取數據是很快的。

Array獲取數據的時間複雜度是O(1),可是要刪除數據倒是開銷很大,由於這須要重排數組中的全部數據,(由於刪除數據之後, 須要把後面全部的數據前移)

缺點: 數組初始化必須指定初始化的長度, 不然報錯

例如:

int[] a = new int[4];//推薦使用int[] 這種方式初始化int c[] = {23,43,56,78};//長度:4,索引範圍:[0,3]

List—是一個有序的集合,能夠包含重複的元素,提供了按索引訪問的方式,它繼承Collection。

List有兩個重要的實現類:ArrayList和LinkedList

ArrayList: 能夠看做是可以自動增加容量的數組

ArrayList的toArray方法返回一個數組

ArrayList的asList方法返回一個列表

ArrayList底層的實現是Array, 數組擴容實現

LinkList是一個雙鏈表,在添加和刪除元素時具備比ArrayList更好的性能.但在get與set方面弱於

ArrayList.固然,這些對比都是指數據量很大或者操做很頻繁。

Java異常面試題8道

一、Java中異常分爲哪兩種?

二、異常的處理機制有幾種?

三、如何自定義一個異常

四、try catch fifinally,try裏有return,finally還執行麼?

五、 Excption與Error包結構

六、Thow與thorws區別

七、Error與Exception區別?

八、error和exception有什麼區別

Java中的IO與NIO面試題15道

一、Java 中 IO 流?

二、 Java IO與 NIO的區別

三、經常使用io類有哪些

四、字節流與字符流的區別

五、阻塞 IO 模型

六、非阻塞 IO 模型

七、多路複用 IO 模型

八、信號驅動 IO 模型

九、異步 IO 模型

十、JAVA NIO

十一、NIO 的緩衝區

十二、NIO 的非阻塞

1三、Channel

1四、Buffer

1五、Selector

Java反射面試題11道

一、除了使用new建立對象以外,還能夠用什麼方法建立對象?

二、Java反射建立對象效率高仍是經過new建立對象的效率高?

三、java反射的做用

四、哪裏會用到反射機制?

五、反射的實現方式:

六、實現Java反射的類:

七、反射機制的優缺點:

八、Java 反射 API

九、反射使用步驟(獲取 Class 對象、調用對象方法)

十、獲取 Class 對象有幾種方法

十一、利用反射動態建立對象實例

Java序列化面試題10道

一、什麼是java序列化,如何實現java序列化?

二、保存(持久化)對象及其狀態到內存或者磁盤

三、序列化對象以字節數組保持-靜態成員不保存

四、序列化用戶遠程對象傳輸

五、Serializable 實現序列化

六、writeObject 和 readObject 自定義序列化策略

七、序列化 ID

八、序列化並不保存靜態變量

九、Transient 關鍵字阻止該變量被序列化到文件中

十、序列化(深 clone 一中實現)

Java註解面試題2道

一、4種標準元註解是哪四種?

二、註解是什麼?

多線程與併發面試題108道

一、Java中實現多線程有幾種方法

繼承Thread類;

實現Runnable接口;

實現Callable接口經過FutureTask包裝器來建立Thread線程;

使用ExecutorService、Callable、Future實現有返回結果的多線程(也就是使用了ExecutorService來管理前面的三種方式)。

二、繼承 Thread 類

Thread 類本質上是實現了 Runnable 接口的一個實例,表明一個線程的實例。 啓動線程的惟一方法就是經過 Thread 類的 start()實例方法。 start()方法是一個 native 方法,它將啓動一個新線程,並執行 run()方法。

public class MyThread extends Thread {public void run() {System.out.println("MyThread.run()");}}MyThread myThread1 = new MyThread();myThread1.start();

三、實現 Runnable 接口。

若是本身的類已經 extends 另外一個類,就沒法直接 extends Thread,此時,能夠實現一個Runnable 接口。

public class MyThread extends OtherClass implements Runnable {public void run() {System.out.println("MyThread.run()");}} //啓動 MyThread,須要首先實例化一個 Thread,並傳入本身的 MyThread 實例:MyThread myThread = new MyThread();Thread thread = new Thread(myThread);thread.start();//事實上,當傳入一個 Runnable target 參數給 Thread 後, Thread 的 run()方法就會調用target.run()public void run() {if (target != null) {target.run();}}

JVM面試題87道

一、java中會存在內存泄漏嗎,請簡單描述。

會。本身實現堆載的數據結構時有可能會出現內存泄露,可參看effective java.

二、64 位 JVM 中,int 的長度是多數?

Java 中,int 類型變量的長度是一個固定值,與平臺無關,都是 32 位。意思就是說,在 32 位 和 64 位 的 Java 虛擬機中,int 類型的長度是相同的。

三、Serial 與 Parallel GC 之間的不一樣之處?

Serial 與 Parallel 在 GC 執行的時候都會引發 stop-the-world。它們之間主要不一樣 serial 收集器是默認的複製收集器,執行 GC 的時候只有一個線程,而parallel 收集器使用多個 GC 線程來執行。

四、32 位和 64 位的 JVM,int 類型變量的長度是多數?

32 位和 64 位的 JVM 中,int 類型變量的長度是相同的,都是 32 位或者 4個字節。

五、Java 中 WeakReference 與 SoftReference 的區別?

雖然 WeakReference 與 SoftReference 都有利於提升 GC 和 內存的效率,可是 WeakReference ,一旦失去最後一個強引用,就會被 GC回收,而軟引用雖然不能阻止被回收,可是能夠延遲到 JVM 內存不足的時候。

六、JVM 選項 -XX:+UseCompressedOops 有什麼做用?爲何要使用

當你將你的應用從 32 位的 JVM 遷移到 64 位的 JVM 時,因爲對象的指針從32 位增長到了 64 位,所以堆內存會忽然增長,差很少要翻倍。

這也會對 CPU緩存(容量比內存小不少)的數據產生不利的影響。由於,遷移到 64 位的 JVM主要動機在於能夠指定最大堆大小,經過壓縮OOP 能夠節省必定的內存。經過-XX:+UseCompressedOops 選項,JVM 會使用 32 位的 OOP,而不是 64 位的 OOP。

七、怎樣經過 Java 程序來判斷 JVM 是 32 位 仍是 64位?

你能夠檢查某些系統屬性如 sun.arch.data.model 或 os.arch 來獲取該信息。

MySQL面試題83道

一、數據庫存儲引擎

數據庫存儲引擎是數據庫底層軟件組織,數據庫管理系統(DBMS)使用數據引擎進行建立、查詢、更新和刪除數據。不一樣的存儲引擎提供不一樣的存儲機制、索引技巧、鎖定水平等功能,使用不一樣的存儲引擎,還能夠 得到特定的功能。如今許多不一樣的數據庫管理系統都支持多種不一樣的數據引擎。存儲引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated 。

二、InnoDB(B+樹)

InnoDB 底層存儲結構爲B+樹, B樹的每一個節點對應innodb的一個page, page大小是固定的,通常設爲 16k。其中非葉子節點只有鍵值,葉子節點包含完成數據

適用場景:

1)常常更新的表,適合處理多重併發的更新請求。

2)支持事務。

3)能夠從災難中恢復(經過 bin-log 日誌等)。

4)外鍵約束。只有他支持外鍵。

5)支持自動增長列屬性 auto_increment。

三、TokuDB( Fractal Tree-節點帶數據)

TokuDB 底層存儲結構爲 Fractal Tree,Fractal Tree 的結構與 B+樹有些相似, 在 Fractal Tree中, 每個 child 指針除了須要指向一個 child節點外,還會帶有一個 Message Buffer ,這個Message Buffer 是一個 FIFO 的隊列,用來緩存更新操做。

例如,一次插入操做只須要落在某節點的 Message Buffer 就能夠立刻返回了,並不須要搜索到葉子節點。這些緩存的更新會在查詢時或後臺異步合併應用到對應的節點中。

TokuDB 在線添加索引,不影響讀寫操做, 很是快的寫入性能, Fractal-tree 在事務實現上有優點。 它主要適用於訪問頻率不高的數據或歷史數據歸檔。

Redis面試題50道

一、什麼是 Redis?

Redis 是徹底開源免費的,遵照 BSD 協議,是一個高性能的 key-value 數據庫。

Redis 與其餘 key - value 緩存產品有如下三個特色:

Redis 支持數據的持久化,能夠將內存中的數據保存在磁盤中,重啓的時候能夠再次加載進行使用。

Redis 不只僅支持簡單的 key-value 類型的數據,同時還提供 list,set,zset,hash 等數據結構的存儲。

Redis 支持數據的備份,即 master-slave 模式的數據備份。

Redis 優點

性能極高 – Redis 能讀的速度是 110000 次/s,寫的速度是 81000 次/s 。豐富的數據類型 – Redis 支持二進制案例的 Strings, Lists, Hashes,Sets 及Ordered Sets 數據類型操做。

原子 – Redis 的全部操做都是原子性的,意思就是要麼成功執行要麼失敗徹底不執行。單個操做是原子性的。多個操做也支持事務,即原子性,經過 MULTI 和 EXEC指令包起來。

豐富的特性 – Redis 還支持 publish/subscribe, 通知, key 過時等等特性。

二、Redis 與其餘 key-value 存儲有什麼不一樣?

Redis 有着更爲複雜的數據結構而且提供對他們的原子性操做,這是一個不一樣於其餘數據庫的進化路徑。Redis 的數據類型都是基於基本數據結構的同時對程序員透明,無需進行額外的抽象。Redis 運行在內存中可是能夠持久化到磁盤,因此在對不一樣數據集進行高速讀寫時須要權衡內存,由於數據量不能大於硬件內存。在內存數據庫方面的另外一個優勢是,相比在磁盤上相同的複雜的數據結構,在內存中操做起來很是簡單,這樣 Redis能夠作不少內部複雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,由於他們並不須要進行隨機訪問。

三、Redis 的數據類型?

Redis 支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及 zsetsorted set:有序集合)。

咱們實際項目中比較經常使用的是 string,hash 若是你是 Redis 中高級用戶,還須要加上下面幾種數據結構 HyperLogLog、Geo、Pub/Sub。

若是你說還玩過 Redis Module,像 BloomFilter,RedisSearch,Redis-ML,面試官的眼睛就開始發亮了。

Memcached面試題24道

一、Memcached 是什麼,有什麼做用?

Memcached 是一個開源的,高性能的內存綬存軟件,從名稱上看 Mem 就是內存的意思,而 Cache 就是緩存的意思。Memcached 的做用:經過在事先規劃好的內存空間中臨時綬存數據庫中的各種數據,以達到減小業務對數據庫的直接高併發訪問,從而達到提高數據庫的訪問性能,加速網站集羣動態應用服務的能力。

二、Memcached 服務分佈式集羣如何實現?

特殊說明:Memcached 集羣和 web 服務集羣是不同的,全部 Memcached 的數據總和纔是數據庫的數據。每臺 Memcached 都是部分數據。(一臺 memcached 的數據,就是一部分 mysql 數據庫的數據)

a、程序端實現

程序加載全部 mc 的 ip 列表,經過對 key 作 hash (一致性哈希算法)

例如:web1 (key)===>對應 A,B,C,D,E,F,G……若干臺服務器。(經過哈希算法實現)

b、負載均衡器

經過對 key 作 hash (一致性哈希算法)一致哈希算法的目的是不但保證每一個對象只請求一個對應的服務器,並且當節點宕機,緩存服務器的更新從新分配比例降到最低。

MongoDB面試題95道

一、mongodb是什麼?

MongoDB 是由 C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。 在高負載的狀況下,添加更多的節點,能夠保證服務器性能。 MongoDB 旨在爲 WEB 應用提供可擴展的高性能數據存儲解決方案。

MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。 MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。

二、mongodb有哪些特色?

(1)MongoDB 是一個面向文檔存儲的數據庫,操做起來比較簡單和容易。

(2)你能夠在 MongoDB 記錄中設置任何屬性的索引 (如: FirstName=「Sameer」,Address=「8 Gandhi Road」)來實現更快的排序。

(3)你能夠經過本地或者網絡建立數據鏡像,這使得 MongoDB 有更強的擴展性。

(4)若是負載的增長(須要更多的存儲空間和更強的處理能力) ,它能夠分佈在計算機網絡中的其餘節點上這就是所謂的分片。

(5)Mongo 支持豐富的查詢表達式。查詢指令使用 JSON 形式的標記,可輕易查詢文檔中內嵌的對象及數組。

(6)MongoDb 使用 update()命令能夠實現替換完成的文檔(數據)或者一些指定的數據字段 。

(7)Mongodb 中的 Map/reduce 主要是用來對數據進行批量處理和聚合操做。

(8)Map 和 Reduce。 Map 函數調用 emit(key,value)遍歷集合中全部的記錄,將key與value傳給Reduce 函數進行處理。

(9)Map 函數和 Reduce 函數是使用 Javascript 編寫的,並能夠經過 db.runCommand 或mapreduce 命令來執行 MapReduce 操做。

(10) GridFS 是 MongoDB 中的一個內置功能,能夠用於存放大量小文件。

(11) MongoDB 容許在服務端執行腳本, 能夠用 Javascript 編寫某個函數,直接在服務端執行,也

能夠把函數的定義存儲在服務端,下次直接調用便可。

Spring面試題131道

一、不一樣版本的 Spring Framework 有哪些主要功能?

二、什麼是 Spring Framework?

Spring 是一個開源應用框架,旨在下降應用程序開發的複雜度。它是輕量級、鬆散耦合的。它具備分層體系結構,容許用戶選擇組件,同時還爲 J2EE 應用程序開發提供了一個有凝聚力的框架。它能夠集成其餘框架,如 Structs、Hibernate、EJB 等,因此又稱爲框架的框架。

三、列舉 Spring Framework 的優勢。

因爲 Spring Frameworks 的分層架構,用戶能夠自由選擇本身須要的組件。Spring Framework 支持 POJO(Plain Old Java Object) 編程,從而具有持續集成和可測試性。因爲依賴注入和控制反轉,JDBC 得以簡化。它是開源免費的。

Spring Boot面試題92道

一、什麼是 Spring Boot?

多年 來, 隨着 新功 能的 增長 ,spring 變得 越來 越復 雜。 只需 訪問官網頁面 ,咱們 就會 看到 能夠 在我 們的 應用 程序 中使 用的全部 Spring 項目 的不 同功 能。 若是 必須 啓動 一個 新的 Spring 項目 ,我 們必 須添加構 建路 徑或 添加 Maven 依賴關係 ,配置應用程 序服 務器,添加 spring 配置 。所以 ,開始 一個新的 spring項目須要不少努力 ,由於咱們如今必須從頭開始作全部事 情。

Spring Boot 是解 決這 個問 題的 方法 。Spring Boot 已經 創建 在現 有 spring 框架之上 。使用 spring 啓動 ,咱們避免了以前我 們必須作 的所 有樣 板代 碼和 配置 。所以, Spring Boot 能夠 幫助 咱們 以最少的 工做量, 更加 健壯地使用現有的 Spring功能

二、爲何要用SpringBoot

Spring Boot 優勢很是多,如:

(1)獨立運行

Spring Boot並且內嵌了各類servlet容器,Tomcat、Jetty等,如今再也不須要打成war包部署到容器中,Spring Boot只要打成一個可執行的jar包就能獨立運行,全部的依賴包都在一個jar包內。

(2)簡化配置

spring-boot-starter-web啓動器自動依賴其餘組件,簡少了maven的配置。

(3)自動配置

Spring Boot能根據當前類路徑下的類、jar包來自動配置bean,如添加一個spring-boot-starter-web啓動器就能擁有web的功能,無需其餘配置。

(4)無代碼生成和XML配置

Spring Boot配置過程當中無代碼生成,也無需XML配置文件就能完成全部配置工做,這一切都是藉助於條件註解完成的,這也是Spring4.x的核心功能之一。

(5)應用監控

Spring Boot提供一系列端點能夠監控服務及應用,作健康檢測

內容太多就不一一展現了,後面還有Spring Cloud面試題35道、RabbitMQ面試題32道、Dubbo 面試題40道、MyBatis 面試題28道、ZooKeeper 面試題49道、數據結構面試題8道、算法面試題21道、Kafka 面試題25道、Elasticsearch 面試題24道、、微服務面試題50道、Linux面試題48道。 有須要的朋友點擊這裏備註csdn自行下載便可!這些面試題都整理成了一個pdf文檔,總共有200多頁。