android阿里面試java基礎錦集

何時夕發表於2018-02-02

接著上一篇 android阿里面試錦集 今天給大家帶來一篇 android阿里面試java基礎錦集。很多知識都是Thinking in Java上面的,所以如果要深入大家可以看看這本書。

1.過載函式的簽名(區別是否是過載函式)

方法名+引數型別+引數順序(返回值不是)

2.finalize的工作原理

一旦垃圾收集器準備好釋放物件佔用的儲存空間,它首先呼叫finalize(),而且只有在下一次垃圾收集過程中,才會真正回收物件的記憶體.所以如果使用finalize(),就可以在垃圾收集期間進行一些重要的清除或清掃工作。此外系統進行垃圾回收時並不保證一定會呼叫它,所以可以說它和物件被回收沒有必然關係。

3.一個物件的建立過程

例如有一個Dog類:

  • 1.即使沒有static,構造器其實也是靜態方法,所以當首次建立Dog時或者Dog的靜態域或者靜態方法被訪問的時候,Dog的class物件會被載入。
  • 2.在載入Dog的class的時候可能會發現其有基類,此時先暫停Dog的載入,轉而去載入其基類。所以基類的static域比子類先初始化。
  • 3.載入class檔案之後,會建立一個該該類的class物件,所有關於靜態初始化的動作會被執行,所以靜態初始化只在Class物件首次載入時進行一次。
  • 4.當使用new的時候,首先為Dog物件在堆上分配足夠記憶體空間。這塊記憶體控制元件會被清零,所有例項都被初始化成了預設值,包括基類。
  • 5.執行所有欄位定義處的初始化,從基類開始。
  • 6.執行構造器。(在第一行會執行基類的構造器)

4.物件的銷燬是按照建立的逆序來進行的。

5.final的方法和類都不允許覆蓋和繼承。private預設實現了final。

6.簡述內部類的特點

  • 1.內部類只能在與其外圍類的物件關聯的情況下才能被建立(非static)
  • 2.內部類在建立的時候,捕獲了一個外圍類的物件,所以能訪問外圍類的private物件。(非static)
  • 3.如果其他類對內部類有訪問許可權的話(如public),那麼可以通過 外圍類物件.new內部類(),這樣的方式建立內部物件,注意如果沒有外圍類的物件,內部類是不允許建立的。(非static)
  • 4.多層巢狀的內部類能夠透明的訪問所有外圍類的所有成員。
  • 5.內部類不能被覆蓋
  • 6.內部類讓java模擬了多繼承,讓外圍類繼承一個類,然後內部類繼承一個類,又要有內部類物件必須有對應的外圍類物件。
  • 7.static的內部類,和普通的類基本相同。

7.形式引數可被視為local variable,也就是說形式引數相當於在方法中定義了一個區域性變數a,當傳入c時,只是將c指向的物件給a###

8.finally 語句塊是在 try 或者 catch 中的 return 語句之前執行的

9.簡述jvm中預設的classLoader與功能

  • 1.Bootstrap ClassLoader:負責載入java基礎類,主要是 %JRE_HOME/lib/ 目錄下的rt.jar、resources.jar、charsets.jar和class等
  • 2.Extension ClassLoader:負責載入java擴充套件類,主要是 %JRE_HOME/lib/ext 目錄下的jar和class
  • 3.App ClassLoader:負責載入當前java應用的classpath中的所有類。
  • 4.classloader 載入類用的是全盤負責雙親委託機制。
    • 1.所謂全盤負責,即是當一個classloader載入一個Class的時候,這個Class所依賴的和引用的所有 Class也由這個classloader負責載入,除非是顯式的使用另外一個classloader載入。所以,當我們自定義的classloader載入成功了 com.company.MyClass以後,MyClass裡所有依賴的class都由這個classLoader來載入完成。
    • 2.雙親委託,是指子類載入器如果沒有載入過該目標類,就先委託父類載入器載入該目標類,只有在父類載入器找不到位元組碼檔案的情況下才從自己的類路徑中查詢並裝載目標類。

10.switch語句後的控制表示式只能是short、char、int、long整數型別和列舉型別,不能是float,double和boolean型別。String型別是java7開始支援

11.重寫的特性

  • 1.方法名相同,引數型別和順序相同
  • 2.子類返回型別小於等於父類方法返回型別。即:子類返回的型別要為父類的子類
  • 3.子類丟擲異常小於等於父類方法丟擲異常。即:子類丟擲的異常型別要為父類的子類
  • 4.子類訪問許可權大於等於父類方法訪問許可權。

12.!=和==,當用於基本型別時候,是比較值是否相同;當用於引用型別的時候,是比較物件是否相同,比較記憶體地址

13.null可以被強制型別轉換成任意型別的物件,於是通過它來執行靜態方法

14.如何終止一個執行緒###

  • 1.如果執行緒中是迴圈或者執行緒已經sleep(),可以通過Excutor產生一箇中斷,
  • 2.處於迴圈中的話,還可以設定一個標誌位,一旦為false就讓迴圈退出此時執行緒也會接著終止。
  • 3.如果執行緒處於io之中,那麼可以通過關閉io來使執行緒結束。

