Java面試題大全2020版(內(nèi)附詳細答案)

發(fā)現(xiàn)最近很多學(xué)生找我咨詢Java的面試題俊性,說網(wǎng)上找的不全,沒有答案的透敌。所以花了好久時間整理771頁盯滚,1500多道常見面試題及詳細解答!按照模塊劃分有清晰目錄酗电,希望對正在找工作的同學(xué)有幫助魄藕!

列舉了眾多 IT 公司面試真題,對應(yīng)聘 Java 程序員職 位的常見考點和知識體系都進行的分類和歸納整理撵术。本題集包含了常見的算法背率、面試題,也包含了新的高級技術(shù)嫩与,比如:微服務(wù)架構(gòu) 等技術(shù)的面試題目寝姿。本題集非常全面,對于工作 1-5 年左右的 java 程序員面試有非常好的指導(dǎo)作用划滋。

哈哈饵筑,應(yīng)該沒有比這更全的面試題了吧!

第一篇:面試題匯總

Java 基礎(chǔ)处坪、語法

1.Java 跨平臺原理(字節(jié)碼文件根资、虛擬機)

C/C++語言都直接編譯成針對特定平臺機器碼架专。如果要跨平臺,需要使用相應(yīng)

的編譯器重新編譯嫂冻。

Java 源程序(.java)要先編譯成與平臺無關(guān)的字節(jié)碼文件(.class)胶征,然后字節(jié)碼

文件再解釋成機器碼運行。解釋是通過 Java 虛擬機來執(zhí)行的桨仿。

字節(jié)碼文件不面向任何具體平臺睛低,只面向虛擬機。Java 虛擬機是可運行 Java 字節(jié)碼文件的虛擬計算機服傍。不同平臺的虛擬機是不同

的钱雷,但它們都提供了相同的接口。

Java 語言具有一次編譯吹零,到處運行的特點罩抗。就是說編譯后的.class 可以跨平臺運

行,前提是該平臺具有相應(yīng)的 Java 虛擬機灿椅。但是性能比 C/C++要低套蒂。

Java 的跨平臺原理決定了其性能沒有 C/C++高

2.Java 的安全性

語言層次的安全性主要體現(xiàn)在:Java 取消了強大但又危險的指針,而代之以引用茫蛹。由于指針可進行移動運算操刀,

指針可隨便指向一個內(nèi)存區(qū)域,而不管這個區(qū)域是否可用婴洼,這樣做是危險的骨坑,因

為原來這個內(nèi)存地址可能存儲著重要數(shù)據(jù)或者是其他程序運行所占用的,并且使

用指針也容易數(shù)組越界柬采。

垃圾回收機制:不需要程序員直接控制內(nèi)存回收欢唾,由垃圾回收器在后臺自動回收

不再使用的內(nèi)存。避免程序忘記及時回收粉捻,導(dǎo)致內(nèi)存泄露礁遣。避免程序錯誤回收程

序核心類庫的內(nèi)存,導(dǎo)致系統(tǒng)崩潰肩刃。

異常處理機制:Java 異常機制主要依賴于 try亡脸、catch、finally树酪、throw浅碾、throws

五個關(guān)鍵字。

強制類型轉(zhuǎn)換:只有在滿足強制轉(zhuǎn)換規(guī)則的情況下才能強轉(zhuǎn)成功续语。

底層的安全性可以從以下方面來說明

Java 在字節(jié)碼的傳輸過程中使用了公開密鑰加密機制(PKC)垂谢。

在運行環(huán)境提供了四級安全性保障機制:

字節(jié)碼校驗器 -類裝載器 -運行時內(nèi)存布局 -文件訪問限制

3.Java 三大版本

Java2 平臺包括標準版(J2SE)、企業(yè)版(J2EE)和微縮版(J2ME)三個版本:

Standard Edition(標準版) J2SE 包含那些構(gòu)成 Java 語言核心的類疮茄。比如:數(shù)據(jù)庫連接滥朱、接口定義根暑、輸入/輸出、網(wǎng)絡(luò)編程

Enterprise Edition(企業(yè)版) J2EE 包含 J2SE 中的類徙邻,并且還包含用于開發(fā)企業(yè)

