Java核心知識(shí)點(diǎn)面試題最全整理:Java集合+多線(xiàn)程并發(fā)+Spring全家桶等(含答案)

本篇文章會(huì)對(duì)面試中常遇到的Java技術(shù)點(diǎn)進(jìn)行全面深入的總結(jié),幫助我們?cè)诿嬖囍懈拥眯膽?yīng)手,不參加面試的同學(xué)也能夠借此機(jī)會(huì)梳理一下自己的知識(shí)體系,進(jìn)行查漏補(bǔ)缺(閱讀本文需要有一定的Java基礎(chǔ);若您初涉Java,可以通過(guò)這些問(wèn)題建立起對(duì)Java初步的印象,待有了一定基礎(chǔ)后再后過(guò)頭來(lái)看收獲會(huì)更大)。

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

(1)boolean

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

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

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

boolean類(lèi)型的封裝類(lèi)是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》中說(shuō):“關(guān)系操作符生成的是一個(gè)boolean結(jié)果,它們計(jì)算的是操作數(shù)的值之間的關(guān)系”。

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

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

3. Java中的四種引用及其應(yīng)用場(chǎng)景是什么?

強(qiáng)引用: 通常我們使用new操作符創(chuàng)建一個(gè)對(duì)象時(shí)所返回的引用即為強(qiáng)引用

軟引用: 若一個(gè)對(duì)象只能通過(guò)軟引用到達(dá),那么這個(gè)對(duì)象在內(nèi)存不足時(shí)會(huì)被回收,可用于圖片緩存中,內(nèi)存不足時(shí)系統(tǒng)會(huì)自動(dòng)回收不再使用的Bitmap

弱引用: 若一個(gè)對(duì)象只能通過(guò)弱引用到達(dá),那么它就會(huì)被回收(即使內(nèi)存充足),同樣可用于圖片緩存中,這時(shí)候只要Bitmap不再使用就會(huì)被回收

虛引用: 虛引用是Java中最“弱”的引用,通過(guò)它甚至無(wú)法獲取被引用的對(duì)象,它存在的唯一作用就是當(dāng)它指向的對(duì)象回收時(shí),它本身會(huì)被加入到引用隊(duì)列中,這樣我們可以知道它指向的對(duì)象何時(shí)被銷(xiāo)毀。

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

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

5. hashCode的作用是什么?

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

ArrayList: 內(nèi)部采用數(shù)組存儲(chǔ)元素,支持高效隨機(jī)訪(fǎng)問(wèn),支持動(dòng)態(tài)調(diào)整大小

LinkedList: 內(nèi)部采用鏈表來(lái)存儲(chǔ)元素,支持快速插入/刪除元素,但不支持高效地隨機(jī)訪(fǎng)問(wèn)

Vector: 可以看作線(xiàn)程安全版的ArrayList

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

String: 不可變的字符序列,若要向其中添加新字符需要?jiǎng)?chuàng)建一個(gè)新的String對(duì)象

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

StringBuffer: 可以看作線(xiàn)程安全版的StringBuilder

8. Map, Set, List, Queue、Stack的特點(diǎn)及用法。

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

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

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

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

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

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

HashTable是線(xiàn)程安全的,而HashMap不是

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

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

簡(jiǎn)單的說(shuō),HashMap的底層實(shí)現(xiàn)是“基于拉鏈法的散列表”。

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

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

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

HashMap的底層實(shí)現(xiàn)是散列表,因此它內(nèi)部存儲(chǔ)的元素是無(wú)序的;

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

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

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

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

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

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

調(diào)用了System.exit()方法;

JVM“崩潰”了。

15. Java中的異常層次結(jié)構(gòu)

Java中的異常層次結(jié)構(gòu)如下圖所示:

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

16. Java面向?qū)ο蟮娜齻€(gè)特征與含義

?三大特征:封裝、繼承、多態(tài)。

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

Override表示“重寫(xiě)”,是子類(lèi)對(duì)父類(lèi)中同一方法的重新定義

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

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

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

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

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

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

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

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

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

欲進(jìn)一步了解內(nèi)部類(lèi),請(qǐng)戳Java核心技術(shù)點(diǎn)之內(nèi)部類(lèi)

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

