2020面試必知:中高階工程師面試題集整理(題目+答案)

yilian發表於2020-02-18
2020面試必知:中高階工程師面試題集整理(題目+答案)

這些面試題是我準備換工作的時候整理,沒有重點。包括java基礎,資料結構,網路,Android相關等等。

適合中高階工程師。由於內容過多,將會分為上下兩部分。

希望能夠幫到一些朋友,如果幫助到你,希望能夠點個贊。沒有單獨分出來,面試題目都是穿插的。因為有些事外面試過程中遇到的,我就又加上去了。總之你弄懂了這些,基本是沒有問題了。如果是bat那些企業,你還得準備演算法,jvm這些知識。好了,廢話不多說了。

1、java中==和equals和hashCode的區別

基本資料型別的==比較的值相等.

類的==比較的記憶體的地址,即是否是同一個物件,在不覆蓋equals的情況下,同比較記憶體地址,原實現也為 == ,如String等重寫了equals方法.

hashCode也是Object類的一個方法。返回一個離散的int型整數。在集合類操作中使用,為了提高查詢速度。(HashMap,HashSet等比較是否為同一個)

如果兩個物件equals,Java執行時環境會認為他們的hashcode一定相等。

如果兩個物件不equals,他們的hashcode有可能相等。

如果兩個物件hashcode相等,他們不一定equals。

如果兩個物件hashcode不相等,他們一定不equals。

2、int與integer的區別

int 基本型別

integer 物件 int的封裝類

3、String、StringBuffer、StringBuilder區別

String:字串常量 不適用於經常要改變值得情況,每次改變相當於生成一個新的物件

StringBuffer:字串變數 (執行緒安全)

StringBuilder:字串變數(執行緒不安全) 確保單執行緒下可用,效率略高於StringBuffer

4、什麼是內部類?內部類的作用

內部類可直接訪問外部類的屬性

Java中內部類主要分為 成員內部類區域性內部類(巢狀在方法和作用域內)、 匿名內部類(沒構造方法)、 靜態內部類(static修飾的類,不能使用任何外圍類的非static成員變數和方法, 不依賴外圍類)

5、程式和執行緒的區別

6、final,finally,finalize的區別

final:修飾類、成員變數和成員方法,類不可被繼承,成員變數不可變,成員方法不可重寫

finally:與try...catch...共同使用,確保無論是否出現異常都能被呼叫到

finalize:類的方法,垃圾回收之前會呼叫此方法,子類可以重寫finalize()方法實現對資源的回收

7、Serializable 和Parcelable 的區別

Serializable Java 序列化介面 在硬碟上讀寫 讀寫過程中有大量臨時變數的生成,內部執行大量的i/o操作,效率很低。

Parcelable Android 序列化介面 效率高 使用麻煩 在記憶體中讀寫(AS有相關外掛 一鍵生成所需方法) ,物件不能儲存到磁碟中

8、靜態屬性和靜態方法是否可以被繼承?是否可以被重寫?以及原因?

可繼承 不可重寫 而是被隱藏

如果子類裡面定義了靜態方法和屬性,那麼這時候父類的靜態方法或屬性稱之為"隱藏"。如果你想要呼叫父類的靜態方法和屬性,直接透過父類名.方法或變數名完成。

9、成員內部類、靜態內部類、區域性內部類和匿名內部類的理解,以及專案中的應用

10、string 轉換成 integer的方式及原理

String integer Intrger.parseInt(string);

Integerstring Integer.toString();

11、哪些情況下的物件會被垃圾回收機制處理掉?

12、靜態代理和動態代理的區別,什麼場景使用?

靜態代理類:

由程式設計師建立或由特定工具自動生成原始碼,再對其編譯。在程式執行前,代理類的.class檔案就已經存在了。動態代理類:在程式執行時,運用反射機制動態建立而成。

14、Java中實現多型的機制是什麼?

答:方法的重寫Overriding和過載Overloading是Java多型性的不同表現

重寫Overriding是父類與子類之間多型性的一種表現

過載Overloading是一個類中多型性的一種表現.

16、說說你對Java反射的理解

17、說說你對Java註解的理解

18、Java中String的瞭解

在原始碼中string是用final 進行修飾,它是不可更改,不可繼承的常量。

19、String為什麼要設計成不可變的?

20、Object類的equal和hashCode方法重寫,為什麼?

21、List,Set,Map的區別

26、ArrayMap和HashMap的對比

1、儲存方式不同

HashMap內部有一個HashMapEntry[]物件,每一個鍵值對都儲存在這個物件裡,當使用put方法新增鍵值對時,就會new一個HashMapEntry物件,

2、新增資料時擴容時的處理不一樣,進行了new操作,重新建立物件,開銷很大。ArrayMap用的是copy資料,所以效率相對要高。

3、ArrayMap提供了陣列收縮的功能,在clear或remove後,會重新收縮陣列,是否空間

4、ArrayMap採用二分法查詢;

