2021-06-14 java面經(jīng)更新

  1. 第一道面試題 面向?qū)ο?/p>

    面向?qū)ο螅幚韱栴}的兩種不同角度

    比如洗衣服,我需要打開洗衣機(jī) 放衣服 倒洗衣液 點(diǎn)開始清洗 烘干

    面向過程更注重事情的每一個(gè)步驟和順序

    面向?qū)ο蟾⒅厥虑橛心男﹨⑴c者對(duì)象,以及對(duì)象需要干什么(屬性,方法)

    面向?qū)ο髸?huì)拆出兩個(gè)對(duì)象 人:打開洗衣機(jī) 放衣服 倒洗衣液 洗衣機(jī) :清洗 烘干

    面向過程高效,面向?qū)ο蟾子趶?fù)用,擴(kuò)展和維護(hù)

    封裝:封裝的意義,在于明確標(biāo)識(shí)出允許外部使用的成員函數(shù)和數(shù)據(jù)項(xiàng)

    內(nèi)部細(xì)節(jié)對(duì)外部調(diào)用透明,外部調(diào)用無需修改或者關(guān)心內(nèi)部實(shí)現(xiàn)

    1、 javabean的屬性私有 get/set

    private String name;

    public void setName(String name)

    {

    this.name = "tuling_"+name;

    }

    2、orm框架 引入mybatis 調(diào)方法即可

    繼承:繼承基類的方法,并作出自己的改變或拓展

    子類共性的方法或者屬性直接使用父類的,而不需要自己再定義,只需擴(kuò)展自己個(gè)性化的

    多態(tài):繼續(xù)對(duì)象所屬類的不同,外部對(duì)同一個(gè)方法的調(diào)用,實(shí)際執(zhí)行的邏輯不同。

  2. jvm的理解

    運(yùn)行時(shí)數(shù)據(jù)區(qū): 堆 棧(線程棧) 方法區(qū):又叫靜態(tài)區(qū),跟堆一樣,被所有的線程共享。它用于存儲(chǔ)已經(jīng)被虛擬機(jī)加載的類信息、常量、靜態(tài)變 量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。 本地方法棧 程序計(jì)數(shù)器 棧包含局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出口。堆分Eden,Survivor區(qū)分s0,s1,年輕代,老年代。

  3. jdk jre jvm三者關(guān)系

    jdk java開發(fā)工具 給開發(fā)人員用的 jre java 運(yùn)行時(shí)環(huán)境 jvm j虛擬機(jī) jdk包含jre和java工具 jre包含jvm

  4. ==和equals的區(qū)別

    ==:對(duì)比的是棧中的值,基本數(shù)據(jù)類型就是變量值,引用類型是堆中內(nèi)存對(duì)象的地址

    equals:首先,equals()方法不能作用于基本數(shù)據(jù)類型的變量,

    另外,equals()方法存在于Object類中,而Object類是所有類的直接或間接父類,所以說所有類中的equals()方法都繼承自O(shè)bject類,在沒有重寫equals()方法的類中,調(diào)用equals()方法其實(shí)和使用==的效果一樣,也是比較的是引用類型的變量所指向的對(duì)象的地址,不過,Java提供的類中,有些類都重寫了equals()方法,重寫后的equals()方法一般都是比較兩個(gè)對(duì)象的值,比如String類。 需要注意的是:當(dāng)參數(shù)是基本類型int時(shí),編譯器會(huì)給int自動(dòng)裝箱成Integer類,然后再進(jìn)行比較。先比較是否是同類型,非同類型直接返回false。同類型再比較值 IntegerCache 緩存

    IntegerCache 緩存:JAVA的Integer有IntegerCache會(huì)緩存-128~127之間的對(duì)象。如:Integer x = 100,會(huì)調(diào)用Integer的valueOf()方法,這個(gè)方法就是返回一個(gè)Integer對(duì)象,但是在返回前,作了一個(gè)判斷,判斷要賦給對(duì)象的值是否在[-128,127]區(qū)間中,且IntegerCache(是Integer類的內(nèi)部類,里面有一個(gè)Integer對(duì)象數(shù)組,用于存放已經(jīng)存在的且范圍在[-128,127]中的對(duì)象)中是否存在此對(duì)象,如果存在,則直接返回引用,否則,創(chuàng)建一個(gè)新對(duì)象返回。

  5. int和Integer的區(qū)別

    1 區(qū)別
    Integer是int的包裝類,int則是java的一種基本數(shù)據(jù)類型
    Integer變量必須實(shí)例化后才能使用,而int變量不需要
    Integer實(shí)際是對(duì)象的引用,當(dāng)new一個(gè)Integer時(shí),實(shí)際上是生成一個(gè)指針指向此對(duì)象;而int則是直接存儲(chǔ)數(shù)據(jù)值
    Integer的默認(rèn)值是null,int的默認(rèn)值是0。

    2 ==比較
    1、由于Integer變量實(shí)際上是對(duì)一個(gè)Integer對(duì)象的引用,所以兩個(gè)通過new生成的Integer變量永遠(yuǎn)是不相等的(因?yàn)閚ew生成的是兩個(gè)對(duì)象,其內(nèi)存地址不同)。
    Integer i = new Integer(100);
    Integer j = new Integer(100);
    System.out.print(i == j); //false
    2、Integer變量和int變量比較時(shí),只要兩個(gè)變量的值是向等的,則結(jié)果為true(因?yàn)榘b類Integer和基本數(shù)據(jù)類型int比較時(shí),java會(huì)自動(dòng)拆包裝為int,然后進(jìn)行比較,實(shí)際上就變?yōu)閮蓚€(gè)int變量的比較)
    Integer i = new Integer(100);
    int j = 100;
    System.out.print(i == j); //true
    3、非new生成的Integer變量和new Integer()生成的變量比較時(shí),結(jié)果為false。(因?yàn)榉莕ew生成的Integer變量指向的是java常量池中的對(duì)象,而new Integer()生成的變量指向堆中新建的對(duì)象,兩者在內(nèi)存中的地址不同)
    Integer i = new Integer(100);
    Integer j = 100;
    System.out.print(i == j); //false
    4、對(duì)于兩個(gè)非new生成的Integer對(duì)象,進(jìn)行比較時(shí),如果兩個(gè)變量的值在區(qū)間-128到127之間,則比較結(jié)果為true,如果兩個(gè)變量的值不在此區(qū)間,則比較結(jié)果為false
    Integer i = 100;
    Integer j = 100;
    System.out.print(i == j); //true
    Integer i = 128;
    Integer j = 128;
    System.out.print(i == j); //false
    對(duì)于第4條的原因:
    java在編譯Integer i = 100 ;時(shí),會(huì)翻譯成為Integer i = Integer.valueOf(100);,而java API中對(duì)Integer類型的valueOf的定義如下:

    public static Integer valueOf(int i){
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high){
    return IntegerCache.cache[i + (-IntegerCache.low)];
    }
    return new Integer(i);
    }
    java對(duì)于-128到127之間的數(shù),會(huì)進(jìn)行緩存,Integer i = 127時(shí),會(huì)將127進(jìn)行緩存,下次再寫Integer j = 127時(shí),就會(huì)直接從緩存中取,就不會(huì)new了。

  6. String s = new String(“abc”);產(chǎn)生幾個(gè)對(duì)象?

    答:一個(gè)或兩個(gè),如果常量池中原來沒有”abc”,就是兩個(gè)。

    我們?cè)賮砜纯?String str = new String("abc")創(chuàng)建過程 :
    (1) 先定義一個(gè)名為str的對(duì)String類的對(duì)象引用變量放入棧中。
    (2) 然后在堆中(不是常量池)創(chuàng)建一個(gè)指定的對(duì)象,并讓str引用指向該對(duì)象。
    (3) 在常量池中查找是否存在內(nèi)容為"abc"字符串對(duì)象。
    (4) 如果不存在,則在常量池中創(chuàng)建內(nèi)容為"abc"的字符串對(duì)象,并將堆中的對(duì)象與之聯(lián)系起來。
    (5) 如果存在,則將new出來的字符串對(duì)象與字符串常量池中的對(duì)象聯(lián)系起來(即讓那個(gè)特殊的成員變量value的指 針指向它)

