【Java】筆試題總結

PS:不定期更新博文~我會把每次面試遇到的Java題儘量都寫下來做記錄

 

1、final類可以被繼承嗎?

答:final類不可以被繼承,更不可以被重寫,final 類中的所有成員方法都會被隱式地指定爲 final 方法。

【拓展】

  • final 修飾變量時,該變量爲常量,值不可變。若修飾基本數據類型的變量,則其數值一旦在初始化之後便不能更改;如果修飾引用類型的變量,則在對其初始化之後便不能再讓其指向另一個對象。
  • final 修飾對象時,值可變,引用地址不可以改變。
  • final 修飾方法時,方法不可重寫,但可以重載。注意:因爲重寫的前提是子類可以從父類中繼承此方法,如果父類中 final 修飾的方法同時訪問控制權限爲 private,將會導致子類中不能直接繼承到此方法,因此,此時可以在子類中定義相同的方法名和參數,也不再產生重寫與final的矛盾,而是在子類中重新定義了新的方法。(注:類的private方法會隱式地被指定爲final方法。)

 

2、構造函數能否重寫?

答:構造函數只能被重載,不能被重寫。

重寫的定義是方法名稱相同,方法參數列表,返回值也要相同,只有繼承了父類,子類纔可以重寫,但是子類的名稱和父類的名稱是不能一樣的,從而構造函數的名字也是不一樣的,所以就談不上重寫了 。

 

3、java基礎數據類型(8種)

  • 六種數字類型(四個整數型,兩個浮點型):byte、short、int、long、float、double
  • 一種字符類型:char
  • 一種布爾型:boolean

【拓展】

  • Java爲每一個基本數據類型都引入了對應的包裝類型
  • 基礎數據類型:boolean,char,byte,short,int,long,float,double
  • 包裝類型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
  • Java中的基本數據類型只有8個,除了基本類型外,剩下的都是引用類型。

 

4、Servlet 生命週期的四個階段

  • 裝載類及創建實例階段:創建 Servlet 對象。
  • 初始化階段:在第一次創建 Servlet 對象時調用 init() 方法,初始化 Servlet 的信息,在後續每次用戶請求時不再調用。
  • 服務階段:調用service()方法,由service()方法根據提交的方式選擇執行doGet()或者doPost()方法。
  • 銷燬階段:調用destroy()方法來銷燬Servlet對象。

 

5、Java 文件中是否可同時包含兩個 public 類?

答:可以有多個類,但只能有一個public的類,並且 public 的類名必須與文件名相一致(是爲了方便虛擬機在相應的路徑中找到相應的類所對應的字節碼文件)。因爲編譯器在編譯時,針對一個 java 源代碼文件只會接受一個 public 類,否則報錯。但 public 類不是必須的,java 文件中可以沒有 public 類。

 

6、HashMap 和 HashTable 的異同點

  • 都實現了Map接口
  • Hashtable是synchronized,而HashMap是非synchronized
  • Hashtable是線程安全的,HashMap是非線程安全的。由於Hashtable是線程安全的也是synchronized,所以在單線程環境下它比HashMap要慢。如果你不需要同步,只需要單一線程,那麼使用HashMap性能要好過Hashtable。
  • Hashtable、HashMap都使用了 Iterator。而Hashtable還使用了Enumeration的方式 。HashMap的Iterator是fail-fast迭代器。JDK8之前的版本中,Hashtable是沒有fast-fail機制的。在JDK8及以後的版本中 ,HashTable也是使用fast-fail的。
  • 計算hash值的方法不同:Hashtable計算hash是直接使用key的hashcode對table數組的長度直接進行取模。HashMap計算hash對key的hashcode進行了二次hash,以獲得更好的散列值,然後對table數組長度取摸。
  • HashMap可以使用null作爲key,而HashTable不允許。
  • 判斷是否含有某個鍵:在HashMap 中,null 可以作爲鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值爲null。當get()方法返回null 值時,既可以表示HashMap 中沒有該鍵,也可以表示該鍵所對應的值爲null。因此,在HashMap 中不能用get()方法來判斷HashMap 中是否存在某個鍵,而應該用containsKey()方法來判斷。Hashtable 的鍵值都不能爲null,所以可以用get()方法來判斷是否含有某個鍵。

 

7、Java 提供的併發編程同步器有哪些?

  • CyclicBarrier:障柵,適合於線程數量固定的情況
  • CountDownLatch:倒計時門閂
  • Semaphore:信號量
  • SynchronousQueue:同步隊列
  • Exchanger:交換器
  • Phaser:階段化處理,一個可複用的同步障柵

【拓展】

  • 同步器:在多線程中,經常需要多個線程相互合作完成一項任務,使用同步器可以要求線程間能夠進行協調。
  • 障柵:相當於程序中的一個集合點,當結果在中間步驟需要整合的時候會用到它。當線程需要等待其他線程時,可以讓該線程運行到障柵處,一旦所有線程都到達了這個障柵,障柵就撤銷,線程可以繼續向下運行。
  • 倒計時門閂:只有等待的線程到達一定的數量,計數器值遞減爲零時,門閂纔會打開,線程纔可以繼續執行。
  • 同步隊列:一個沒有數據緩衝的阻塞隊列。在同步隊列上的插入操作必須等待相應的刪除執行完成後才能執行,反之亦然。
  • 交換器:通過方法exchange將其數據提供給另一個線程,並接收另一個線程的數據。
  • 階段化處理:把一件事情分爲若干個階段,然後規定每個階段的任務和完成時間,從而實現階段化的控制和管理,階段化處理往往在完成某一項複雜工作時很高效。

 

8、子類可以訪問父類 private 屬性嗎?可以訪問父類 protected 屬性嗎?

答:子類不可以訪問父類 private 屬性,可以訪問父類 protected 屬性

  • 要想在子類中訪問父類的private屬性,可以調用父類的get set方法來訪問。
  • protected:本包可以訪問,子類可以繼承。

 

9、JAVA的反射機制主要提供了哪些功能?

  • 在運行時判斷任意一個對象所屬的類
  • 在運行時構造任意一個類的對象
  • 在運行時判斷任意一個類所具有的成員變量和方法
  • 在運行時調用任意一個對象的方法
  • 生成動態代理

 

10、

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