HR:這么簡單的面試題都不會
嘿,小伙伴們,最近是不是找實習找工作找得焦頭爛額?面試官的題怎么辣么難?這個解題思路我剛才怎么沒想到?
別擔心!知了小姐姐給你們整理了20道經(jīng)典Java題!趕快拿出小本本,劃重點!

01
什么是快速失敗的故障安全迭代器?
快速失敗的Java迭代器可能會引發(fā)ConcurrentModifcationException在底層集合迭代過程中被修改。故障安全作為發(fā)生在實例中的一個副本迭代是不會拋出任何異常的。
快速失敗的故障安全范例定義了當遭遇故障時系統(tǒng)是如何反應(yīng)的。例如,用于失敗的快速迭代器ArrayList和用于故障安全的迭代器ConcurrentHashMap。
02
Java BlockingQueue是什么?
Java BlockingQueue是一個并發(fā)集合util包的一部分。BlockingQueue隊列是一種支持操作,它等待元素變得可用時來檢索,同樣等待空間可用時來存儲元素。
03
Iterator和ListIterator的區(qū)別
●ListIterator有add()方法,可以向List中添加對象,而Iterator不能。
●ListIterator和Iterator都有hasNext()和next()方法,可以實現(xiàn)順序向后遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實現(xiàn)逆向(順序向前)遍歷。Iterator就不可以。
●ListIterator可以定位當前的索引位置,nextIndex()和previousIndex()可以實現(xiàn)。Iterator沒有此功能。
●都可實現(xiàn)刪除對象,但是ListIterator可以實現(xiàn)對象的修改,set()方法可以實現(xiàn)。Iierator僅能遍歷,不能修改。
04
什么是CopyOnWriteArrayList?
它與ArrayList有何不同?
CopyOnWriteArrayList是ArrayList的一個線程安全的變體,其中所有可變操作(add、set等等)都是通過對底層數(shù)組進行一次新的復制來實現(xiàn)的。相比較于ArrayList它的寫操作要慢一些,因為它需要實例的快照。
CopyOnWriteArrayList中寫操作需要大面積復制數(shù)組,所以性能肯定很差,但是讀操作因為操作的對象和寫操作不是同一個對象,讀之間也不需要加鎖。
讀和寫之間的同步處理只是在寫完后通過一個簡單的'='將引用指向新的數(shù)組對象上來,這個幾乎不需要時間,這樣讀操作就很快很安全,適合在多線程里使用。絕對不會發(fā)生ConcurrentModificationException。
因此CopyOnWriteArrayList適合使用在讀操作遠遠大于寫操作的場景里,比如緩存。
05
迭代器和枚舉之間的區(qū)別
小提示:如果面試官問這個問題,那么他的意圖一定是讓你區(qū)分Iterator不同于Enumeration的兩個方面。
●Iterator允許移除從底層集合的元素。
●Iterator的方法名是標準化的。
06
什么是標記接口?
標記接口是一個空的接口,沒有任何方法,用于強制實現(xiàn)類中的某些功能。比較出名的標記接口有 Serializable 接口、Cloneable 接口。
07
什么是三元運算符?
三元運算符是 if-then-else 語句的一個替換,示例如下:
result = testStatement ? value1 : value2;
08
什么是垃圾回收?
垃圾回收(Garbage Collection,簡稱 GC)會查看堆內(nèi)存,識別正在使用和未使用的對象,以及會自動刪除未使用的對象,用來釋放內(nèi)存。
09
什么是序列化和反序列化?
我們可以把一個 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
如何通過命令提示符運行 jar 文件?
可以通過 java 命令運行 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í)行線程使用。
當我們創(chuàng)建對象時,它始終存儲在堆空間上;棧僅存儲該對象的引用,棧內(nèi)存還可以存儲局部的基本類型數(shù)據(jù)變量。
棧的內(nèi)存管理方式是 LIFO(后進先出)形式,而堆的內(nèi)存管理方式更復雜。
13
面向?qū)ο蟮奶卣?/strong>
面向?qū)ο蟮娜筇卣鳎悍庋b、繼承、多態(tài)。
【封裝】把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作,對不可信的進行封裝隱藏。封裝分為屬性的封裝和方法的封裝。
【繼承】是對有著共同特性的多類事物,進行再抽象成一個類。這個類就是多類事物的父類。父類的意義在于抽取多類事物的共性。
【多態(tài)】允許不同類的對象對同一消息做出響應(yīng)。方法的重載、類的覆蓋正體現(xiàn)了多態(tài)。
14
&和&&的區(qū)別
按位與, a&b 表示把a和b都轉(zhuǎn)換成二進制數(shù),再進行與的運算;
&和&&都是邏輯運算符號,&&又叫短路運算符
邏輯與,a&& b ,a&b 都表示當且僅當兩個操作數(shù)均為 true時,其結(jié)果才為 true,否則為false。
邏輯與跟短路與的差別是非常巨大的,雖然二者都要求運算符左右兩端的布爾值都是true,整個表達式的值才是true。但是,&&之所以稱為短路運算,是因為如果&&左邊的表達式的值是false,右邊的表達式會被直接短路掉,不會進行運算。
15
Java中的IO流分為幾種?
Java中的IO流分為兩種:一種是字節(jié)流,另一種是字符流。
IO流分別由四個抽象類來表示(兩輸入兩輸出):InputStream,OutputStream,Reader,Writer。
16
守護線程是什么?
用什么方法實現(xiàn)守護線程?
守護線程是運行在后臺的一種特殊進程。它獨立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。在Java中垃圾回收線程就是特殊的守護線程。
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)代理機制)給方法添加切面,通過反射來獲取方法包含的注解,如果包含自定義關(guān)鍵字注解,就通過Redis進行校驗攔截請求。
19
說說你熟悉的設(shè)計模式有哪些?
創(chuàng)建型模式:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式(5種)
結(jié)構(gòu)型模式:適配器模式、裝飾者模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。(7種)
行為型模式:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態(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格式等),完成深拷貝

【2020知了堂“校招內(nèi)推”就業(yè)特訓營】
獲取更多Java面試題