15.靜態屬性和靜態方法是否可以被繼承

非靜態屬性、靜態屬性、靜態方法 都可以被子類繼承,但是不會被覆蓋,轉為哪個類,呼叫的就是那個類的東西。也就是說這幾個東西不具有多型。

16.列出各種List,Set,Map,Queue並說出他們的同與不同。

  • 1.List:ArrayList、LinkedList、Vector、CopyOnWriteArrayList
    • 1.ArrayList:常用的List,非執行緒安全、內部使用陣列來實現、對於隨機訪問get和set,ArrayList優於LinkedList
    • 2.LinkedList:執行緒非安全、內部用連結串列來實現、對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動資料。
    • 3.Vector:Vector的方法都是同步的、是執行緒安全的、當Vector或ArrayList中的元素超過它的初始大小時,Vector會將它的容量翻倍,而ArrayList只增加50%的大小,這樣,ArrayList就有利於節約記憶體空間。
    • 4.CopyOnWriteArrayList:ArrayList 的一個執行緒安全的變體,其中所有可變操作(add、set 等等)都是通過對底層陣列進行一次新的複製來實現的,在CopyOnWriteArrayList中,寫入將導致建立整個底層陣列的副本,而源陣列將保留在原地,使得複製的陣列在被修改時,讀取操作可以安全的執行。當修改完成時,一個原子性的操作將把新的陣列換入,使得新的讀取操作可以看到這個新的修改。這對於讀操作遠遠多於寫操作的應用非常適合
  • 2.Set:HashSet、TreeSet、LinkedHashSet、CopyOnWriteArraySet、EnumSet
    • 1.HashSet:非執行緒安全、放入的元素需要重寫equals()和hashCode()方法,才能避免放入元素重複,並且難以被發現。
    • 2.TreeSet:非執行緒安全、其內部使用紅黑樹儲存元素、TreeSet儲存的型別必須實現comparable介面。
    • 3.LinkedHashSet:非執行緒安全、以元素插入的順序來維護集合的連結表,其他地方和HashMap類似。
      1. CopyOnWriteArraySet:執行緒安全、CopyOnWriteArraySet基於CopyOnWriteArrayList實現。
      1. EnumSet是一個專門為列舉類設計的集合類,EnumSet中所有元素都必須是指定列舉型別的列舉值,該列舉型別在建立EnumSet時顯式、或隱式地指定。EnumSet的集合元素也是有序的,它們以列舉值在Enum類內的定義順序來決定集合元素的順序。
  • 3.Map:HashMap、TreeMap、LinkedHashMap、HashTable、ConcurrentHashMap、WeakHashMap、EnumMap
    • 1.HashMap:非執行緒安全、其內部使用連結串列法解決雜湊衝突、key需要重寫equals()和hashCode()方法,其內部在獲取元素的時候先通過hashCode()獲取到某條連結串列,再通過equals()方法在這條連結串列中找到該元素。
    • 2.TreeMap:非執行緒安全、TreeMap的實現是紅黑樹演算法的實現,key必須實現comparable介面。
    • 3.LinkedHashMap:非執行緒安全、這個map是按插入順序遍歷該map,以雜湊插入。還可以在建構函式中設定引數,使其以LRU演算法排序。其獲取的Set能體現出排序的方式。
    • 4.HashTable:執行緒安全、所有的的方法都是同步的、key和value不能為null。
    • 5.ConcurrentHashMap:執行緒安全、ConcurrentHashMap融合了hashtable和hashmap二者的優勢、實現了細粒度的鎖,也就是不是所有地方都上鎖,效能比HashTable好。
    • 6.WeakHashMap與HashMap的用法基本相似。區別在於,HashMap的key保留了對實際物件的"強引用",這意味著只要該HashMap物件不被銷燬,該HashMap所引用的物件就不會被垃圾回收。但WeakHashMap的key只保留了對實際物件的弱引用,這意味著如果WeakHashMap物件的key所引用的物件沒有被其他強引用變數所引用,則這些key所引用的物件可能被垃圾回收,當垃圾回收了該key所對應的實際物件之後,WeakHashMap會自動刪除這些key所對應的key-value對
    • 7.EnumMap:EnumMap是一個與列舉類一起使用的Map實現,EnumMap中的所有key都必須是單個列舉類的列舉值。建立EnumMap時必須顯式或隱式指定它對應的列舉類。EnumMap根據key的自然順序(即列舉值在列舉類中的定義順序)。
  • 4.Queue:ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue、PriorityQueue。
    • 1.ArrayBlockingQueue:執行緒安全、基於陣列的阻塞佇列實現,在ArrayBlockingQueue內部,維護了一個定長陣列,以便快取佇列中的資料物件。同一時間只能有一個執行緒進行操作。
    • 2.LinkedBlockingQueue:基於連結串列的阻塞佇列,同ArrayListBlockingQueue類似,其內部也維持著一個資料緩衝佇列,當生產者往佇列中放入一個資料時,佇列會從生產者手中獲取資料,並快取在佇列內部,而生產者立即返回、只有當佇列緩衝區達到最大值快取容量時(LinkedBlockingQueue可以通過建構函式指定該值),才會阻塞生產者佇列,直到消費者從佇列中消費掉一份資料,生產者執行緒會被喚醒。可以有多個執行緒進行同時操作。
    • 3.DelayQueue: DelayQueue裡面放的是實現了Delayed的介面,Delayed介面需要實現兩個方法:getDelay(TimeUnit unit)是為了返回該任務鎖需延長的時間,compareTo(Delayed o)是為了比較到底那個任務需要排在前面,當使用queue.take()的時候延時開始,此時本執行緒掛起,直到延時結束開始執行run()中的任務。
    • 4.PriorityBlockingQueue: 基於優先順序的阻塞佇列(優先順序的判斷通過建構函式傳入的Compator物件來決定),但需要注意的是PriorityBlockingQueue並不會阻塞資料生產者,而只會在沒有可消費的資料時,阻塞資料的消費者。因此使用的時候要特別注意,生產者生產資料的速度絕對不能快於消費者消費資料的速度,否則時間一長,會最終耗盡所有的可用堆記憶體空間。
    • 5.PriorityQueue:非執行緒安全的優先佇列。

