Java面試問題知識點總結-創(chuàng)新互聯(lián)

本篇文章會對面試中常遇到的Java技術點進行全面深入的總結(閱讀本文需要有一定的Java基礎;若您初涉Java,可以通過這些問題建立起對Java初步的印象,待有了一定基礎后再后過頭來看收獲會更大),喜歡的朋友可以參考下。

創(chuàng)新互聯(lián)公司專注于通化企業(yè)網站建設,響應式網站設計,商城網站制作。通化網站建設公司,為通化等地區(qū)提供建站服務。全流程定制設計,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務

1. Java中的原始數(shù)據(jù)類型都有哪些,它們的大小及對應的封裝類是什么?

(1)boolean

   boolean數(shù)據(jù)類型非true即false。這個數(shù)據(jù)類型表示1 bit的信息,但是它的大小并沒有精確定義。

   《Java虛擬機規(guī)范》中如是說:“雖然定義了boolean這種數(shù)據(jù)類型,但是只對它提供了非常有限的支持。在Java虛擬機中沒有任何供boolean值專用的字節(jié)碼指令,Java語言表達式所操作的boolean值,在編譯之后都使用Java虛擬機中的int數(shù)據(jù)類型來代替,而boolean數(shù)組將會被編碼成Java虛擬機的byte數(shù)組,每個元素boolean元素占8位”。這樣我們可以得出boolean類型單獨使用是4個字節(jié),在數(shù)組中又是1個字節(jié)。那虛擬機為什么要用int來代替boolean呢?為什么不用byte或short,這樣不是更節(jié)省內存空間嗎?實際上,使用int的原因是,對于當下32位的CPU來說,一次進行32位的數(shù)據(jù)交換更加高效。

    綜上,我們可以知道:官方文檔對boolean類型沒有給出精確的定義,《Java虛擬機規(guī)范》給出了“單獨時使用4個字節(jié),boolean數(shù)組時1個字節(jié)”的定義,具體還要看虛擬機實現(xiàn)是否按照規(guī)范來,所以1個字節(jié)、4個字節(jié)都是有可能的。這其實是一種時空權衡。

    boolean類型的封裝類是Boolean。

(2)byte——1 byte——Byte

(3)short——2 bytes——Short

(4)int——4 bytes——Integer

(5)long——8 bytes——Long

(6)float——4 bytes——Float

(7)double——8 bytes——Double

(8)char——2 bytes——Character

2. 談一談”==“與”equals()"的區(qū)別。

    《Think in Java》中說:“關系操作符生成的是一個boolean結果,它們計算的是操作數(shù)的值之間的關系”。

    "=="判斷的是兩個對象的內存地址是否一樣,適用于原始數(shù)據(jù)類型和枚舉類型(它們的變量存儲的是值本身,而引用類型變量存儲的是引用);equals是Object類的方法,Object對它的實現(xiàn)是比較內存地址,我們可以重寫這個方法來自定義“相等”這個概念。比如類庫中的String、Date等類就對這個方法進行了重寫。

    綜上,對于枚舉類型和原始數(shù)據(jù)類型的相等性比較,應該使用"==";對于引用類型的相等性比較,應該使用equals方法。

3. Java中的四種引用及其應用場景是什么?

強引用: 通常我們使用new操作符創(chuàng)建一個對象時所返回的引用即為強引用

軟引用: 若一個對象只能通過軟引用到達,那么這個對象在內存不足時會被回收,可用于圖片緩存中,內存不足時系統(tǒng)會自動回收不再使用的Bitmap

弱引用: 若一個對象只能通過弱引用到達,那么它就會被回收(即使內存充足),同樣可用于圖片緩存中,這時候只要Bitmap不再使用就會被回收

虛引用: 虛引用是Java中最“弱”的引用,通過它甚至無法獲取被引用的對象,它存在的唯一作用就是當它指向的對象回收時,它本身會被加入到引用隊列中,這樣我們可以知道它指向的對象何時被銷毀。

4. object中定義了哪些方法?

    clone(), equals(), hashCode(), toString(), notify(), notifyAll(), wait(), finalize(), getClass()

5. hashCode的作用是什么?

    請參見散列表的基本原理與實現(xiàn)

6. ArrayList, LinkedList, Vector的區(qū)別是什么?

ArrayList: 內部采用數(shù)組存儲元素,支持高效隨機訪問,支持動態(tài)調整大小

LinkedList: 內部采用鏈表來存儲元素,支持快速插入/刪除元素,但不支持高效地隨機訪問

