2019年_BATJ大廠面試題總結-貝殼篇

1.Java的基礎數據類型有哪些?String是嗎?與封裝類的區別?

byte:8位,最大存儲數據量是255,存放的數據範圍是-128~127之間。

short:16位,最大數據存儲量是65536,數據範圍是-32768~32767之間。

int:32位,最大數據存儲容量是2的32次方減1,數據範圍是負的2的31次方到正的2的31次方減1。

long:64位,最大數據存儲容量是2的64次方減1,數據範圍爲負的2的63次方到正的2的63次方減1。

float:32位,數據範圍在3.4e-45~1.4e38,直接賦值時必須在數字後加上f或F。

double:64位,數據範圍在4.9e-324~1.8e308,賦值時可以加d或D也可以不加。

boolean:只有true和false兩個取值。

char:16位,存儲Unicode碼,用單引號賦值
不是;
1、包裝類是對象,擁有方法和字段,對象的調用都是通過引用對象的地址,基本類型不是

2、包裝類型是引用的傳遞,基本類型是值的傳遞

3、聲明方式不同,基本數據類型不需要new關鍵字,而包裝類型需要new在堆內存中進行new來分配內存空間

4、存儲位置不同,基本數據類型直接將值保存在值棧中,而包裝類型是把對象放在堆中,然後通過對象的引用來調用他們

5、初始值不同,eg: int的初始值爲 0 、 boolean的初始值爲false 而包裝類型的初始值爲null

6、使用方式不同,基本數據類型直接賦值使用就好 ,而包裝類型是在集合如 coolection Map時會使用

PS:jvm在運行時創建了一個緩存區域,並創建了一個Integer的數組。這個數組存儲了-128至127的值。因此如果Integer的值在-128至127之間,則是去緩存裏面獲取。此時,若Integer用“=”賦值,可以直接用==比較。(因爲會指向同一內存地址)可類比String。

2.Java中子類的變量初始化的順序?然後扯了一會類加載器

答案:https://my.oschina.net/u/566591/blog/1619912

3.Juc下面的包說說看,都是怎麼組成的,講講AQS

答案:https://blog.csdn.net/he90227/article/details/82258930
https://segmentfault.com/a/1190000014595928

4.怎麼讓多個線程一起執行?

答案:https://blog.csdn.net/perfectnihil/article/details/90234251

5.緩存怎麼做,爲什麼加緩存,緩存優缺點?

原理:先查詢緩存中有沒有要的數據,如果有,就直接返回緩存中的數據。

如果緩存中沒有要的數據,纔去查詢數據庫,將得到數據先存放到緩存中,然後再返回給java。

優點:
1、 減少了對數據庫的讀操作,數據庫的壓力降低
2、 加快了響應速度

缺點:
1、 因爲內存斷電就清空數據,存放到內存中的數據可能丟失
2、 緩存中的數據可能與數據庫中數據不一致
3、 內存的成本高
4、 內存容量相對硬盤小
參考:https://blog.csdn.net/fengqiangdu/article/details/96475383

6.synchronized和lock的區別?

思路:扯了一下區別然後扯了一下底層實現
答案:
在這裏插入圖片描述
一、原始構成
synchronized是關鍵字屬於JVM層面,monitorenter(底層是通過monitor對象來完成,其實wait/notify等方法也依賴monitor對象只有在同步代碼塊和同步方法中才能調用wait/notify等方法)

Lock是具體的類,是api層面的鎖;

二、使用方法
synchronized不需要用戶手動釋放鎖,synchronized代碼執行完成以後系統會自動讓線程釋放對鎖的佔有

ReentrantLock則需要用戶手動去釋放鎖,若沒有主動釋放鎖,就有可能導致死鎖現象。需要使用lock()和unlock()方法配合try finally語句塊來完成。

三、等待是否可以中斷
synchronized不可中斷,除非拋出異常或者正常運行完成。

ReetrantLock可中斷,

1. 設置超時方法tryLock(long timeout, TimeUnit unit);

2.lockInterruptibly()放入代碼塊中,調用interrupt()方法可中斷;

四、加鎖是否公平
synchronized是非公平鎖

ReentrantLock默認是非公平鎖,可設置爲公平鎖。

五、鎖綁定多個條件condition
synchronized沒有;

ReentrantLock用來實現分組喚醒需要喚醒的線程們,可以精確喚醒,而不是像synchronized要麼隨機喚醒一個,要麼喚醒全部線程。

六、案例
題目:多線程之間按找順序調用,實現A->B->C三個線程啓動,要求如下:

AA打印5次,BB打印10次,CC打印15次,重複上述過程10次.