所謂多態(tài),指的就是父類(lèi)引用指向子類(lèi)對(duì)象,調(diào)用方法時(shí)會(huì)調(diào)用子類(lèi)的實(shí)現(xiàn)而不是父類(lèi)的實(shí)現(xiàn)。多態(tài)的實(shí)現(xiàn)的關(guān)鍵在于“動(dòng)態(tài)綁定”。詳細(xì)介紹請(qǐng)戳Java動(dòng)態(tài)綁定的內(nèi)部實(shí)現(xiàn)機(jī)制

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

繼承Thread類(lèi)(假設(shè)子類(lèi)為MyThread),并重寫(xiě)run()方法,然后new一個(gè)MyThread對(duì)象并對(duì)其調(diào)用start()即可啟動(dòng)新線(xiàn)程。

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

22. 簡(jiǎn)述Java中進(jìn)行線(xiàn)程同步的方法

volatile: Java Memory Model保證了對(duì)同一個(gè)volatile變量的寫(xiě)happens before對(duì)它的讀;

synchronized: 可以來(lái)對(duì)一個(gè)代碼塊或是對(duì)一個(gè)方法上鎖,被“鎖住”的地方稱(chēng)為臨界區(qū),進(jìn)入臨界區(qū)的線(xiàn)程會(huì)獲取對(duì)象的monitor,這樣其他嘗試進(jìn)入臨界區(qū)的線(xiàn)程會(huì)因無(wú)法獲取monitor而被阻塞。由于等待另一個(gè)線(xiàn)程釋放monitor而被阻塞的線(xiàn)程無(wú)法被中斷。

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

23. 簡(jiǎn)述Java中具有哪幾種粒度的鎖

Java中可以對(duì)類(lèi)、對(duì)象、方法或是代碼塊上鎖。

24. 給出“生產(chǎn)者-消費(fèi)者”問(wèn)題的一種解決方案

使用阻塞隊(duì)列:

