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

              2020-06-18    面經大全    【本頁移動版】

              JAVA基礎面經

              請你說說Java和PHP的區別?

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

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

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

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

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

              import java.util.regex.Matcher;

              import java.util.regex.Pattern;

              class RegExpTest{

              public static void main(String [] args){

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

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

              Matcher m = p.matcher(str);

              if(m.find()){

              System.out.println(m.group());

              }

              }

              }

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

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

              請你比較一下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 &&!username.equals(""),二者的順序不能交換,更不能用&運算符,因為第一個條件如果不成立,根本不能進行字符串的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;

              System.out.println(a == b); //false 連個引用沒有引用同一個對象

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

              }

              }

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

              Public String translate (String str) {

              String tempStr = “”;

              try {

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

              tempStr = tempStr.trim();

              } catch (Exception e) {

              System.err.println(e.getMessage());

              }

              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。 java.lang.String類是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(java.util.stream) 把真正的函數式編程風格引入到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為數據結構中的映射定義了一個接口java.util.Map;它有四個實現類,分別是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時,得到的記錄是排過序的。


              相關文章
              熱點文章
              6701彩票网