本題來源于 https://zhuanlan.zhihu.com/p/68794639,安利一波,文章關(guān)于java堆、棧、堆棧,常量池的區(qū)別,史上最全總結(jié)。關(guān)于理解String.intern()的理解,https://blog.csdn.net/tyyking/article/details/82496901網(wǎng)站介紹的很清楚。

img
  1. 在JAVA中,有六個(gè)不同的地方可以存儲(chǔ)數(shù)據(jù):
  1. 寄存器(register):這是最快的存儲(chǔ)區(qū),因?yàn)樗挥诓煌谄渌鎯?chǔ)區(qū)的地方——處理器內(nèi)部。但是寄存器的數(shù)量極其有限,所以寄存器由編譯器根據(jù)需求進(jìn)行分配。你不能直接控制,也不能在程序中感覺到寄存器存在的任何跡象。
  1. 棧(stack):存放基本類型的變量數(shù)據(jù)和對(duì)象的引用。位于通用RAM中,但通過它的“堆棧指針”可以從處理器哪里獲得支持。堆棧指針若向下移動(dòng),則分配新的內(nèi)存;若向上移動(dòng),則釋放那些內(nèi)存。這是一種快速有效的分配存儲(chǔ)方法,僅次于寄存器。創(chuàng)建程序時(shí)候,JAVA編譯器必須知道存儲(chǔ)在堆棧內(nèi)所有數(shù)據(jù)的確切大小和生命周期,因?yàn)樗仨毶上鄳?yīng)的代碼,以便上下移動(dòng)堆棧指針。這一約束限制了程序的靈活性。
  1. 堆(heap):一種通用性的內(nèi)存池(也存在于RAM中),用于存放所有的JAVA對(duì)象。堆不同于堆棧的好處是:編譯器不需要知道要從堆里分配多少存儲(chǔ)區(qū) 域,也不必知道存儲(chǔ)的數(shù)據(jù)在堆里存活多長(zhǎng)時(shí)間。因此,在堆里分配存儲(chǔ)有很大的靈活性。當(dāng)你需要?jiǎng)?chuàng)建一個(gè)對(duì)象的時(shí)候,只需要new寫一行簡(jiǎn)單的代碼,當(dāng)執(zhí)行 這行代碼時(shí),會(huì)自動(dòng)在堆里進(jìn)行存儲(chǔ)分配。當(dāng)然,為這種靈活性必須要付出相應(yīng)的代價(jià),用堆進(jìn)行存儲(chǔ)分配比用堆棧進(jìn)行存儲(chǔ)存儲(chǔ)需要更多的時(shí)間。
  1. 靜態(tài)存儲(chǔ)(static storage):這里的“靜態(tài)”是指“在固定的位置”。靜態(tài)存儲(chǔ)里存放程序運(yùn)行時(shí)一直存在的數(shù)據(jù)。你可用關(guān)鍵字static來標(biāo)識(shí)一個(gè)對(duì)象的特定元素是靜態(tài)的,但JAVA對(duì)象本身從來不會(huì)存放在靜態(tài)存儲(chǔ)空間里。
  1. 常量存儲(chǔ)(constant storage):存放字符串常量和基本類型常量(public static final)。 常量值通常直接存放在程序代碼內(nèi)部,這樣做是安全的,因?yàn)樗鼈冇肋h(yuǎn)不會(huì)被改變。
  1. 非RAM存儲(chǔ):硬盤等永久存儲(chǔ)空間。如果數(shù)據(jù)完全存活于程序之外,那么它可以不受程序的任何控制,在程序沒有運(yùn)行時(shí)也可以存在。

    就速度來說,有如下關(guān)系:
    寄存器 < 堆棧 < 堆 < 其他

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容