級應(yīng)用的類排嫌。

比如 servlet、JSP缰犁、XML淳地、事務(wù)控制

Micro Edition(微縮版) J2ME 包含 J2SE 中一部分類,用于消費類電子產(chǎn)品的軟

件開發(fā)帅容。

比如:呼機颇象、智能卡、手機并徘、PDA遣钳、機頂盒

他們的范圍是:J2SE 包含于 J2EE 中,J2ME 包含了 J2SE 的核心類麦乞,但新添加

了一些專有類

應(yīng)用場合蕴茴,API 的覆蓋范圍各不相同。

4.什么是 JVM姐直?什么是 JDK倦淀? 什么是 JRE?

JVM :JVM 是 Java Virtual Machine(Java 虛擬機)的縮寫简肴,它是整個 java

實現(xiàn)跨平臺的最核心的部分晃听,所有的 java 程序會首先被編譯為.class 的類文件百侧,

這種類文件可以在虛擬機上執(zhí)行砰识,也就是說 class 并不直接與機器的操作系統(tǒng)相

對應(yīng),而是經(jīng)過虛擬機間接與操作系統(tǒng)交互佣渴,由虛擬機將程序解釋給本地系統(tǒng)執(zhí)

行辫狼。JVM 是 Java 平臺的基礎(chǔ),和實際的機器一樣辛润,它也有自己的指令集膨处,并且

在運行時操作不同的內(nèi)存區(qū)域。 JVM 通過抽象操作系統(tǒng)和 CPU 結(jié)構(gòu)砂竖,提供了

一種與平臺無關(guān)的代碼執(zhí)行方法真椿,即與特殊的實現(xiàn)方法、主機硬件乎澄、主機操作系統(tǒng)無關(guān)突硝。JVM 的主要工作是解釋自己的指令集(即字節(jié)碼)到 CPU 的指令集或

對應(yīng)的系統(tǒng)調(diào)用,保護用戶免被惡意程序騷擾置济。 JVM 對上層的 Java 源文件是

不關(guān)心的解恰,它關(guān)注的只是由源文件生成的類文件(.class 文件)锋八。

JRE:JRE 是 java runtime environment(java 運行環(huán)境)的縮寫。光有 JVM

還不能讓 class 文件執(zhí)行护盈,因為在解釋 class 的時候 JVM 需要調(diào)用解釋所需要的

類庫 lib挟纱。在 JDK 的安裝目錄里你可以找到 jre 目錄,里面有兩個文件夾 bin 和

lib,在這里可以認為 bin 里的就是 jvm腐宋,

lib 中則是 jvm 工作所需要的類庫紊服,而 jvm

和 lib 和起來就稱為 jre。所以脏款,在你寫完 java 程序編譯成.class 之后围苫,你可以

把這個.class 文件和 jre 一起打包發(fā)給朋友,這樣你的朋友就可以運行你寫程序

了(jre 里有運行.class 的 java.exe)撤师。JRE 是 Sun 公司發(fā)布的一個更大的系統(tǒng)剂府,

它里面就有一個 JVM。JRE 就與具體的 CPU 結(jié)構(gòu)和操作系統(tǒng)有關(guān)剃盾,是運行 Java

程序必不可少的(除非用其他一些編譯環(huán)境編譯成.exe 可執(zhí)行文件……)腺占,JRE

的地位就象一臺 PC 機一樣,我們寫好的 Win32 應(yīng)用程序需要操作系統(tǒng)幫我們

運行痒谴,同樣的衰伯,我們編寫的 Java 程序也必須要 JRE 才能運行。

JDK:JDK 是 java development kit(java 開發(fā)工具包)的縮寫积蔚。每個學(xué) java

的人都會先在機器上裝一個 JDK意鲸,那 讓我們看一下 JDK 的安裝目錄。在目錄下

面有六個文件夾尽爆、一個 src 類庫源碼壓縮包怎顾、和其他幾個聲明文件。其中漱贱,真正

在運行 java 時起作用的是以下四個文件夾:bin槐雾、include、lib幅狮、jre∧记浚現(xiàn)在我們