Vector: 可以看作線程安全版的ArrayList

7. String, StringBuilder, StringBuffer的區(qū)別是什么?

String: 不可變的字符序列,若要向其中添加新字符需要創(chuàng)建一個新的String對象

StringBuilder: 可變字符序列,支持向其中添加新字符(無需創(chuàng)建新對象)

StringBuffer: 可以看作線程安全版的StringBuilder

8. Map, Set, List, Queue、Stack的特點及用法。

Map<K, V>:  Java中存儲鍵值對的數(shù)據(jù)類型都實現(xiàn)了這個接口,表示“映射表”。支持的兩個核心操作是get(Object key)以及put(K key, V value),分別用來獲取鍵對應的值以及向映射表中插入鍵值對。

Set<E>: 實現(xiàn)了這個接口的集合類型中不允許存在重復的元素,代表數(shù)學意義上的“集合”。它所支持的核心操作有add(E e),remove(Object o), contains(Object o),分別用于添加元素,刪除元素以及判斷給定元素是否存在于集中。

List<E>: Java中集合框架中的列表類型都實現(xiàn)了這個接口,表示一種有序序列。支持get(int index), add(E e)等操作。

Queue<E>: Java集合框架中的隊列接口,代表了“先進先出”隊列。支持add(E element), remove()等操作。

Stack<E>: Java集合框架中表示堆棧的數(shù)據(jù)類型,堆棧是一種“后進先出”的數(shù)據(jù)結構。支持push(E item), pop()等操作。

    更詳細的說明請參考官方文檔,對相關數(shù)據(jù)結構不太熟悉的同學可以參考《算法導論》或其他相關書籍。

9. HashMap和HashTable的區(qū)別

HashTable是線程安全的,而HashMap不是

HashMap中允許存在null鍵和null值,而HashTable中不允許

    更加詳細的分析請參考深入解析HashMap、HashTable

10. HashMap的實現(xiàn)原理

    簡單的說,HashMap的底層實現(xiàn)是“基于拉鏈法的散列表”。詳細分析請參考深入解析HashMap、HashTable

11. ConcurrentHashMap的實現(xiàn)原理

    ConcurrentHashMap是支持并發(fā)讀寫的HashMap,它的特點是讀取數(shù)據(jù)時無需加鎖,寫數(shù)據(jù)時可以保證加鎖粒度盡可能的小。由于其內部采用“分段存儲”,只需對要進行寫操作的數(shù)據(jù)所在的“段”進行加鎖。關于ConcurrentHashMap底層實現(xiàn)的詳細分析請參考Java并發(fā)編程:并發(fā)容器之ConcurrentHashMap

12. TreeMap, LinkedHashMap, HashMap的區(qū)別是什么?

HashMap的底層實現(xiàn)是散列表,因此它內部存儲的元素是無序的;

TreeMap的底層實現(xiàn)是紅黑樹,所以它內部的元素的有序的。排序的依據(jù)是自然序或者是創(chuàng)建TreeMap時所提供的比較器(Comparator)對象。

LinkedHashMap能夠記住插入元素的順序。

更加詳細的說明請參考HashMap,LinkedMap,TreeMap的區(qū)別

13. Collection與Collections的區(qū)別是什么?

    Collection<E>是Java集合框架中的基本接口;Collections是Java集合框架提供的一個工具類,其中包含了大量用于操作或返回集合的靜態(tài)方法。

    對Java集合框架還不太熟悉的小伙伴請參考Java核心技術點之集合框架

14. 對于“try-catch-finally”,若try語句塊中包含“return”語句,finally語句塊會執(zhí)行嗎?

    答案是會執(zhí)行。只有兩種情況finally塊中的語句不會被執(zhí)行:

調用了System.exit()方法;

JVM“崩潰”了。

15. Java中的異常層次結構

    Java中的異常層次結構如下圖所示:

 Java面試問題知識點總結

    我們可以看到Throwable類是異常層級中的基類。Error類表示內部錯誤,這類錯誤使我們無法控制的;Exception表示異常,RuntimeException及其子類屬于未檢查異常,這類異常包括ArrayIndexOutOfBoundsException、NullPointerException等,我們應該通過條件判斷等方式語句避免未檢查異常的發(fā)生。IOException及其子類屬于已檢查異常,編譯器會檢查我們是否為所有可能拋出的已檢查異常提供了異常處理器,若沒有則會報錯。對于未檢查異常,我們無需捕獲(當然Java也允許我們捕獲,但我們應該做的事避免未檢查異常的發(fā)生)。

