當前位置:簡歷模板館>面試>面試經驗>

百分之99的公司常問到的JAVA面經

面試經驗 閱讀(2.33W)
JAVA基礎面經請你說說Java和PHP的區別?

PHP暫時還不支持像Java那樣JIT運行時編譯熱點代碼,但是PHP具有opcache機制,能夠把腳本對應的opcode緩存在內存,PHP7中還支持配置_cache導出opcode到文件.第三方的Facebook HHVM也支持JIT.另外PHP官方基於LLVM圍繞opcache機制構建的Zend JIT分支也正在開發測試中.在php-src/Zend/測試顯示,PHP JIT分支速度是PHP 5.4的10倍. PHP的庫函數用C實現,而Java核心運行時類庫(jdk/jre/lib/,大於60MB)用Java編寫(jdk/), 所以Java應用運行的時候,用戶編寫的代碼以及引用的類庫和框架都要在JVM上解釋執行. Java的HotSpot機制,直到有方法被執行10000次纔會觸發JIT編譯, 在此之前運行在解釋模式下,以避免出現JIT編譯花費的時間比方法解釋執行消耗的時間還要多的情況.

百分之99的公司常問到的JAVA面經

PHP內置模板引擎,自身就是模板語言.而Java Web需要使用JSP容器如Tomcat或第三方模板引擎.

PHP也可以運行在多線程模式下,比如Apache的event MPM和Facebook的HHVM都是多線程架構.不管是多進程還是多線程的PHP Web運行模式,都不需要PHP開發者關心和控制,也就是說PHP開發者不需要寫代碼參與進程和線程的管理,這些都由PHP-FPM/HHVM/Apache實現-FPM進程管理和併發實現並不需要PHP開發者關心,而Java多線程編程需要Java開發者編碼參與一個worker進程崩潰,master進程會自動新建一個新的worker進程,並不會導致PHP服務崩潰.而Java多線程編程稍有不慎(比如沒有捕獲異常)就會導致JVM崩潰退出.對於PHP-FPM和Apache MOD_PHP來說,服務進程常駐內存,但一次請求釋放一次資源,這種內存釋放非常徹底. PHP基於引用計數的GC甚至都還沒發揮作用程序就已經結束了。

請你談談Java中是如何支持正則表達式操作的?

Java中的String類提供了支持正則表達式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。此外,Java中可以用Pattern類表示正則表達式對象,它提供了豐富的API進行各種正則表達式操作,如:

import her;

import ern;

class RegExpTest{

public static void main(String [] args){

String str = "成都市(成華區)(武侯區)(高新區)";

Pattern p = ile(".*?(?=()");

Matcher m = her(str);

if(()){

tln(p());

}

}

}

請你簡單描述一下正則表達式及其用途。

在編寫處理字符串的程序時,經常會有查找符合某些複雜規則的字符串的需要。正則表達式就是用於描述這些規則的工具。換句話說,正則表達式就是記錄文本規則的代碼。計算機處理的信息更多的時候不是數值而是字符串,正則表達式就是在進行字符串匹配和處理的時候最爲強大的工具,絕大多數語言都提供了對正則表達式的支持。

請你比較一下Java和JavaSciprt?

JavaScript 與Java是兩個公司開發的不同的兩個產品。Java 是原Sun Microsystems公司推出的面向對象的程序設計語言,特別適合於互聯網應用程序開發;而JavaScript是Netscape公司的產品,爲了擴展Netscape瀏覽器的功能而開發的一種可以嵌入Web頁面中運行的基於對象和事件驅動的解釋性語言。JavaScript的前身是LiveScript;而Java的前身是Oak語言。 下面對兩種語言間的異同作如下比較: - 基於對象和麪向對象:Java是一種真正的面向對象的語言,即使是開發簡單的程序,必須設計對象;JavaScript是種腳本語言,它可以用來製作與網絡無關的,與用戶交互作用的複雜軟件。它是一種基於對象(Object-Based)和事件驅動(Event-Driven)的編程語言,因而它本身提供了非常豐富的內部對象供設計人員使用。 - 解釋和編譯:Java的源代碼在執行之前,必須經過編譯。JavaScript是一種解釋性編程語言,其源代碼不需經過編譯,由瀏覽器解釋執行。(目前的瀏覽器幾乎都使用了JIT(即時編譯)技術來提升JavaScript的運行效率) - 強類型變量和類型弱變量:Java採用強類型變量檢查,即所有變量在編譯之前必須作聲明;JavaScript中變量是弱類型的,甚至在使用變量前可以不作聲明,JavaScript的解釋器在運行時檢查推斷其數據類型。 - 代碼格式不一樣。