public class BlockingQueueTest { ? ?private int size = 20; ? ?private ArrayBlockingQueue 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 { ? ? ? ? ? ? ? ? ? ?//從阻塞隊(duì)列中取出一個(gè)元素 ? ? ? ? ? ? ? ? ? ?queue.take();?System.out.println("隊(duì)列剩余" + queue.size() + "個(gè)元素");?} catch (InterruptedException e) {??}?}?}?}?class Producer extends Thread{?@Override ? ? ? ?public void run() { ? ? ? ? ? ?while (true) { ? ? ? ? ? ? ? ?try { ? ? ? ? ? ? ? ? ? ?//向阻塞隊(duì)列中插入一個(gè)元素?queue.put(1);?System.out.println("隊(duì)列剩余空間:" + (size - queue.size()));?} catch (InterruptedException e) {??}?}?}?}}

25. ThreadLocal的設(shè)計(jì)理念與作用

ThreadLocal的作用是提供線(xiàn)程內(nèi)的局部變量,在多線(xiàn)程環(huán)境下訪(fǎng)問(wèn)時(shí)能保證各個(gè)線(xiàn)程內(nèi)的ThreadLocal變量各自獨(dú)立。也就是說(shuō),每個(gè)線(xiàn)程的ThreadLocal變量是自己專(zhuān)用的,其他線(xiàn)程是訪(fǎng)問(wèn)不到的。ThreadLocal最常用于以下這個(gè)場(chǎng)景:多線(xiàn)程環(huán)境下存在對(duì)非線(xiàn)程安全對(duì)象的并發(fā)訪(fǎng)問(wèn),而且該對(duì)象不需要在線(xiàn)程間共享,但是我們不想加鎖,這時(shí)候可以使用ThreadLocal來(lái)使得每個(gè)線(xiàn)程都持有一個(gè)該對(duì)象的副本。

26. concurrent包的整體架構(gòu)

打開(kāi)UC瀏覽器 查看更多精彩圖片

27. ArrayBlockingQueue, CountDownLatch類(lèi)的作用

CountDownLatch: ?允許線(xiàn)程集等待直到計(jì)數(shù)器為0。適用場(chǎng)景: 當(dāng)一個(gè)或多個(gè)線(xiàn)程需要等待指定數(shù)目的事件發(fā)生后再繼續(xù)執(zhí)行。

ArrayBlockingQueue: ?一個(gè)基于數(shù)組實(shí)現(xiàn)的阻塞隊(duì)列,它在構(gòu)造時(shí)需要指定容量。當(dāng)試圖向滿(mǎn)隊(duì)列中添加元素或者從空隊(duì)列中移除元素時(shí),當(dāng)前線(xiàn)程會(huì)被阻塞。通過(guò)阻塞隊(duì)列,我們可以按以下模式來(lái)工作:工作者線(xiàn)程可以周期性的將中間結(jié)果放入阻塞隊(duì)列中,其它線(xiàn)程可以取出中間結(jié)果并進(jìn)行進(jìn)一步操作。若工作者線(xiàn)程的執(zhí)行比較慢(還沒(méi)來(lái)得及向隊(duì)列中插入元素),其他從隊(duì)列中取元素的線(xiàn)程會(huì)等待它(試圖從空隊(duì)列中取元素從而阻塞);若工作者線(xiàn)程執(zhí)行較快(試圖向滿(mǎn)隊(duì)列中插入元素),則它會(huì)等待其它線(xiàn)程取出元素再繼續(xù)執(zhí)行。

28. wait(),sleep() 的區(qū)別

wait(): ?Object類(lèi)中定義的實(shí)例方法。在指定對(duì)象上調(diào)用wait方法會(huì)讓當(dāng)前線(xiàn)程進(jìn)入等待狀態(tài)(前提是當(dāng)前線(xiàn)程持有該對(duì)象的monitor),此時(shí)當(dāng)前線(xiàn)程會(huì)釋放相應(yīng)對(duì)象的monitor,這樣一來(lái)其它線(xiàn)程便有機(jī)會(huì)獲取這個(gè)對(duì)象的monitor了。當(dāng)其它線(xiàn)程獲取了這個(gè)對(duì)象的monitor并進(jìn)行了所需操作時(shí),便可以調(diào)用notify方法喚醒之前進(jìn)入等待狀態(tài)的線(xiàn)程。

sleep(): ?Thread類(lèi)中的靜態(tài)方法,作用是讓當(dāng)前線(xiàn)程進(jìn)入休眠狀態(tài),以便讓其他線(xiàn)程有機(jī)會(huì)執(zhí)行。進(jìn)入休眠狀態(tài)的線(xiàn)程不會(huì)釋放它所持有的鎖。

29. 線(xiàn)程池的用法與優(yōu)勢(shì)

優(yōu)勢(shì): ?實(shí)現(xiàn)對(duì)線(xiàn)程的復(fù)用,避免了反復(fù)創(chuàng)建及銷(xiāo)毀線(xiàn)程的開(kāi)銷(xiāo);使用線(xiàn)程池統(tǒng)一管理線(xiàn)程可以減少并發(fā)線(xiàn)程的數(shù)目,而線(xiàn)程數(shù)過(guò)多往往會(huì)在線(xiàn)程上下文切換上以及線(xiàn)程同步上浪費(fèi)過(guò)多時(shí)間。

用法: ?我們可以調(diào)用ThreadPoolExecutor的某個(gè)構(gòu)造方法來(lái)自己創(chuàng)建一個(gè)線(xiàn)程池。但通常情況下我們可以使用Executors類(lèi)提供給我們的靜態(tài)工廠(chǎng)方法來(lái)更方便的創(chuàng)建一個(gè)線(xiàn)程池對(duì)象。創(chuàng)建了線(xiàn)程池對(duì)象后,我們就可以調(diào)用submit方法提交任務(wù)到線(xiàn)程池中去執(zhí)行了;線(xiàn)程池使用完畢后我們要記得調(diào)用shutdown方法來(lái)關(guān)閉它。

30. for-each與常規(guī)for循環(huán)的效率對(duì)比

關(guān)于這個(gè)問(wèn)題我們直接看《Effective Java》給我們做的解答:

for-each能夠讓代碼更加清晰,并且減少了出錯(cuò)的機(jī)會(huì)。下面的慣用代碼適用于集合與數(shù)組類(lèi)型:

for(Elemente:elements){doSomething(e);}

使用for-each循環(huán)與常規(guī)的for循環(huán)相比,并不存在性能損失,即使對(duì)數(shù)組進(jìn)行迭代也是如此。實(shí)際上,在有些場(chǎng)合下它還能帶來(lái)微小的性能提升,因?yàn)樗挥?jì)算一次數(shù)組索引的上限。

31. 簡(jiǎn)述Java IO與NIO的區(qū)別

