java程序員找工作&跳槽必備面試寶典
? 臺下十年功,臺上一分鐘。不管學習多久,終究是要面臨面試的關卡,士兵不打沒有準備的戰(zhàn),今天就給大家整理一些面試方面的題,快快刷起來。
第一部分:java基礎、語法
1.Java跨平臺原理(字節(jié)碼文件、虛擬機)
C/C++語言都直接編譯成針對特定平臺機器碼。如果要跨平臺,需要使用相應的編譯器重新編譯。
Java源程序(.java)要先編譯成與平臺無關的字節(jié)碼文件(.class),然后字節(jié)碼文件再解釋成機器碼運行。解釋是通過Java虛擬機來執(zhí)行的。
字節(jié)碼文件不面向任何具體平臺,只面向虛擬機。
Java虛擬機是可運行Java字節(jié)碼文件的虛擬計算機。不同平臺的虛擬機是不同的,但它們都提供了相同的接口。
Java語言具有一次編譯,到處運行的特點。就是說編譯后的.class可以跨平臺運行,前提是該平臺具有相應的Java虛擬機。但是性能比C/C++要低。
Java的跨平臺原理決定了其性能沒有C/C++高
2.Java的安全性
語言層次的安全性主要體現(xiàn)在:
Java取消了強大但又危險的指針,而代之以引用。由于指針可進行移動運算,指針可隨便指向一個內存區(qū)域,而不管這個區(qū)域是否可用,這樣做是危險的,因為原來這個內存地址可能存儲著重要數(shù)據或者是其他程序運行所占用的,并且使用指針也容易數(shù)組越界。
垃圾回收機制:不需要程序員直接控制內存回收,由垃圾回收器在后臺自動回收不再使用的內存。避免程序忘記及時回收,導致內存泄露。避免程序錯誤回收程序核心類庫的內存,導致系統(tǒng)崩潰。
異常處理機制:Java異常機制主要依賴于try、catch、finally、throw、throws五個關鍵字。
強制類型轉換:只有在滿足強制轉換規(guī)則的情況下才能強轉成功。
底層的安全性可以從以下方面來說明
Java在字節(jié)碼的傳輸過程中使用了公開密鑰加密機制(PKC)。
在運行環(huán)境提供了四級安全性保障機制:
字節(jié)碼校驗器 -類裝載器 -運行時內存布局 -文件訪問限制
3.Java三大版本
Java2平臺包括標準版(J2SE)、企業(yè)版(J2EE)和微縮版(J2ME)三個版本:
Standard Edition(標準版) J2SE 包含那些構成Java語言核心的類。
比如:數(shù)據庫連接、接口定義、輸入/輸出、網絡編程
Enterprise Edition(企業(yè)版) J2EE 包含J2SE 中的類,并且還包含用于開發(fā)企業(yè)級應用的類。
比如servlet、JSP、XML、事務控制
Micro Edition(微縮版) J2ME 包含J2SE中一部分類,用于消費類電子產品的軟件開發(fā)。
比如:呼機、智能卡、手機、PDA、機頂盒
他們的范圍是:J2SE包含于J2EE中,J2ME包含了J2SE的核心類,但新添加了一些專有類
應用場合,API的覆蓋范圍各不相同。
4.什么是JVM?什么是JDK? 什么是JRE?
JVM :JVM是Java Virtual Machine(Java虛擬機)的縮寫,它是整個java實現(xiàn)跨平臺的最核心的部分,所有的java程序會首先被編譯為.class的類文件,這種類文件可以在虛擬機上執(zhí)行,也就是說class并不直接與機器的操作系統(tǒng)相對應,而是經過虛擬機間接與操作系統(tǒng)交互,由虛擬機將程序解釋給本地系統(tǒng)執(zhí)行。JVM是Java平臺的基礎,和實際的機器一樣,它也有自己的指令集,并且在運行時操作不同的內存區(qū)域。 JVM通過抽象操作系統(tǒng)和CPU結構,提供了一種與平臺無關的代碼執(zhí)行方法,即與特殊的實現(xiàn)方法、主機硬件、主機操作系統(tǒng)無關。JVM的主要工作是解釋自己的指令集(即字節(jié)碼)到CPU的指令集或對應的系統(tǒng)調用,保護用戶免被惡意程序騷擾。 JVM對上層的Java源文件是不關心的,它關注的只是由源文件生成的類文件(.class文件)。
JRE:JRE是java runtime environment(java運行環(huán)境)的縮寫。光有JVM還不能讓class文件執(zhí)行,因為在解釋class的時候JVM需要調用解釋所需要的類庫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結構和操作系統(tǒng)有關,是運行Java程序必不可少的(除非用其他一些編譯環(huán)境編譯成.exe可執(zhí)行文件……),JRE的地位就象一臺PC機一樣,我們寫好的Win32應用程序需要操作系統(tǒng)幫我們運行,同樣的,我們編寫的Java程序也必須要JRE才能運行。?
JDK:JDK是java development kit(java開發(fā)工具包)的縮寫。每個學java的人都會先在機器上裝一個JDK,那 讓我們看一下JDK的安裝目錄。在目錄下面有六個文件夾、一個src類庫源碼壓縮包、和其他幾個聲明文件。其中,真正在運行java時起作用的是以下四個文件夾:bin、include、lib、jre?,F(xià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三者關系概括如下:
jdk是JAVA程序開發(fā)時用的開發(fā)工具包,其內部也有JRE運行環(huán)境JRE。JRE是JAVA程序運行時需要的運行環(huán)境,就是說如果你光是運行JAVA程序而不是去搞開發(fā)的話,只安裝JRE就能運行已經存在的JAVA程序了。JDk、JRE內部都包含JAVA虛擬機JVM,JAVA虛擬機內部包含許多應用程序的類的解釋器和類加載器等等。
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{}
第二部分:String相關
1.下面程序的運行結果是()(選擇一項)
String str1="hello";
?
String str2=new String("hello");
?
System.out.println(str1==str2);
A. true
B. false
C. hello
D. he
答案:B
分析:str1沒有使用new關鍵字,在堆中沒有開辟空間,其值”hello”在常量池中,str2使用new關鍵字創(chuàng)建了一個對象,在堆中開辟了空間,”==”比較的是對象的引用,即內存地址,所以str1與str2兩個對象的內存地址是不相同的
2.Java語言中,String類中的indexOf()方法返回值的類型是()
A. int16
B. int32
C. int
D. long
答案:C
3.給定以下代碼,程序的運行結果是 ()(選擇一項)
public class Example {
String str=new String("good");
char [] ch={'a','b','c'};
?
public static void main(String[] args) {
Example ex=new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str+"and");
System.out.print(ex.ch);
}
?
public void change(String? str,char ch[]){
str="test ok";
ch[0]='g';
}
}
A. goodandabc
B. goodandgbc
C. test okandabc
D. test okandgbc
答案:B
分析:在方法調用時,在change方法中對str的值進行修改,是將str指向了常量江池中的”test ok”,而主方法中的ex.str仍然指向的是常量池中的”good”。字符型數(shù)組在方法調用時,將主方法中ex.ch的引用傳遞給change方法中的ch,指向是堆中的同一堆空間,所以修改ch[0]的時候,ex.ch可以看到相同的修改后的結果。
4.執(zhí)行下列代碼后,哪個結論是正確的()(選擇兩項)
String[] s=new String[10];
A. s[10]為””
B. s[9]為null
C. s[0]為未定義
D. s.length為10
答案:BD
分析: 引用數(shù)據類型的默認值均為null
s.length數(shù)組的長度
5.實現(xiàn)String類的replaceAll方法
思路說明:replaceAll方法的本質是使用正則表達式進行匹配,最終調用的其實是Matcher對象的replaceAll方法。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
?
public class TestStringReplaceAll {
public static void main(String[] args) {
String str = "a1s2d3f4h5j6k7";
// 將字符串中的數(shù)字全部替換為0
System.out.println(replaceAll(str, "\\d", "0"));
}
?
/**
?* @param str:源字符串
?* @param regex:正則表達式
?* @param newStr:替換后的子字符串
?* @return 返回替換成功后的字符串
?*/
public static String replaceAll(String str, String regex, String newStr) {
Pattern pattern = Pattern.compile(regex);
Matcher mathcer = pattern.matcher(str);
String reslut = mathcer.replaceAll(newStr);
return reslut;
}
}
6.在“=”后填寫適當?shù)膬热荩?/p>
String []a=new String[10];
則:a[0]~a[9]=null;
a.length=10;
如果是int[]a=new int[10];
則:a[0]~a[9]= (0)
a.length= (10)
7.是否可以繼承String類?
答:不可以,因為String類有final修飾符,而final修飾的類是不能被繼承的,實現(xiàn)細節(jié)不允許改變。
public final class String implements java.io.Serializable,
Comparable< String>, CharSequence
第三部分:集合
第四部分:多線程
IO流
網絡編程
異常處理
Web方面相關
設計模式
高級框架
微服務框架
數(shù)據庫
JVM
Linux操作
算法分析及手寫代碼
篇幅有限,后續(xù)還有內容,我已經整理成電子版保存到網盤,另外還有很多學習編程可以用到的資料可以分享,有需要記得關注私信我,或者你需要什么學習資料,評論區(qū)告訴我,我會不定期上傳,感謝支持~