請你說明一下,在Java中如何跳出當前的多重嵌套循環?

在最外層循環前加一個標記如A,然後用break A;可以跳出多重循環。(Java中支持帶標籤的break和continue語句,作用有點類似於C和C++中的goto語句,但是就像要避免使用goto一樣,應該避免使用帶標籤的break和continue,因爲它不會讓你的程序變得更優雅,很多時候甚至有相反的作用,所以這種語法其實不知道更好),根本不能進行字符串的equals比較,否則會產生NullPointerException異常。

請你講講&和&&的區別?

&運算符有兩種用法:(1)按位與;(2)邏輯與。&&運算符是短路與運算。邏輯與跟短路與的差別是非常巨大的,雖然二者都要求運算符左右兩端的布爾值都是true整個表達式的值纔是true。&&之所以稱爲短路運算是因爲,如果&&左邊的表達式的值是false,右邊的表達式會被直接短路掉,不會進行運算。很多時候我們可能都需要用&&而不是&,例如在驗證用戶登錄時判定用戶名不是null而且不是空字符串,應當寫爲:username != null &&!ls(""),二者的順序不能交換,更不能用&運算符,因爲第一個條件如果不成立,根本不能進行字符串的equals比較,否則會產生NullPointerException異常。

int和Integer有什麼區別?

Java是一個近乎純潔的面向對象編程語言,但是爲了編程的方便還是引入了基本數據類型,但是爲了能夠將這些基本數據類型當成對象操作,Java爲每一個基本數據類型都引入了對應的包裝類型(wrapper class),int的包裝類就是Integer,從Java 5開始引入了自動裝箱/拆箱機制,使得二者可以相互轉換。 Java 爲每個原始類型提供了包裝類型: - 原始類型: boolean,char,byte,short,int,long,float,double - 包裝類型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

如:

public class AutiUnboxingTest{

public static void main(){

Integer a = new Integer(3);

Integer b = 3; //將3自動裝箱成Integer類型

int c = 3;

tln(a == b); //false 連個引用沒有引用同一個對象

tln(a == c); //true a自動拆箱成int類型再和c比較

}

}

我們在web應用開發過程中經常遇到輸出某種編碼的字符,如iso8859-1等,請你講講如何輸出一個某種編碼的字符串?

Public String translate (String str) {

String tempStr = “”;

try {

tempStr = new String(ytes(“ISO-8859-1″), “GBK”);

tempStr = ();

} catch (Exception e) {

tln(essage());

}

return tempStr;

}

請你說明String 和StringBuffer的區別

JAVA 平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數據。這個String類提供了數值不可改變的字符串。而這個StringBuffer類提供的字符串進行修改。當你知道字符數據要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態構造字符數據。

請你說明一下int 和 Integer 有什麼區別

Java 提供兩種不同的類型:引用類型和原始類型(或內置類型)。Int是java的原始數據類型,Integer是java爲int提供的封裝類。 Java爲每個原始類型提供了封裝類。 原始類型封裝類 booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble 引用類型和原始類型的行爲完全不同,並且它們具有不同的語義。引用類型和原始類型具有不同的特徵和用法,它們包括:大小和速 度問題,這種類型以哪種類型的數據結構存儲,當引用類型和原始類型用作某個類的實例數據時所指定的缺省值。對象引用實例變量 的缺省值爲null,而原始類型實例變量的缺省值與它們的類型有關。