class ShareResource{
    private int number = 1; // A:1, B:2, C:3
    private Lock lock = new ReentrantLock();
    private Condition conditionA = lock.newCondition();
    private Condition conditionB = lock.newCondition();
    private Condition conditionC = lock.newCondition();
    public void print5(){
        try {
            lock.lock();
            while (number != 1){
                conditionA.await();
            }

            for (int i = 1; i <= 5; i++){
                System.out.print("A");
            }
            System.out.println();
            number++;
            conditionB.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
    public void print10(){
        try {
            lock.lock();
            while (number != 2){
                conditionB.await();
            }

            for (int i = 1; i <= 10; i++){
                System.out.print("B");
            }
            System.out.println();
            number++;
            conditionC.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void print15(){
        try {
            lock.lock();
            while (number != 3){
                conditionC.await();
            }

            for (int i = 1; i <= 15; i++){
                System.out.print("C");
            }
            System.out.println();
            number = 1;
            conditionA.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}
public class SynchronizedLockDifference {

    public static void main(String[] args) {
        ShareResource shareResource = new ShareResource();
        new Thread(()->{
            for (int i = 1; i <= 10; i++){
                shareResource.print5();
            }
        }, "A").start();

        new Thread(()->{
            for (int i = 1; i <= 10; i++){
                shareResource.print10();
            }
        }, "B").start();

        new Thread(()->{
            for (int i = 1; i <= 10; i++){
                shareResource.print15();
            }
        }, "C").start();

    }
}

輸出結果:

AAAAA
BBBBBBBBBB
CCCCCCCCCCCCCCC
AAAAA
BBBBBBBBBB
CCCCCCCCCCCCCCC
AAAAA
BBBBBBBBBB
CCCCCCCCCCCCCCC
AAAAA
BBBBBBBBBB
CCCCCCCCCCCCCCC
AAAAA
BBBBBBBBBB
CCCCCCCCCCCCCCC
AAAAA
BBBBBBBBBB
CCCCCCCCCCCCCCC
AAAAA
BBBBBBBBBB
CCCCCCCCCCCCCCC
AAAAA
BBBBBBBBBB
CCCCCCCCCCCCCCC
AAAAA
BBBBBBBBBB
CCCCCCCCCCCCCCC
AAAAA
BBBBBBBBBB
CCCCCCCCCCCCCCC

詳解:https://blog.csdn.net/hefenglian/article/details/82383569

7.Redis的發佈和訂閱機制?

答案:https://blog.csdn.net/gududedabai/article/details/80326129

8.Redis的事務怎麼處理的?怎麼保證事務之間互不影響?

答案:https://blog.csdn.net/weixin_41282397/article/details/87618004

9.shiro權限控制怎麼做的,核心類

答案:https://blog.csdn.net/qq_28000789/article/details/86499750

10.SpringCloud的組成構件?

答案:https://www.cnblogs.com/ghl0518/p/11057589.html
https://blog.csdn.net/zy1471162851/article/details/88703049

11.Redis單線程嗎?爲什麼這麼設計?

答案:
1.redis 核心就是 如果我的數據全都在內存裏,我單線程的去操作 就是效率最高的,爲什麼呢,因爲多線程的本質就是 CPU 模擬出來多個線程的情況,這種模擬出來的情況就有一個代價,就是上下文的切換,對於一個內存的系統來說,它沒有上下文的切換就是效率最高的。redis 用 單個CPU 綁定一塊內存的數據,然後針對這塊內存的數據進行多次讀寫的時候,都是在一個CPU上完成的,所以它是單線程處理這個事。在內存的情況下,這個方案就是最佳方案 —— 阿里 沈詢
2.詳解:https://blog.csdn.net/u010122604/article/details/92829855

12.Spring事務傳遞

7種事務的傳播機制(可通過spring配置或註解來設置)
REQUIRED(默認):支持使用當前事務,如果當前事務不存在,創建一個新事務。
SUPPORTS:支持使用當前事務,如果當前事務不存在,則不使用事務。
MANDATORY:中文翻譯爲強制,支持使用當前事務,如果當前事務不存在,則拋出Exception。
REQUIRES_NEW:創建一個新事務,如果當前事務存在,把當前事務掛起。
NOT_SUPPORTED:無事務執行,如果當前事務存在,把當前事務掛起。
NEVER:無事務執行,如果當前有事務則拋出Exception。
NESTED:嵌套事務,如果當前事務存在,那麼在嵌套的事務中執行。如果當前事務不存在,則表現跟REQUIRED一樣。
註解配置時如:@Transactional(propagation=Propagation.REQUIRED)
詳解:https://blog.csdn.net/GarfieldEr007/article/details/83052636

13.Jvm g1和cms的區別?

答案:https://www.cnblogs.com/rayduan/p/xrq730.html
https://blog.csdn.net/zsj777/article/details/80353464

14.Jvm 內存結構

答案:一文搞懂JVM內存結構

15.Jvm 堆讓你寫代碼來造成內存溢出

答案:https://www.cnblogs.com/gl-developer/p/6102282.html

16.Jvm 鎖相關

答案:https://blog.csdn.net/huangwei18351/article/details/81369002

17.Java Integer.parseInt()的源碼

最詳細的答案:
https://blog.csdn.net/brucexiajun/article/details/100996668

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章