Java IO是面向流的,這意味著我們需要每次從流中讀取一個(gè)或多個(gè)字節(jié),直到讀取完所有字節(jié);NIO是面向緩沖的,也就是說(shuō)會(huì)把數(shù)據(jù)讀取到一個(gè)緩沖區(qū)中,然后對(duì)緩沖區(qū)中的數(shù)據(jù)進(jìn)行相應(yīng)處理。

Java IO是阻塞IO,而NIO是非阻塞IO。

Java NIO中存在一個(gè)稱(chēng)為選擇器(selector)的東西,它允許你把多個(gè)通道(channel)注冊(cè)到一個(gè)選擇器上,然后使用一個(gè)線(xiàn)程來(lái)監(jiān)視這些通道:若這些通道里有某個(gè)準(zhǔn)備好可以開(kāi)始進(jìn)行讀或?qū)懖僮髁?,則開(kāi)始對(duì)相應(yīng)的通道進(jìn)行讀寫(xiě)。而在等待某通道變?yōu)榭勺x/寫(xiě)期間,請(qǐng)求對(duì)通道進(jìn)行讀寫(xiě)操作的線(xiàn)程可以去干別的事情。

32. 反射的作用與原理

反射的作用概括地說(shuō)是運(yùn)行時(shí)獲取類(lèi)的各種定義信息,比如定義了哪些屬性與方法。原理是通過(guò)類(lèi)的class對(duì)象來(lái)獲取它的各種信息。

33. Java中的泛型機(jī)制

34. Java 7與Java 8的新特性

35. 常見(jiàn)設(shè)計(jì)模式

所謂“設(shè)計(jì)模式”,不過(guò)是面向?qū)ο缶幊讨幸恍┏S玫能浖O(shè)計(jì)手法,并且經(jīng)過(guò)實(shí)踐的檢驗(yàn),這些設(shè)計(jì)手法在各自的場(chǎng)景下能解決一些需求,因此它們就成為了如今廣為流傳的”設(shè)計(jì)模式“。也就是說(shuō),正式因?yàn)樵谀承﹫?chǎng)景下產(chǎn)生了一些棘手的問(wèn)題,才催生了相應(yīng)的設(shè)計(jì)模式。明確了這一點(diǎn),我們?cè)趯W(xué)習(xí)某種設(shè)計(jì)模式時(shí)要充分理解它產(chǎn)生的背景以及它所解決的主要矛盾是什么。

常用的設(shè)計(jì)模式可以分為以下三大類(lèi):

創(chuàng)建型模式: ?包括工廠(chǎng)模式(又可進(jìn)一步分為簡(jiǎn)單工廠(chǎng)模式、工廠(chǎng)方法模式、抽象工廠(chǎng)模式)、建造者模式、單例模式。

結(jié)構(gòu)型模式: ?包括適配器模式、橋接模式、裝飾模式、外觀(guān)模式、享元模式、代理模式。

行為型模式: ?包括命令模式、中介者模式、觀(guān)察者模式、狀態(tài)模式、策略模式。

36. JNI的基本用法

37. 動(dòng)態(tài)代理的定義、應(yīng)用場(chǎng)景及原理

38. 注解的基本概念與使用

注解可以看作是“增強(qiáng)版的注釋”,它可以向編譯器、虛擬機(jī)說(shuō)明一些事情。

注解是描述Java代碼的代碼,它能夠被編譯器解析,注解處理工具在運(yùn)行時(shí)也能夠解析注解。注解本身是“被動(dòng)”的信息,只有主動(dòng)解析它才有意義。

除了向編譯器/虛擬機(jī)傳遞信息,我們也可以使用注解來(lái)生成一些“模板化”的代碼。

這些就夠了嗎?當(dāng)然不夠。上面列出了面試中關(guān)于Java的常見(jiàn)問(wèn)題,同時(shí)大多也是Java技術(shù)體系的核心技術(shù)點(diǎn),通過(guò)這些問(wèn)題而引發(fā)出的一系列問(wèn)題正是為我們指出了完善自身知識(shí)體系的一條道路,我們要做的是順著這條道路堅(jiān)持走下去:)需要Java面試學(xué)習(xí)資料的朋友幫忙關(guān)注+轉(zhuǎn)發(fā),添加小助理vx:bjmsb2019即可免費(fèi)獲取~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容