17.列出幾種執行緒池

  • 1.ThreadPoolExecutor:通過Executors可以構造單執行緒池、固定數目執行緒池、不固定數目執行緒池。
  • 2.ScheduledThreadPoolExecutor:可以延時呼叫執行緒或者延時重複排程執行緒。

18.解釋一下java記憶體模型

  • 1.每個執行緒有自己的共享變數副本(例項域、靜態域、陣列元素)
  • 2.Java執行緒之間的通訊由java記憶體模型控制(JMM),JMM決定了一個執行緒對共享變數的寫入在什麼時候對另一個執行緒可見。
  • 3.當一個A執行緒改變了一個共享變數,此時只是改變了自己本地共享變數的副本,所以執行緒之間要實現通訊需要先將A執行緒的本地副本,刷入到主存之中,然後執行緒B去主存中讀取執行緒A刷入的改變的變數。

19.解釋一下java程式碼的原子性

  • 1.除了long和double,其他基本型別的簡單操作都是原子性操作:讀取、寫入數字。
  • 2.java1.5之後使用volatile關鍵字能夠讓long和double像其他基本型別一樣。
  • 3.不能因為有原子性,就放棄同步。

20.解釋一下volatile欄位###

  • 1.在瞭解了java記憶體模型之後,我們知道volatile關鍵字保證了,某個共享變數改變之後,另一個執行緒中本地共享變數的副本也會立即重新整理。
  • 2.當某個域的值依賴於它之前的值,如計數遞增那麼volatile就會失效。
  • 3.使用volatile而不使用synchronized的唯一情況就是類中只有一個可變域,其他時候都應該使用synchronized。

21.解釋一下synchronized欄位

  • 1.synchronized可以用於修飾方法,在某執行緒從某個用synchronized修飾的方法返回之前,其他所有要呼叫這個物件中任意使用synchronized修飾的方法的執行緒都會被阻塞。即同一時刻某個物件中只能有一個synchronized修飾的方法被呼叫。
  • 2.對於某個物件,其所有synchronized方法共享一把鎖,也就是說一個物件中含有一把鎖(也叫監視器)。
  • 3.一個執行緒可以多次獲取某個物件的鎖,比如一個synchronized方法中呼叫了該物件中另一個synchronized方法。那麼這個鎖的計數就會變成2,每從一個synchronized方法離開都會使計數減一,每進入一個synchronized方法都會使計數加一。
  • 4.每個類也有一把鎖(屬於類的Class的一部分),所以synchronized static可以防止類範圍內對於static資料的併發訪問。

22.Lock的使用

  • 1.在lock()和unlock()之間我們可以建立一個臨界資源,同時一時刻只能有一個執行緒訪問這個資源。。
  • 2.我們可以對臨界區域進行異常捕捉,注意return必須在try裡面,防止過早釋放臨界資源。
  • 3.使用Lock的好處就在於我們能處理某些異常,而使用synchronized我們無法對異常進行清理工作。

23.wait()和sleep()區別

  • 1.該方法在Object中,可以將當前執行緒掛起,需要在synchronized控制的塊中,因為wait需要獲取需要掛起的執行緒所要處理物件的鎖,否則會報錯。在wait()中鎖是被釋放的。
  • 2.該方法是屬於Thread類中、sleep()方法導致了程式暫停執行指定的時間,讓出cpu該其他執行緒,執行緒不會釋放物件鎖。

24.死鎖產生的條件

  • 1.至少有一個資源是不能被共享的
  • 2.至少有一個任務持有一個資源並且在等待另一個資源
  • 3.資源不能被搶佔
  • 4.必須有迴圈等待

不販賣焦慮,也不標題黨。分享一些這個世界上有意思的事情。題材包括且不限於:科幻、科學、科技、網際網路、程式設計師、計算機程式設計。下面是我的微信公眾號:世界上有意思的事,乾貨多多等你來看。

世界上有意思的事

相關文章