可可簡歷網

位置:首頁 > 面試 > 面試經驗

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

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時,得到的記錄是排過序的。