16. Java面向對象的三個特征與含義

     三大特征:封裝、繼承、多態(tài)。詳細介紹請戳Java面向對象三大特性

17. Override, Overload的含義與區(qū)別

Override表示“重寫”,是子類對父類中同一方法的重新定義

Overload表示“重載”,也就是定義一個與已定義方法名稱相同但簽名不同的新方法

18. 接口與抽象類的區(qū)別

    接口是一種約定,實現(xiàn)接口的類要遵循這個約定;抽象類本質上是一個類,使用抽象類的代價要比接口大。接口與抽象類的對比如下:

抽象類中可以包含屬性,方法(包含抽象方法與有著具體實現(xiàn)的方法),常量;接口只能包含常量和方法聲明。

抽象類中的方法和成員變量可以定義可見性(比如public、private等);而接口中的方法只能為public(缺省為public)。

一個子類只能有一個父類(具體類或抽象類);而一個接口可以繼承一個多個接口,一個類也可以實現(xiàn)多個接口。

子類中實現(xiàn)父類中的抽象方法時,可見性可以大于等于父類中的;而接口實現(xiàn)類中的接口 方法的可見性只能與接口中相同(public)。

19. 靜態(tài)內部類與非靜態(tài)內部類的區(qū)別

    靜態(tài)內部類不會持有外圍類的引用,而非靜態(tài)內部類會隱式持有外圍類的一個引用。

    欲進一步了解內部類,請戳Java核心技術點之內部類

20. Java中多態(tài)的實現(xiàn)原理

   所謂多態(tài),指的就是父類引用指向子類對象,調用方法時會調用子類的實現(xiàn)而不是父類的實現(xiàn)。多態(tài)的實現(xiàn)的關鍵在于“動態(tài)綁定”。詳細介紹請戳Java動態(tài)綁定的內部實現(xiàn)機制

21. 簡述Java中創(chuàng)建新線程的兩種方法

繼承Thread類(假設子類為MyThread),并重寫run()方法,然后new一個MyThread對象并對其調用start()即可啟動新線程。

實現(xiàn)Runnable接口(假設實現(xiàn)類為MyRunnable),而后將MyRunnable對象作為參數(shù)傳入Thread構造器,在得到的Thread對象上調用start()方法即可。

22. 簡述Java中進行線程同步的方法

volatile: Java Memory Model保證了對同一個volatile變量的寫happens before對它的讀;

synchronized: 可以來對一個代碼塊或是對一個方法上鎖,被“鎖住”的地方稱為臨界區(qū),進入臨界區(qū)的線程會獲取對象的monitor,這樣其他嘗試進入臨界區(qū)的線程會因無法獲取monitor而被阻塞。由于等待另一個線程釋放monitor而被阻塞的線程無法被中斷。

ReentrantLock:  嘗試獲取鎖的線程可以被中斷并可以設置超時參數(shù)。

    更加詳細的介紹請戳Java核心技術點之多線程

23. 簡述Java中具有哪幾種粒度的鎖

    Java中可以對類、對象、方法或是代碼塊上鎖。更加詳細的介紹請戳Java核心技術點之多線程

24. 給出“生產者-消費者”問題的一種解決方案

    使用阻塞隊列:

public class BlockingQueueTest {
 private int size = 20;
 private ArrayBlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<>(size); 
 public static void main(String[] args) {
 BlockingQueueTest test = new BlockingQueueTest();
 Producer producer = test.new Producer();
 Consumer consumer = test.new Consumer(); 
 producer.start();
 consumer.start();
 } 
 class Consumer extends Thread{
 @Override
 public void run() {
 while(true){
 try {
 //從阻塞隊列中取出一個元素
 queue.take();
 System.out.println("隊列剩余" + queue.size() + "個元素");
 } catch (InterruptedException e) {
 
 }
 }
 }
 } 
 class Producer extends Thread{ 
 @Override
 public void run() {
 while (true) {
 try {
 //向阻塞隊列中插入一個元素
 queue.put(1);
 System.out.println("隊列剩余空間:" + (size - queue.size()));
 } catch (InterruptedException e) { 
 }
 }
 }
 }
}

本文名稱:Java面試問題知識點總結-創(chuàng)新互聯(lián)
標題URL:http://muchs.cn/article6/dhihog.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供自適應網站、網站營銷、品牌網站制作、網站設計、App設計、企業(yè)建站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都網站建設