可以看出這樣一個關(guān)系,JDK 包含 JRE崇摄,而 JRE 包含 JVM擎值。

bin:最主要的是編譯器(javac.exe)include:java 和 JVM 交互用的頭文件

lib:類庫

jre:java 運行環(huán)境

(注意:這里的 bin、lib 文件夾和 jre 里的 bin逐抑、lib 是不同的)總的來說 JDK

是用于 java 程序的開發(fā),而 jre 則是只能運行 class 而沒有編譯的功能鸠儿。eclipse、

idea 等其他 IDE 有自己的編譯器而不是用 JDK bin 目錄中自帶的泵肄,所以在安裝

時你會發(fā)現(xiàn)他們只要求你選 jre 路徑就 ok 了捆交。

JDK,JRE,JVM 三者關(guān)系概括如下:

jdk 是 JAVA 程序開發(fā)時用的開發(fā)工具包淑翼,其內(nèi)部也有 JRE 運行環(huán)境 JRE。JRE

是 JAVA 程序運行時需要的運行環(huán)境品追,就是說如果你光是運行 JAVA 程序而不是

去搞開發(fā)的話玄括,只安裝 JRE 就能運行已經(jīng)存在的 JAVA 程序了。JDk肉瓦、JRE 內(nèi)部

都包含 JAVA 虛擬機 JVM遭京,

JAVA 虛擬機內(nèi)部包含許多應(yīng)用程序的類的解釋器和

類加載器等等。

5.Java 三種注釋類型

共有單行注釋泞莉、多行注釋哪雕、文檔注釋 3 種注釋類型。使用如下:

單行注釋鲫趁,采用“//”方式.只能注釋一行代碼斯嚎。如://類成員變量

多行注釋,采用“/*...*/”方式挨厚,可注釋多行代碼堡僻,其中不允許出現(xiàn)嵌套。如:

/*System.out.println("a");System.out.println("b");

System.out.println("c");*/

文檔注釋疫剃,采用“/**...*/”方式钉疫。如:

/**

* 子類 Dog

* @author Administrator

**/

public class Dog extends Animal{}

6.8 種基本數(shù)據(jù)類型及其字節(jié)數(shù)

數(shù)據(jù)類型

關(guān)鍵字 字節(jié)數(shù)

數(shù)值型

整數(shù)型

byte

1

short

2

int

4

long

8

浮點型

float

4

double 8

布爾型

boolean 1(位)字符型

char

2

7.i++和++i 的異同之處

共同點:

1、i++和++i 都是變量自增 1巢价,都等價于 i=i+1

2牲阁、如果 i++,++i 是一條單獨的語句,兩者沒有任何區(qū)別

3壤躲、i++和++i 的使用僅僅針對變量城菊。 5++和++5 會報錯,因為 5 不是變量柒爵。

不同點:

如果 i++,++i 不是一條單獨的語句役电,他們就有區(qū)別 i++ :先運算后增 1赚爵。如:

int x=5;

int y=x++;

System.out.println("x="+x+", y="+y);

//以上代碼運行后輸出結(jié)果為:x=6, y=5

++i : 先增 1 后運算棉胀。如:

int x=5;

int y=++x;System.out.println("x="+x+", y="+y);

//以上代碼運行后輸出結(jié)果為:x=6, y=6

8.&和&&的區(qū)別和聯(lián)系,|和||的區(qū)別和聯(lián)系

&和&&的聯(lián)系(共同點):

&和&&都可以用作邏輯與運算符冀膝,但是要看使用時的具體條件來決定唁奢。

操作數(shù) 1&操作數(shù) 2,操作數(shù) 1&&操作數(shù) 2窝剖,

表達式 1&表達式 2麻掸,表達式 1&&表達式 2,

情況 1:當上述的操作數(shù)是 boolean 類型變量時赐纱,&和&&都可以用作邏輯與運

算符脊奋。

情況 2:當上述的表達式結(jié)果是 boolean 類型變量時熬北,&和&&都可以用作邏輯

與運算符。

表示邏輯與(and)诚隙,當運算符兩邊的表達式的結(jié)果或操作數(shù)都為 true 時讶隐,整個運