請說明String是最基本的數據類型嗎?

基本數據類型包括byte、int、char、long、float、double、boolean和short。 ng類是final類型的,因此不可以繼承這個類、不能修改這個類。爲了提高效率節省空間,我們應該用StringBuffer類。

請你談談大O符號(big-O notation)並給出不同數據結構的例子

大O符號描述了當數據結構裏面的元素增加的時候,算法的規模或者是性能在最壞的場景下有多麼好。 大O符號也可用來描述其他的行爲,比如:內存消耗。因爲集合類實際上是數據結構,我們一般使用大O符號基於時間,內存和性能來選擇最好的實現。大O符號可以對大量數據的性能給出一個很好的說明。

同時,大O符號表示一個程序運行時所需要的漸進時間複雜度上界。

其函數表示是:

對於函數f(n),g(n),如果存在一個常數c,使得f(n)<=c*g(n),則f(n)=O(g(n));

大O描述當數據結構中的元素增加時,算法的規模和性能在最壞情景下有多好。

大O還可以描述其它行爲,比如內存消耗。因爲集合類實際上是數據結構,因此我們一般使用大O符號基於時間,內存,性能選擇最好的實現。大O符號可以對大量數據性能給予一個很好的說明。

請你講講數組(Array)和列表(ArrayList)的區別?什麼時候應該使用Array而不是ArrayList?

Array和ArrayList的不同點: Array可以包含基本類型和對象類型,ArrayList只能包含對象類型。 Array大小是固定的,ArrayList的大小是動態變化的。 ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。 對於基本類型數據,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本數據類型的時候,這種方式相對比較慢。

請你解釋什麼是值傳遞和引用傳遞?

值傳遞是對基本型變量而言的,傳遞的是該變量的一個副本,改變副本不影響原變量. 引用傳遞一般是對於對象型變量而言的,傳遞的是該對象地址的一個副本, 並不是原對象本身 。 所以對引用對象進行操作會同時改變原對象. 一般認爲,java內的傳遞都是值傳遞.

請你講講Java支持的數據類型有哪些?什麼是自動拆裝箱?

Java語言支持的8種基本數據類型是: byte short int long float double boolean char 自動裝箱是Java編譯器在基本數據類型和對應的對象包裝類型之間做的一個轉化。比如:把int轉化成Integer,double轉化成Double,等等。反之就是自動拆箱。

請你解釋爲什麼會出現4.0-3.6=0.40000001這種現象?

原因簡單來說是這樣:2進制的小數無法精確的表達10進制小數,計算機在計算10進制小數的過程中要先轉換爲2進制進行計算,這個過程中出現了誤差。

請你講講一個十進制的數在內存中是怎麼存的?

補碼的形式。

請你說說Lamda表達式的優缺點。

優點:1. 簡潔。2. 非常容易並行計算。3. 可能代表未來的編程趨勢。

缺點:1. 若不用並行計算,很多時候計算速度沒有比傳統的 for 循環快。(並行計算有時需要預熱才顯示出效率優勢)2. 不容易調試。3. 若其他程序員沒有學過 lambda 表達式,代碼不容易讓其他語言的程序員看懂。

你知道java8的新特性嗎,請簡單介紹一下

