整理20道經(jīng)典Java面試題,應(yīng)屆生答對10k應(yīng)該沒問題!
整理20道經(jīng)典Java面試題,應(yīng)屆生答對10k應(yīng)該沒問題!
?
1.什么是快速失敗的故障安全迭代器?
快速失敗的Java迭代器可能會引發(fā)ConcurrentModifcationException在底層集合迭代過程中被修改。故障安全作為發(fā)生在實例中的一個副本迭代是不會拋出任何異常的。
快速失敗的故障安全范例定義了當(dāng)遭遇故障時系統(tǒng)是如何反應(yīng)的。例如,用于失敗的快速迭代器ArrayList和用于故障安全的迭代器ConcurrentHashMap。
?
2.Java BlockingQueue是什么?
Java BlockingQueue是一個并發(fā)集合util包的一部分。BlockingQueue隊列是一種支持操作,它等待元素變得可用時來檢索,同樣等待空間可用時來存儲元素。
另外,大家可以關(guān)注微信公眾號:Java技術(shù)棧,在后臺回復(fù):面試,可以獲取我整理的 N 篇 Java 面試題干貨。
?
3.Iterator和ListIterator的區(qū)別
●ListIterator有add()方法,可以向List中添加對象,而Iterator不能。
●ListIterator和Iterator都有hasNext()和next()方法,可以實現(xiàn)順序向后遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實現(xiàn)逆向(順序向前)遍歷。Iterator就不可以。
●ListIterator可以定位當(dāng)前的索引位置,nextIndex()和previousIndex()可以實現(xiàn)。Iterator沒有此功能。
●都可實現(xiàn)刪除對象,但是ListIterator可以實現(xiàn)對象的修改,set()方法可以實現(xiàn)。Iierator僅能遍歷,不能修改。
?
4.什么是CopyOnWriteArrayList,它與ArrayList有何不同?
CopyOnWriteArrayList是ArrayList的一個線程安全的變體,其中所有可變操作(add、set等等)都是通過對底層數(shù)組進(jìn)行一次新的復(fù)制來實現(xiàn)的。相比較于ArrayList它的寫操作要慢一些,因為它需要實例的快照。
CopyOnWriteArrayList中寫操作需要大面積復(fù)制數(shù)組,所以性能肯定很差,但是讀操作因為操作的對象和寫操作不是同一個對象,讀之間也不需要加鎖,讀和寫之間的同步處理只是在寫完后通過一個簡單的'='將引用指向新的數(shù)組對象上來,這個幾乎不需要時間,這樣讀操作就很快很安全,適合在多線程里使用,絕對不會發(fā)生ConcurrentModificationException ,因此CopyOnWriteArrayList適合使用在讀操作遠(yuǎn)遠(yuǎn)大于寫操作的場景里,比如緩存。
?
5.迭代器和枚舉之間的區(qū)別
如果面試官問這個問題,那么他的意圖一定是讓你區(qū)分Iterator不同于Enumeration的兩個方面:
●Iterator允許移除從底層集合的元素。
●Iterator的方法名是標(biāo)準(zhǔn)化的。
?
6、什么是標(biāo)記接口?
標(biāo)記接口是一個空的接口,沒有任何方法,用于強(qiáng)制實現(xiàn)類中的某些功能。比較出名的標(biāo)記接口有 Serializable 接口、Cloneable 接口。
關(guān)于 Serializable 接口更詳細(xì)的內(nèi)容,可以參照我之前寫了另外一篇文章:
Java Serializable:明明就一個空的接口嘛
?
7、什么是三元運(yùn)算符?
三元運(yùn)算符是 if-then-else 語句的一個替換,示例如下:
result = testStatement ? value1 : value2;
8、什么是垃圾回收?
垃圾回收(Garbage Collection,簡稱?GC)會查看堆內(nèi)存,識別正在使用和未使用的對象,以及會自動刪除未使用的對象,用來釋放內(nèi)存。
?
9、什么是序列化和反序列化?
我們可以把一個 Java 對象轉(zhuǎn)化成一個數(shù)據(jù)流,這被稱為序列化。一旦對象被轉(zhuǎn)化為數(shù)據(jù)流后,就可以將其保存到文件或者通過網(wǎng)絡(luò)套接字發(fā)送。
如果一個對象實現(xiàn)了 Serializable 接口,就可以使用 java.io.ObjectOutputStream 將對象寫入文件。
將數(shù)據(jù)流再轉(zhuǎn)化為 Java 對象被稱為反序列化。
?
10、如何通過命令提示符運(yùn)行 jar 文件?
可以通過 java 命令運(yùn)行 jar 文件,但需要 jar 文件中有 main 方法。
11、System 類有什么用?
System 類是 Java 的一個核心類,比較常用的就是 System.out.println()。
System 類是 final 的,因此我們不能通過繼承來重寫它的方法,System 類沒有提供任何 public 的構(gòu)造方法,因此無法實例化,它的所有方法都是 static 的。
?
12、堆(heap)和棧(stack)有什么區(qū)別?
堆內(nèi)存被應(yīng)用程序的所有部分使用,而棧內(nèi)存僅由執(zhí)行線程使用。
當(dāng)我們創(chuàng)建對象時,它始終存儲在堆空間上;棧僅存儲該對象的引用,棧內(nèi)存還可以存儲局部的基本類型數(shù)據(jù)變量。
棧的內(nèi)存管理方式是 LIFO(后進(jìn)先出)形式,而堆的內(nèi)存管理方式更復(fù)雜。
?
13. 面向?qū)ο蟮奶卣?/span>
面向?qū)ο蟮娜筇卣鳎?/span>
封裝
繼承
多態(tài)
?
14. &和&&的區(qū)別
按位與, a&b 表示把a(bǔ)和b都轉(zhuǎn)換成二進(jìn)制數(shù),再進(jìn)行與的運(yùn)算;
&和&&都是邏輯運(yùn)算符號,&&又叫短路運(yùn)算符
邏輯與,a&& b ,a&b 都表示當(dāng)且僅當(dāng)兩個操作數(shù)均為 true時,其結(jié)果才為 true,否則為false。
邏輯與跟短路與的差別是非常巨大的,雖然二者都要求運(yùn)算符左右兩端的布爾值都是true,整個表達(dá)式的值才是true。但是,&&之所以稱為短路運(yùn)算,是因為如果&&左邊的表達(dá)式的值是false,右邊的表達(dá)式會被直接短路掉,不會進(jìn)行運(yùn)算。
?
15. Java中IO流分為幾種?
Java中的流分為兩種:一種是字節(jié)流,另一種是字符流。
IO流分別由四個抽象類來表示(兩輸入兩輸出):InputStream,OutputStream,Reader,Writer。
?
16. 守護(hù)線程是什么?用什么方法實現(xiàn)守護(hù)線程
守護(hù)線程是運(yùn)行在后臺的一種特殊進(jìn)程。
它獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。
在 Java 中垃圾回收線程就是特殊的守護(hù)線程。
?
17. notify()和 notifyAll()有什么區(qū)別?
notify是喚醒一個處于該對象wait的線程,而notifyAll是喚醒所有處于該對象wait的線程。
但是喚醒不等于就能執(zhí)行了,需要得到鎖對象才能有權(quán)利繼續(xù)執(zhí)行,而鎖只有一把,所以多個線程被喚醒時需要爭取該鎖。
?
18. 談?wù)勛远x注解的場景及實現(xiàn)
之前我這邊有這么一個業(yè)務(wù)場景,用Redis控制接口調(diào)用頻率,有使用過自定義注解。
通過 AOP(動態(tài)代理機(jī)制)給方法添加切面,通過反射來獲取方法包含的注解,如果包含自定義關(guān)鍵字注解,就通過Redis進(jìn)行校驗攔截請求。
有關(guān)于注解,建議大家看一下java編程思想的注解篇章哈~
?
19. 說說你熟悉的設(shè)計模式有哪些?
設(shè)計模式分為三大類:
創(chuàng)建型模式:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式(5種)
結(jié)構(gòu)型模式:適配器模式、裝飾者模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。(7種)
行為型模式:策略模式、模板方法模式、觀察者模式、迭代子模式、責(zé)任鏈模式、命令模式、備忘錄模式、狀態(tài)模式、訪問者模式、中介者模式、解釋器模式。(11種)
最好平時積累一下,單例模式(7種實現(xiàn)方式),工廠模式,模板方法設(shè)計模式,策略模式,裝飾者模式、代理模式這幾種怎么寫吧~
?
20. 如何實現(xiàn)對象克???
實現(xiàn) Cloneable 接口,重寫 clone() 方法。
Object 的 clone() 方法是淺拷貝,即如果類中屬性有自定義引用類型,只拷貝引用,不拷貝引用指向的對象。
對象的屬性的Class 也實現(xiàn) Cloneable 接口,在克隆對象時也手動克隆屬性,完成深拷貝
結(jié)合序列化(JDK java.io.Serializable 接口、JSON格式、XML格式等),完成深拷貝
?