算結(jié)果才為 true,否則久又,只要有一方為 false巫延,結(jié)果都為 false。

&和&&的區(qū)別(不同點):

(1)地消、&邏輯運算符稱為邏輯與運算符炉峰,&&邏輯運算符稱為短路與運算符,也可

叫邏輯與運算符脉执。

對于&:無論任何情況疼阔,&兩邊的操作數(shù)或表達式都會參與計算。對于&&:當&&左邊的操作數(shù)為 false 或左邊表達式結(jié)果為 false 時半夷,&&右邊

的操作數(shù)或表達式將不參與計算竿开,此時最終結(jié)果都為 false。

綜上所述玻熙,如果邏輯與運算的第一個操作數(shù)是 false 或第一個表達式的結(jié)果為

false 時否彩,對于第二個操作數(shù)或表達式是否進行運算,對最終的結(jié)果沒有影響嗦随,

結(jié)果肯定是 false列荔。推介平時多使用&&,因為它效率更高些枚尼。

贴浙、&還可以用作位運算符。當&兩邊操作數(shù)或兩邊表達式的結(jié)果不是 boolean

類型時署恍,&用于按位與運算符的操作崎溃。

|和||的區(qū)別和聯(lián)系與&和&&的區(qū)別和聯(lián)系類似

9.用最有效率的方法算出 2 乘以 8 等于多少

使用位運算來實現(xiàn)效率最高。位運算符是對操作數(shù)以二進制比特位為單位進行操

作和運算盯质,操作數(shù)和結(jié)果都是整型數(shù)袁串。對于位運算符“<<”, 是將一個數(shù)左移 n

位,就相當于乘以了 2 的 n 次方呼巷,那么囱修,一個數(shù)乘以 8 只要將其左移 3 位即可,

位運算 cpu 直接支持的王悍,效率最高破镰。所以,2 乘以 8 等于幾的最效率的方法是 2

<< 3

10.基本數(shù)據(jù)類型的類型轉(zhuǎn)換規(guī)則

基本類型轉(zhuǎn)換分為自動轉(zhuǎn)換和強制轉(zhuǎn)換。

自動轉(zhuǎn)換規(guī)則:容量小的數(shù)據(jù)類型可以自動轉(zhuǎn)換成容量大的數(shù)據(jù)類型鲜漩,也可

以說低級自動向高級轉(zhuǎn)換源譬。這兒的容量指的不是字節(jié)數(shù),而是指類型表述的范圍孕似。強制轉(zhuǎn)換規(guī)則:高級變?yōu)榈图壭枰獜娭妻D(zhuǎn)換瓶佳。

如何轉(zhuǎn)換:

(1)賦值運算符“=”右邊的轉(zhuǎn)換,先自動轉(zhuǎn)換成表達式中級別最高的數(shù)據(jù)類

型鳞青,再進行運算霸饲。

(2)賦值運算符“=”兩側(cè)的轉(zhuǎn)換,若左邊級別>右邊級別臂拓,會自動轉(zhuǎn)換厚脉;若左

邊級別 == 右邊級別,不用轉(zhuǎn)換胶惰;若左邊級別 < 右邊級別傻工,需強制轉(zhuǎn)換。

(3)可以將整型常量直接賦值給 byte, short, char 等類型變量孵滞,而不需要進行強

制類型轉(zhuǎn)換中捆,前提是不超出其表述范圍,否則必須進行強制轉(zhuǎn)換坊饶。

11.if 多分支語句和 switch 多分支語句的異同之處

相同之處:都是分支語句泄伪,多超過一種的情況進行判斷處理。

不同之處:switch 更適合用于多分支情況匿级,就是有很多種情況需要判斷處理蟋滴,判斷條件類

型單一,只有一個入口痘绎,在分支執(zhí)行完后(如果沒有 break 跳出)津函,不加判斷

地執(zhí)行下去;而 if—elseif---else 多分枝主要適用于分支較少的分支結(jié)構(gòu),判斷類

型不是單一孤页,只要一個分支被執(zhí)行后尔苦,后邊的分支不再執(zhí)行。switch 為等值判

