每日十道面試題(六)

1.訪問修飾符public,private,protected,以及不寫(默認)時的區別?

修飾符 當前類 同包 子類 其他包
public
protected x
default x x
private x x x

類成員不寫修飾符默認爲default,私有的只能當前類,public所有類,protected可以子類對不是同一包中的沒有父子關係的類相當於私有,default默認對不同包不行

2.int和Integer有什麼區別?

首先int是基本類型之一,integer是包裝類是對象,而且有緩存對於-128-127之間,

  • 原始類型: boolean,char,byte,short,int,long,float,double

  • 包裝類型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

從Java 5開始引入了自動裝箱/拆箱機制,使得二者可以相互轉換。

3.String和StringBuilder、StringBuffer的區別?

它們可以儲存和操作字符串。其中String是隻讀字符串,它的底層是final修飾過的,如果修改值,那麼會返回一個新地址,從而證明不能修改原來的,所以不可變

StringBuffer,有synchronized修飾 StringBuilder沒有,所以單線程下我們都使用StringBuilder提高效率,而且String的+號其實是也是new的一個StringBuilder利用append然後拼接的返回的toString();

4.HashMap的⻓度爲什麼是2的冪次⽅?

  1. 通過將Key的hash值與length-1進⾏&運算,實現了當前Key的定位,2的冪次⽅可以減少衝突(碰撞)的次數,提⾼HashMap查詢效率

  2. 如果length爲2的次冪 則length-1 轉化爲⼆進制必定是11111……的形式,在於h的⼆進制與操作效率會⾮常的快,⽽且空間不浪費;如果length不是2的次冪,⽐如length爲15,則length-1爲14,對應的⼆進製爲1110,在於h與操作,最後⼀位都爲0,⽽0001,0011,0101,1001,1011,0111,1101這⼏個位置永遠都不能存放元素了,空間浪費相當⼤,更糟的是這種情況中,數組可以使⽤的位置⽐數組⻓度⼩了很多,這意味着進⼀步增加了碰撞的⼏率,減慢了查詢的效率!這樣就會造成空間的浪費。

5.Comparable接⼝和Comparator接⼝有什麼區別?

Comparable: 內部比較器,一個類如果想要使用 Collections.sort(list) 方法進行排序,則需要實現該接口

Comparator: 外部比較器, 用於對那些沒有實現Comparable接口或者對已經實現的Comparable中的排序規則不滿意進行排序.無需改變類的結構,更加靈活。可以重寫compareTo方法進行重寫排序的規則

實現Comparable接口的方式比實現Comparator接口的耦合性 要強一些,如果要修改比較算法,要修改Comparable接口的實現類,而實現Comparator的類是在外部進行比較的,不需要對實現類有任何修 改

public class PersonComparator implements Comparator<Person> {
    //排序算法,自己實現排序邏輯
    @Override
    public int compare(Person o1, Person o2) {
        //因爲Person對象的age屬性使Integer類型的,Integer實現了Comparable接口,實現了compareTo方法
        return o1.getAge().compareTo(o2.getAge());
    }
}

6.Class.forName的作⽤?爲什麼要用

它實際是用指定的全限定類名字符串去尋找該類,如果該類被加載過,直接返回該字節碼實例對象,否則的話雙親委派機制一層一層的找,如果都找不到就會報錯ClassNoFound,。加載完這個Class字節碼後,接着就可以使⽤Class字節碼的newInstance⽅法去創建該類的實例對象了。

實際上就是反射,我們可以動態得到一個類的信息,而且很多類都是編譯器才知道的,需要動態的去加載類,就需要知道類名,這時候就需要使⽤Class.forName去動態加載該類,這個類名通常是在配置⽂件中配置的,

例如,spring的ioc中每次依賴注⼊的具體類就是這樣配置的在spring-factories中就有許多類名,jdbc的驅動類名通常也是通過配置⽂件來配置的,以便在產品交付使⽤後不⽤修改源程序就可以更換驅動類

7. Mysql中有哪⼏種鎖?

MyISAM⽀持表鎖,InnoDB⽀持表鎖和⾏鎖,默認爲⾏鎖,還有讀寫鎖,排他鎖for update

表級鎖:開銷⼩,加鎖快,不會出現死鎖。鎖定粒度⼤,發⽣鎖衝突的概率最⾼,併發量最低

⾏級鎖:開銷⼤,加鎖慢,會出現死鎖。鎖⼒度⼩,發⽣鎖衝突的概率⼩,併發度最⾼

8.並行和併發的區別?

併發:一個處理器可以同時處理多個任務。這是邏輯上的同時發生。
並行:多個處理器同時處理多個不同的任務。這是物理上的同時發生。
有一個清晰地比喻:
併發:一個人同時吃三個蘋果。並行:三個人同時吃三個蘋果。

9.多線程和單線程的區別和聯繫

並不是單線程一定比多線程慢,兩者沒有絕對的,得根據電腦cpu處理器等還有處理機制

  1. 在單核cpu中,cpu分爲很多很小得時間片,每一個時刻一個線程在執行,是一種微觀上輪流佔用cpu得機制,看起來在並行,實質是時間片短,下一個緊接着處理所以會容易看成並行
  2. 多線程的話,因爲存在線程上下文切換,甚至要切換爲內核態再回到用戶態,會導致執行效率變慢,所以一個擁有兩個線程的進程執行的時間會比一個線程執行兩次的進程長

多線程不會提高程序的執行速度,但是會減少用戶的響應時間,提高用戶體驗感

10.什麼是bean的自動裝配?

再說自動裝配之前,我們先聊一聊什麼是手動裝配。

手動裝配就是我們在先前講的那些,要自己給定屬性,然後賦值

Spring IOC容器可以自動裝配Bean,需要做的僅僅實在的autowire屬性裏指定自動裝配的模式

byType(根據類型自動裝配):若IOC容器中有多個與目標Bean類型一致的Bean。在這種情況下,Spring將無法判斷哪個Bean最合適該屬性,所以不能執行自動配置。

byName(根據名稱自動裝配):必須將目標Bean的名稱和屬性名設置的完全相同。

constructor(通過構造器自動裝配):當Bean中存在多個構造器時,此種自動裝配方式會很複雜,不推薦使用

註解的話還可以通過@AutoWire或者@Resource進行自動裝配,前者按名字,後者按類型

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