Lambda 表達式 ? Lambda允許把函數作爲一個方法的參數(函數作爲參數傳遞進方法中。

方法引用? 方法引用提供了非常有用的語法,可以直接引用已有Java類或對象(實例)的方法或構造器。與lambda聯合使用,方法引用可以使語言的構造更緊湊簡潔,減少冗餘代碼。

默認方法? 默認方法就是一個在接口裏面有了一個實現的方法。

新工具? 新的編譯工具,如:Nashorn引擎 jjs、 類依賴分析器jdeps。

Stream API ?新添加的Stream API(am) 把真正的函數式編程風格引入到Java中。

Date Time API ? 加強對日期與時間的處理。

Optional 類 ? Optional 類已經成爲 Java 8 類庫的一部分,用來解決空指針異常。

Nashorn, JavaScript 引擎 ? Java 8提供了一個新的Nashorn javascript引擎,它允許我們在JVM上運行特定的javascript應用。

請你說明符號“==”比較的是什麼?

“==”對比兩個對象基於內存引用,如果兩個對象的引用完全相同(指向同一個對象)時,“==”操作將返回true,否則返回false。“==”如果兩邊是基本類型,就是比較數值是否相等。

請你解釋Object若不重寫hashCode()的話,hashCode()如何計算出來的?

Object 的 hashcode 方法是本地方法,也就是用 c 語言或 c++ 實現的,該方法直接返回對象的 內存地址。

請你解釋爲什麼重寫equals還要重寫hashcode?

HashMap中,如果要比較key是否相等,要同時使用這兩個函數!因爲自定義的類的hashcode()方法繼承於Object類,其hashcode碼爲默認的內存地址,這樣即便有相同含義的兩個對象,比較也是不相等的。HashMap中的比較key是這樣的,先求出key的hashcode(),比較其值是否相等,若相等再比較equals(),若相等則認爲他們是相等的。若equals()不相等則認爲他們不相等。如果只重寫hashcode()不重寫equals()方法,當比較equals()時只是看他們是否爲同一對象(即進行內存地址的比較),所以必定要兩個方法一起重寫。HashMap用來判斷key是否相等的方法,其實是調用了HashSet判斷加入元素 是否相等。重載hashCode()是爲了對同一個key,能得到相同的Hash Code,這樣HashMap就可以定位到我們指定的key上。重載equals()是爲了向HashMap表明當前對象和key上所保存的對象是相等的,這樣我們才真正地獲得了這個key所對應的這個鍵值對。

請你介紹一下map的分類和常見的情況

java爲數據結構中的映射定義了一個接口;它有四個實現類,分別是HashMap Hashtable LinkedHashMap 和TreeMap.

Map主要用於存儲健值對,根據鍵得到值,因此不允許鍵重複(重複了覆蓋了),但允許值重複。

Hashmap 是一個最常用的Map,它根據鍵的HashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得數據的順序是完全隨機的。 HashMap最多隻允許一條記錄的鍵爲Null;允許多條記錄的值爲 Null;HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap;可能會導致數據的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

Hashtable與 HashMap類似,它繼承自Dictionary類,不同的是:它不允許記錄的鍵或者值爲空;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了 Hashtable在寫入時會比較慢。

LinkedHashMap 是HashMap的一個子類,保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的.也可以在構造時用帶參數,按照應用次數排序。在遍歷的時候會比HashMap慢,不過有種情況例外,當HashMap容量很大,實際數據較少時,遍歷起來可能會比 LinkedHashMap慢,因爲LinkedHashMap的遍歷速度只和實際數據有關,和容量無關,而HashMap的遍歷速度和他的容量有關。

TreeMap實現SortMap接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。

一般情況下,我們用的最多的是HashMap,在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。但如果您要按自然順序或自定義順序遍歷鍵,那麼TreeMap會更好。如果需要輸出的順序和輸入的相同,那麼用LinkedHashMap 可以實現,它還可以按讀取順序來排列.

HashMap是一個最常用的Map,它根據鍵的hashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。HashMap最多隻允許一條記錄的鍵爲NULL,允許多條記錄的值爲NULL。

HashMap不支持線程同步,即任一時刻可以有多個線程同時寫HashMap,可能會導致數據的不一致性。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。

Hashtable與HashMap類似,不同的是:它不允許記錄的鍵或者值爲空;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了Hashtable在寫入時會比較慢。

LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的。

在遍歷的時候會比HashMap慢TreeMap能夠把它保存的記錄根據鍵排序,默認是按升序排序,也可以指定排序的比較器。當用Iterator遍歷TreeMap時,得到的記錄是排過序的。