29、HashMap和HashTable的區別

1 HashMap不是執行緒安全的,效率高一點、方法不是Synchronize的要提供外同步,有containsvalue和containsKey方法。

hashtable是,執行緒安全,不允許有null的鍵和值,效率稍低,方法是是Synchronize的。有contains方法方法。Hashtable 繼承於Dictionary 類

30、HashMap與HashSet的區別

31、HashSet與HashMap怎麼判斷集合元素重複?

HashSet不能新增重複的元素,當呼叫add(Object)方法時候,

首先會呼叫Object的hashCode方法判hashCode是否已經存在,如不存在則直接插入元素;如果已存在則呼叫Object物件的equals方法判斷是否返回true,如果為true則說明元素已經存在,如為false則插入元素。

33、ArrayList和LinkedList的區別,以及應用場景

34、陣列和連結串列的區別

35、開啟執行緒的三種方式?

36、執行緒和程式的區別?

執行緒是程式的子集,一個程式可以有很多執行緒,每條執行緒並行執行不同的任務。不同的程式使用不同的記憶體空間,而所有的執行緒共享一片相同的記憶體空間。別把它和棧記憶體搞混,每個執行緒都擁有單獨的棧記憶體用來儲存本地資料。

38、run()和start()方法區別

這個問題經常被問到,但還是能從此區分出面試者對Java執行緒模型的理解程度。start()方法被用來啟動新建立的執行緒,而且start()內部呼叫了run()方法,這和直接呼叫run()方法的效果不一樣。當你呼叫run()方法的時候,只會是在原來的執行緒中呼叫,沒有新的執行緒啟動,start()方法才會啟動新執行緒。

39、如何控制某個方法允許併發訪問執行緒的個數?

semaphore.acquire() 請求一個訊號量,這時候的訊號量個數-1(一旦沒有可使用的訊號量,也即訊號量個數變為負數時,再次請求的時候就會阻塞,直到其他執行緒釋放了訊號量)

semaphore.release() 釋放一個訊號量,此時訊號量個數+1

40、在Java中wait和seelp方法的不同;

Java程式中wait 和 sleep都會造成某種形式的暫停,它們可以滿足不同的需要。wait()方法用於執行緒間通訊,如果等待條件為真且其它執行緒被喚醒時它會釋放鎖,而sleep()方法僅僅釋放CPU資源或者讓當前執行緒停止執行一段時間,但不會釋放鎖。

41、談談wait/notify關鍵字的理解

42、什麼導致執行緒阻塞?執行緒如何關閉?

43、如何保證執行緒安全?

1.synchronized;

2.Object方法中的wait,notify;

3.ThreadLocal機制 來實現的。

44、如何實現執行緒同步?

1、synchronized關鍵字修改的方法。2、synchronized關鍵字修飾的語句塊3、使用特殊域變數(volatile)實現執行緒同步

45、執行緒間操作List

List list = Collections.synchronizedList(new ArrayList());

46、談談對Synchronized關鍵字,類鎖,方法鎖,重入鎖的理解

49、synchronized 和volatile 關鍵字的區別

51、ReentrantLock 、synchronized和volatile比較

ava在過去很長一段時間只能透過synchronized關鍵字來實現互斥,它有一些缺點。比如你不能擴充套件鎖之外的方法或者塊邊界,嘗試獲取鎖時不能中途取消等。Java 5 透過Lock介面提供了更復雜的控制來解決這些問題。 ReentrantLock 類實現了 Lock,它擁有與 synchronized 相同的併發性和記憶體語義且它還具有可擴充套件性。

53、死鎖的四個必要條件?

56、什麼是執行緒池,如何使用?

57、Java中堆和棧有什麼不同?

為什麼把這個問題歸類在多執行緒和併發面試題裡?因為棧是一塊和執行緒緊密相關的記憶體區域。每個執行緒都有自己的棧記憶體,用於儲存本地變數,方法引數和棧呼叫,一個執行緒中儲存的變數對其它執行緒是不可見的。而堆是所有執行緒共享的一片公用記憶體區域。物件都在堆裡建立,為了提升效率執行緒會從堆中弄一個快取到自己的棧,如果多個執行緒使用該變數就可能引發問題,這時volatile 變數就可以發揮作用了,它要求執行緒從主存中讀取變數的值。

58、有三個執行緒T1,T2,T3,怎麼確保它們按順序執行?

最後

暫且分享這些,由於部分答案過長影響閱讀,我已經整理成了一個PDF文件,關注我,可以簡信我【58題】,領取vx:xx13414521

當然,這段時間大家學習的時間比較多,看完文章後也可以學習我收集的這份1612頁的面試指南,滿滿的都是乾貨,希望對大家有幫助!

2020面試必知:中高階工程師面試題集整理(題目+答案)

推薦閱讀: 金三銀四,收下這份最全安卓開發面試指南!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952849/viewspace-2676122/,如需轉載,請註明出處,否則將追究法律責任。

相關文章