斷(不允許比如>= <=)行施,而 if 為等值和區(qū)間都可以允坚,if 的使用范圍大。

12.while 和 do-while 循環(huán)的區(qū)別

while 先判斷后執(zhí)行悲龟,第一次判斷為 false,循環(huán)體一次都不執(zhí)行

do while 先執(zhí)行 后判斷屋讶,最少執(zhí)行 1 次冰寻。

如果 while 循環(huán)第一次判斷為 true, 則兩種循環(huán)沒有區(qū)別须教。

13.break 和 continue 的作用

break: 結(jié)束當前循環(huán)并退出當前循環(huán)體。

break 還可以退出 switch 語句

continue: 循環(huán)體中后續(xù)的語句不執(zhí)行,但是循環(huán)沒有結(jié)束轻腺,繼續(xù)進行循環(huán)條件

的判斷(for 循環(huán)還會 i++)乐疆。continue 只是結(jié)束本次循環(huán)。

14.請使用遞歸算法計算 n贬养!

package com.bjsxt;import java.io.File;

public class $ {

public static void main(String[] args) {

String path = "D:/301SXT";

test(path);

}

private static void test(String path) {

File f = new File(path);

File[] fs = f.listFiles();

if (fs == null) {

return;

}

for (File file : fs) {

if (file.isFile()) {

System.out.println(file.getPath());

} else {

test(file.getPath());

}

}

}

15.遞歸的定義和優(yōu)缺點遞歸算法是一種直接或者間接地調(diào)用自身算法的過程挤土。在計算機編寫程序中,遞

歸算法對解決一大類問題是十分有效的误算,它往往使算法的描述簡潔而且易于理

解仰美。

遞歸算法解決問題的特點:

(1) 遞歸就是在過程或函數(shù)里調(diào)用自身。

(2) 在使用遞歸策略時儿礼,必須有一個明確的遞歸結(jié)束條件咖杂,稱為遞歸出口。

(3) 遞歸算法解題通常顯得很簡潔蚊夫,但運行效率較低诉字。所以一般不提倡用遞歸算

法設(shè)計程序。

(4) 在遞歸調(diào)用的過程當中系統(tǒng)為每一層的返回點知纷、局部量等開辟了棧來存儲壤圃。

遞歸次數(shù)過多容易造成棧溢出等。所以一般不提倡用遞歸算法設(shè)計程序琅轧。


關(guān)注我伍绳,領(lǐng)取全套電子書籍

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乍桂,隨后出現(xiàn)的幾起案子墨叛,更是在濱河造成了極大的恐慌,老刑警劉巖模蜡,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漠趁,死亡現(xiàn)場離奇詭異,居然都是意外死亡忍疾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門卤妒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甥绿,“玉大人,你說我怎么就攤上這事则披」猜疲” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵士复,是天一觀的道長图谷。 經(jīng)常有香客問我翩活,道長,這世上最難降的妖魔是什么便贵? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任菠镇,我火速辦了婚禮,結(jié)果婚禮上承璃,老公的妹妹穿的比我還像新娘利耍。我一直安慰自己,他們只是感情好盔粹,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布隘梨。 她就那樣靜靜地躺著,像睡著了一般舷嗡。 火紅的嫁衣襯著肌膚如雪出嘹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天咬崔,我揣著相機與錄音税稼,去河邊找鬼。 笑死垮斯,一個胖子當著我的面吹牛郎仆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兜蠕,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扰肌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了熊杨?” 一聲冷哼從身側(cè)響起曙旭,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晶府,沒想到半個月后桂躏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡川陆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年剂习,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片较沪。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鳞绕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出尸曼,到底是詐尸還是另有隱情们何,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布控轿,位于F島的核電站冤竹,受9級特大地震影響拂封,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贴见,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一烘苹、第九天 我趴在偏房一處隱蔽的房頂上張望躲株。 院中可真熱鬧片部,春花似錦、人聲如沸霜定。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽望浩。三九已至辖所,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磨德,已是汗流浹背缘回。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留典挑,地道東北人酥宴。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像您觉,于是被迫代替她去往敵國和親拙寡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354