欧美在线一级ⅤA免费观看,好吊妞国产欧美日韩观看,日本韩国亚洲综合日韩欧美国产,日本免费A在线

    <menu id="gdpeu"></menu>

  • 百分之99的公司常問到的JAVA面經(jīng)

    2020-06-18    面經(jīng)大全   

    JAVA基礎(chǔ)面經(jīng)

    請你說說Java和PHP的區(qū)別?

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

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

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

    請你談?wù)凧ava中是如何支持正則表達(dá)式操作的?

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

    import java.util.regex.Matcher;

    import java.util.regex.Pattern;

    class RegExpTest{

    public static void main(String [] args){

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

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

    Matcher m = p.matcher(str);

    if(m.find()){

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

    }

    }

    }

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

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

    請你比較一下Java和JavaSciprt?

    JavaScript 與Java是兩個公司開發(fā)的不同的兩個產(chǎn)品。Java 是原Sun Microsystems公司推出的面向?qū)ο蟮某绦蛟O(shè)計語言,特別適合于互聯(lián)網(wǎng)應(yīng)用程序開發(fā);而JavaScript是Netscape公司的產(chǎn)品,為了擴(kuò)展Netscape瀏覽器的功能而開發(fā)的一種可以嵌入Web頁面中運行的基于對象和事件驅(qū)動的解釋性語言。JavaScript的前身是LiveScript;而Java的前身是Oak語言。 下面對兩種語言間的異同作如下比較: - 基于對象和面向?qū)ο螅篔ava是一種真正的面向?qū)ο蟮恼Z言,即使是開發(fā)簡單的程序,必須設(shè)計對象;JavaScript是種腳本語言,它可以用來制作與網(wǎng)絡(luò)無關(guān)的,與用戶交互作用的復(fù)雜軟件。它是一種基于對象(Object-Based)和事件驅(qū)動(Event-Driven)的編程語言,因而它本身提供了非常豐富的內(nèi)部對象供設(shè)計人員使用。 - 解釋和編譯:Java的源代碼在執(zhí)行之前,必須經(jīng)過編譯。JavaScript是一種解釋性編程語言,其源代碼不需經(jīng)過編譯,由瀏覽器解釋執(zhí)行。(目前的瀏覽器幾乎都使用了JIT(即時編譯)技術(shù)來提升JavaScript的運行效率) - 強(qiáng)類型變量和類型弱變量:Java采用強(qiáng)類型變量檢查,即所有變量在編譯之前必須作聲明;JavaScript中變量是弱類型的,甚至在使用變量前可以不作聲明,JavaScript的解釋器在運行時檢查推斷其數(shù)據(jù)類型。 - 代碼格式不一樣。

    請你說明一下,在Java中如何跳出當(dāng)前的多重嵌套循環(huán)?

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

    請你講講&和&&的區(qū)別?

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

    int和Integer有什么區(qū)別?

    Java是一個近乎純潔的面向?qū)ο缶幊陶Z言,但是為了編程的方便還是引入了基本數(shù)據(jù)類型,但是為了能夠?qū)⑦@些基本數(shù)據(jù)類型當(dāng)成對象操作,Java為每一個基本數(shù)據(jù)類型都引入了對應(yīng)的包裝類型(wrapper class),int的包裝類就是Integer,從Java 5開始引入了自動裝箱/拆箱機(jī)制,使得二者可以相互轉(zhuǎn)換。 Java 為每個原始類型提供了包裝類型: - 原始類型: boolean,char,byte,short,int,long,float,double - 包裝類型:Boolean,Character,Byte,Short,Integer,Long,F(xiàn)loat,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應(yīng)用開發(fā)過程中經(jīng)常遇到輸出某種編碼的字符,如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的區(qū)別

    JAVA 平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數(shù)據(jù)。這個String類提供了數(shù)值不可改變的字符串。而這個StringBuffer類提供的字符串進(jìn)行修改。當(dāng)你知道字符數(shù)據(jù)要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態(tài)構(gòu)造字符數(shù)據(jù)。

    請你說明一下int 和 Integer 有什么區(qū)別

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

    請說明String是最基本的數(shù)據(jù)類型嗎?

    基本數(shù)據(jù)類型包括byte、int、char、long、float、double、boolean和short。 java.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。為了提高效率節(jié)省空間,我們應(yīng)該用StringBuffer類。

    請你談?wù)劥驩符號(big-O notation)并給出不同數(shù)據(jù)結(jié)構(gòu)的例子

    大O符號描述了當(dāng)數(shù)據(jù)結(jié)構(gòu)里面的元素增加的時候,算法的規(guī);蛘呤切阅茉谧顗牡膱鼍跋掠卸嗝春。 大O符號也可用來描述其他的行為,比如:內(nèi)存消耗。因為集合類實際上是數(shù)據(jù)結(jié)構(gòu),我們一般使用大O符號基于時間,內(nèi)存和性能來選擇最好的實現(xiàn)。大O符號可以對大量數(shù)據(jù)的性能給出一個很好的說明。

    同時,大O符號表示一個程序運行時所需要的漸進(jìn)時間復(fù)雜度上界。

    其函數(shù)表示是:

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

    大O描述當(dāng)數(shù)據(jù)結(jié)構(gòu)中的元素增加時,算法的規(guī)模和性能在最壞情景下有多好。

    大O還可以描述其它行為,比如內(nèi)存消耗。因為集合類實際上是數(shù)據(jù)結(jié)構(gòu),因此我們一般使用大O符號基于時間,內(nèi)存,性能選擇最好的實現(xiàn)。大O符號可以對大量數(shù)據(jù)性能給予一個很好的說明。

    請你講講數(shù)組(Array)和列表(ArrayList)的區(qū)別?什么時候應(yīng)該使用Array而不是ArrayList?

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

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

    值傳遞是對基本型變量而言的,傳遞的是該變量的一個副本,改變副本不影響原變量. 引用傳遞一般是對于對象型變量而言的,傳遞的是該對象地址的一個副本, 并不是原對象本身 。 所以對引用對象進(jìn)行操作會同時改變原對象. 一般認(rèn)為,java內(nèi)的傳遞都是值傳遞.

    請你講講Java支持的數(shù)據(jù)類型有哪些?什么是自動拆裝箱?

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

    請你解釋為什么會出現(xiàn)4.0-3.6=0.40000001這種現(xiàn)象?

    原因簡單來說是這樣:2進(jìn)制的小數(shù)無法精確的表達(dá)10進(jìn)制小數(shù),計算機(jī)在計算10進(jìn)制小數(shù)的過程中要先轉(zhuǎn)換為2進(jìn)制進(jìn)行計算,這個過程中出現(xiàn)了誤差。

    請你講講一個十進(jìn)制的數(shù)在內(nèi)存中是怎么存的?

    補碼的形式。

    請你說說Lamda表達(dá)式的優(yōu)缺點。

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

    缺點:1. 若不用并行計算,很多時候計算速度沒有比傳統(tǒng)的 for 循環(huán)快。(并行計算有時需要預(yù)熱才顯示出效率優(yōu)勢)2. 不容易調(diào)試。3. 若其他程序員沒有學(xué)過 lambda 表達(dá)式,代碼不容易讓其他語言的程序員看懂。

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

    Lambda 表達(dá)式 ? Lambda允許把函數(shù)作為一個方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中。

    方法引用? 方法引用提供了非常有用的語法,可以直接引用已有Java類或?qū)ο螅▽嵗┑姆椒ɑ驑?gòu)造器。與lambda聯(lián)合使用,方法引用可以使語言的構(gòu)造更緊湊簡潔,減少冗余代碼。

    默認(rèn)方法? 默認(rèn)方法就是一個在接口里面有了一個實現(xiàn)的方法。

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

    Stream API ?新添加的Stream API(java.util.stream) 把真正的函數(shù)式編程風(fēng)格引入到Java中。

    Date Time API ? 加強(qiáng)對日期與時間的處理。

    Optional 類 ? Optional 類已經(jīng)成為 Java 8 類庫的一部分,用來解決空指針異常。

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

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

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

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

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

    請你解釋為什么重寫equals還要重寫hashcode?

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

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

    java為數(shù)據(jù)結(jié)構(gòu)中的映射定義了一個接口java.util.Map;它有四個實現(xiàn)類,分別是HashMap Hashtable LinkedHashMap 和TreeMap.

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

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

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

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

    TreeMap實現(xiàn)SortMap接口,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器,當(dāng)用Iterator 遍歷TreeMap時,得到的記錄是排過序的。

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

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

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

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

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

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


    相關(guān)文章
    熱點文章
    推薦文章