發(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)取全套電子書籍