{eval=Array;=+count(Array);}
由于我每年都會(huì)面試不少程序員,其中就包括相當(dāng)數(shù)量的Java程序員,所以就這個(gè)問題,跟頭條的廣大網(wǎng)友交流一下。
Java工程師面試也是有一定的側(cè)重點(diǎn),做不同的研發(fā)方向,問題上也有所區(qū)別。另外,初級(jí)程序員與主力程序員的面試問題也有很大的不同,總的來說就是方向與定位相結(jié)合,下面為大家一一描述。
面試Java初級(jí)程序員的流程相對(duì)來說比較簡單,通常是兩輪面試,首輪面試一般進(jìn)行技術(shù)面試,次輪面試通常是有HR統(tǒng)一安排關(guān)于職業(yè)規(guī)劃以及心理方面的面試(大部分情況是走個(gè)流程),這兩輪面試中,技術(shù)面試起到了關(guān)鍵的作用。
面試初級(jí)程序員(2-3級(jí))一般從技術(shù)細(xì)節(jié)入手,要通過面試,首先要知道初級(jí)程序員都需要具備哪些能力。下面先描述一下作為一個(gè)Java初級(jí)程序員(2-3級(jí),Web方向?yàn)橹鳎?yīng)該滿足哪些要求:
清晰Java面向?qū)ο缶幊滩襟E,理解封裝、繼承、多態(tài)等核心概念,理解基本的前端內(nèi)容(HTML、CSS、JavaScript)。
能理解程序流程圖描述的功能需求,能獨(dú)立完成功能模塊的編寫、部署,能理解功能模塊之間的交互關(guān)系,能完成功能模塊之間的消息傳遞和處理。
能理解MVC、DAO等框架,并在實(shí)際開發(fā)中熟練使用,能獨(dú)立完成前后臺(tái)的數(shù)據(jù)處理,能完成各種認(rèn)證功能的處理。
能使用數(shù)據(jù)庫連接池等基本優(yōu)化方式提高程序運(yùn)行效率。
能理解容器在程序運(yùn)行中的作用,能配置各種容器的基本參數(shù)。
對(duì)程序的安全性有一定的理解,能避免初級(jí)的安全性問題。
能處理一定數(shù)量的并發(fā)問題,能解決多線程情況下的數(shù)據(jù)安全問題。
能理解不同角色的任務(wù)分配,能進(jìn)行有效溝通。
常見框架的使用,比如SpringMVC等。
初級(jí)程序員的工作往往是編寫程序基本功能組件,是保證程序質(zhì)量的一個(gè)重要環(huán)節(jié),所以團(tuán)隊(duì)的整體能力往往并不是由架構(gòu)師決定的,反而是由眾多的初級(jí)程序員決定的。
主力程序員的面試通常要3輪或4輪,當(dāng)然如果你走到了后面的兩輪,基本上選擇權(quán)就在你手里了,后面的兩輪面試公司會(huì)給你安排一個(gè)看似比較美好的職業(yè)發(fā)展規(guī)劃,因?yàn)橹髁Τ绦騿T不僅要編碼通常還承擔(dān)者一部分管理工作(項(xiàng)目責(zé)任人),也是管理層比較倚重的。
主力程序員的技術(shù)面試流程并沒有那么多細(xì)節(jié)問題,首先要了解一下做過哪些項(xiàng)目,在項(xiàng)目中都承擔(dān)了什么任務(wù),項(xiàng)目中遇到了哪些問題,怎么解決的等等。通常主力程序員的面試時(shí)間也比較長(2至3個(gè)小時(shí)),面試的氛圍也比初級(jí)程序員要輕松很多。
主力程序員大部分是推薦上來的,有人力資源公司推薦的,也有公司內(nèi)推上來的,當(dāng)然也有主動(dòng)投送簡歷要求面試的。一般對(duì)主力程序員都會(huì)有背景調(diào)查,這一方面是對(duì)公司負(fù)責(zé),另一方面也是對(duì)應(yīng)聘者應(yīng)有的尊重。
希望通過我的回答,大家能對(duì)Java程序員的面試有一個(gè)基本的了解。
我是悟空問答的簽約作者,致力于為頭條網(wǎng)友提供優(yōu)質(zhì)的科技類問題解答,關(guān)注我,跟我一起交流關(guān)于科技類的問題吧。
謝邀~
從第二家單位開始,就負(fù)責(zé)社招的面試工作(技術(shù)方面),近兩兩年,也開始負(fù)責(zé)校招的工作,和大家分享一下我一般會(huì)問的問題,和一些我比較看重的地方,大家可以借鑒。
其實(shí)說實(shí)話,我們單位校招沒有什么優(yōu)勢,一般來面試我們公司開發(fā)崗位的,最好也就是中等偏上的985學(xué)校(最低要求是一本)。所以一般來說,只要不是溝通能力特別差的,基本都會(huì)通過。但是面試流程還是要走的,我一般問的都特別簡單:
我主要是面試乙方(外包),初級(jí)基本上要兩年以上工作經(jīng)驗(yàn);基本上簡歷上寫什么,我就問什么,所以我建議,如果你不會(huì)的東西,不要隨便寫在簡歷上。
先做自我介紹,主要看一下表達(dá)能力和第一印象,所以我建議大家面試之前都準(zhǔn)備一套自我介紹的詞兒。
基本上還是從項(xiàng)目出發(fā),先問一下業(yè)務(wù)上的流程,這個(gè)階段的開發(fā),我對(duì)整個(gè)項(xiàng)目的流程問的少,還是主要問單個(gè)模塊的業(yè)務(wù)流程。
技術(shù)方面主要以使用為主,就是看看你是否到底使用過。比如寫了使用過Mybatis,那么我可能會(huì)問#和$的區(qū)別,如果寫了使用過Spring的話,那么我可能會(huì)問依賴注入有幾種方式,諸如此類。
SQL方面會(huì)問一些復(fù)雜SQL的寫法,比如一些數(shù)據(jù)庫函數(shù),左連接右連接之類的。
工作三到五年的。
還是從項(xiàng)目出發(fā),問的可能會(huì)稍微的多一些,希望對(duì)方可以對(duì)整個(gè)項(xiàng)目甚至是某一個(gè)行業(yè)有著整體的了解。
技術(shù)方面不僅僅要求是使用過了,我的要求可能會(huì)更高一些。如果還是Mybatis,那么我就可能會(huì)問到一級(jí)二級(jí)緩存,甚至是自定義緩存,如果是Spring的話,可能就會(huì)問到Bean是如何被管理的。
一些主流技術(shù)和框架,可能你沒寫在簡歷上,但是我也會(huì)問一問。比如現(xiàn)在很常見的內(nèi)存數(shù)據(jù)庫、Spring Boot等。
Java基礎(chǔ)知識(shí)可能會(huì)問,比如JVM相關(guān)、Java的集合等。
SQL方面,優(yōu)化是我主要問的,比如索引失效的問題。
高級(jí)的一般都招不來,哈哈,沒有面試過。
java基礎(chǔ),反射,多線程,static的作用,集合,數(shù)據(jù)庫等基礎(chǔ)知識(shí),還有就是數(shù)據(jù)庫,前端,java web(servlet,xml),ajax是面試的時(shí)候問的比較多的,以及一些主流框架的使用。還有做過的項(xiàng)目,以及在項(xiàng)目中遇到哪些比較難解決的問題,最后是怎么解決的。
學(xué)習(xí)java是在“如鵬網(wǎng)”上學(xué)習(xí)的,有詳細(xì)的課程體系,有網(wǎng)絡(luò)的地方就可以學(xué)習(xí),每個(gè)章節(jié)的后面都有相應(yīng)的練習(xí)題和面試口才題,需要以錄音的方式進(jìn)行提交,實(shí)時(shí)把控學(xué)習(xí)質(zhì)量,為面試做準(zhǔn)備。java重要知識(shí)點(diǎn)列舉。
在準(zhǔn)備面試之前,簡歷是很必要的,怎么寫簡歷,投簡歷,才能吸引面試官的眼球,簡歷上哪些內(nèi)容可以寫,哪些內(nèi)容是不能寫的。
在面試的過程中,應(yīng)該注意哪些問題,對(duì)于面試官提出來的問題,應(yīng)該怎么去回答。
看過“如鵬網(wǎng)”的免費(fèi)公開課《程序員找工作的六大環(huán)節(jié)揭秘》,從寫簡歷,投簡歷,面試,簽協(xié)議等方面進(jìn)行講解,分析的挺透徹的,可以去看看。
需要java視頻教程和“程序員找工作的六大環(huán)節(jié)揭秘”視頻教程的可在評(píng)論區(qū)留言哦。
換個(gè)角度,談?wù)勎覀冋腥藭r(shí),都會(huì)問那些問題:
面試Java初級(jí)工程師:我們通常會(huì)問Java基礎(chǔ)知識(shí),包括Java語法、Java工程化的一些知識(shí),重點(diǎn)看面試人的綜合素質(zhì),是否可以培養(yǎng);
面試Java中級(jí)工程師:我們通常會(huì)問Java常用框架的掌握情況,sql語法,Mysql等知識(shí),做過哪些項(xiàng)目?比如:MyBatis和Hibernate的區(qū)別,sql關(guān)聯(lián)查詢等等;
面試Java高級(jí)工程師:我們通常會(huì)問Java如何調(diào)優(yōu),Spring Cloud、Dubbo等分布式開發(fā)框架是否用過?微服務(wù)的理解等等;
不管初中高級(jí)工程師都會(huì)問到的問題是:溝通能力?邏輯思維能力?
給你列舉了以下幾項(xiàng): 如果以下都高清楚了,你已經(jīng)是一個(gè)頂尖的java工程師了!
一、Java基礎(chǔ)
1. String類為什么是final的。
1.線程安全2.支持字符串常量池?cái)?shù)據(jù)共享,節(jié)省資源,提高效率(因?yàn)槿绻呀?jīng)存在這個(gè)常量便不會(huì)再創(chuàng)建,直接拿來用)
2. HashMap的源碼,實(shí)現(xiàn)原理,底層結(jié)構(gòu)。
總的來說,HashMap就是數(shù)組+鏈表(哈希表或者散列函數(shù))的組合實(shí)現(xiàn),每個(gè)數(shù)組元素存儲(chǔ)一個(gè)鏈表的頭結(jié)點(diǎn),本質(zhì)上來說是哈希表“拉鏈法”的實(shí)現(xiàn)。
HashMap的鏈表元素對(duì)應(yīng)的是一個(gè)靜態(tài)內(nèi)部類Entry,Entry主要包含key,value,next三個(gè)元素
主要有put和get方法,put的原理是,通過hash&length-1計(jì)算index,此時(shí)記作Entry[index]=該元素。如果index相同
就是新入的元素放置到Entry[index],原先的元素記作Entry[index].next
get就比較簡單了,先遍歷數(shù)組,再遍歷鏈表元素。
null key總是放在Entry數(shù)組的第一個(gè)元素(允許存放一個(gè)空鍵值對(duì)的原因)
解決hash沖突的方法:鏈地址法
再散列rehash的過程:確定容量超過目前哈希表的容量,重新調(diào)整table 的容量大小,當(dāng)超過容量的最大值時(shí)
HashMap的容量size乘以負(fù)載因子[默認(rèn)0.75] = threshold 將會(huì)觸發(fā)擴(kuò)容
3. 說說你知道的幾個(gè)Java集合類:list、set、queue、map實(shí)現(xiàn)類咯。。。
queue的實(shí)現(xiàn)類: AbstractQueue, ArrayBlockingQueue, ConcurrentLinkedQueue, LinkedBlockingQueue, DelayQueue, LinkedList, PriorityBlockingQueue, PriorityQueue和ArrayDqueue
4. 描述一下ArrayList和LinkedList各自實(shí)現(xiàn)和區(qū)別
5. Java中的隊(duì)列都有哪些,有什么區(qū)別。
Queue: 基本上,一個(gè)隊(duì)列就是一個(gè)先入先出(FIFO)的數(shù)據(jù)結(jié)構(gòu)
Queue接口與List、Set同一級(jí)別,都是繼承了Collection接口。LinkedList實(shí)現(xiàn)了Deque接 口。
Queue的實(shí)現(xiàn)
1、沒有實(shí)現(xiàn)的阻塞接口的LinkedList: 實(shí)現(xiàn)了java.util.Queue接口和java.util.AbstractQueue接口
內(nèi)置的不阻塞隊(duì)列: PriorityQueue 和 ConcurrentLinkedQueue
PriorityQueue 和 ConcurrentLinkedQueue 類在 Collection Framework 中加入兩個(gè)具體集合實(shí)現(xiàn)。
PriorityQueue 類實(shí)質(zhì)上維護(hù)了一個(gè)有序列表。加入到 Queue 中的元素根據(jù)它們的天然排序(通過其 java.util.Comparable 實(shí)現(xiàn))或者根據(jù)傳遞給構(gòu)造函數(shù)的 java.util.Comparator 實(shí)現(xiàn)來定位。
ConcurrentLinkedQueue 是基于鏈接節(jié)點(diǎn)的、線程安全的隊(duì)列。并發(fā)訪問不需要同步。因?yàn)樗陉?duì)列的尾部添加元素并從頭部刪除它們,所以只要不需要知道隊(duì)列的大 小, ConcurrentLinkedQueue 對(duì)公共集合的共享訪問就可以工作得很好。收集關(guān)于隊(duì)列大小的信息會(huì)很慢,需要遍歷隊(duì)列。
2)實(shí)現(xiàn)阻塞接口的:
java.util.concurrent 中加入了 BlockingQueue 接口和五個(gè)阻塞隊(duì)列類。它實(shí)質(zhì)上就是一種帶有一點(diǎn)扭曲的 FIFO 數(shù)據(jù)結(jié)構(gòu)。不是立即從隊(duì)列中添加或者刪除元素,線程執(zhí)行操作阻塞,直到有空間或者元素可用。
五個(gè)隊(duì)列所提供的各有不同:
* ArrayBlockingQueue :一個(gè)由數(shù)組支持的有界隊(duì)列。
* LinkedBlockingQueue :一個(gè)由鏈接節(jié)點(diǎn)支持的可選有界隊(duì)列。
* PriorityBlockingQueue :一個(gè)由優(yōu)先級(jí)堆支持的無界優(yōu)先級(jí)隊(duì)列。
* DelayQueue :一個(gè)由優(yōu)先級(jí)堆支持的、基于時(shí)間的調(diào)度隊(duì)列。
* SynchronousQueue :一個(gè)利用 BlockingQueue 接口的簡單聚集(rendezvous)機(jī)制。
6. 反射中,Class.forName和classloader的區(qū)別
class.forName()除了將類的.class文件加載到j(luò)vm中之外,還會(huì)對(duì)類進(jìn)行解釋,執(zhí)行類中的static塊。
而classLoader只干一件事情,就是將.class文件加載到j(luò)vm中,不會(huì)執(zhí)行static中的內(nèi)容,只有在newInstance才會(huì)去執(zhí)行static塊。
Class.forName(name, initialize, loader)帶參函數(shù)也可控制是否加載static塊。并且只有調(diào)用了newInstance()方法采用調(diào)用構(gòu)造函數(shù),創(chuàng)建類的對(duì)象
7. Java7、Java8的新特性(baidu問的,好BT)
java7有一些比較重要的更新,如異常處理增加了被抑制的異常、捕獲多異常、try-with-resource自動(dòng)釋放資源等,還有應(yīng)用了G1垃圾回收器、switch可以使用String類型、泛型自動(dòng)判斷類型、fork/join框架把任務(wù)細(xì)分并使用多處理器處理、支持二進(jìn)制字面量等
毫無疑問,Java 8是自Java 5(2004年)發(fā)布以來Java語言最大的一次版本升級(jí),Java 8帶來了很多的新特性,比如編譯器、類庫、開發(fā)工具和JVM(Java虛擬機(jī))。在這篇教程中我們將會(huì)學(xué)習(xí)這些新特性,并通過真實(shí)例子演示說明它們適用的場景。
最最重要的是Java8開始支持了Lambda表達(dá)式
8. Java數(shù)組和鏈表兩種結(jié)構(gòu)的操作效率,在哪些情況下(從開頭開始,從結(jié)尾開始,從中間開始),哪些操作(插入,查找,刪除)的效率高
9. Java內(nèi)存泄露的問題調(diào)查定位:jmap,jstack的使用等等
10. string、stringbuilder、stringbuffer區(qū)別
11. hashtable和hashmap的區(qū)別
HashMap是非線程同步的,HashTable是線程同步的。
HashMap允許null作為鍵或者值,HashTable不允許
HashTable中有個(gè)一個(gè)contains方法,HashMap去掉了此方法
效率上來講,HashMap因?yàn)槭欠蔷€程安全的,因此效率比HashTable高
hashTable繼承Dictionary,而HashMap繼承Abstract
13 .異常的結(jié)構(gòu),運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常,各舉個(gè)例子
14. String a= “abc” String b = “abc” String c = new String(“abc”) String d = “ab” + “c” .他們之間用 == 比較的結(jié)果
編譯時(shí)優(yōu)化
15. String 類的常用方法
16. Java 的引用類型有哪幾種
對(duì)象的強(qiáng)、軟、弱和虛引用(四種引用)
在JDK 1.2以前的版本中,若一個(gè)對(duì)象不被任何變量引用,那么程序就無法再使用這個(gè)對(duì)象。也就是說,只有對(duì)象處于可觸及(reachable)狀態(tài),程序才能使用它。從JDK 1.2版本開始,把對(duì)象的引用分為4種級(jí)別,從而使程序能更加靈活地控制對(duì)象的生命周期。這4種級(jí)別由高到低依次為:強(qiáng)引用、軟引用、弱引用和虛引用。
⑴強(qiáng)引用(StrongReference)
強(qiáng)引用是使用最普遍的引用。如果一個(gè)對(duì)象具有強(qiáng)引用,那垃圾回收器絕不會(huì)回收它。當(dāng)內(nèi)存空間不足,Java虛擬機(jī)寧愿拋出OutOfMemoryError錯(cuò)誤,使程序異常終止,也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來解決內(nèi)存不足的問題。 ps:強(qiáng)引用其實(shí)也就是我們平時(shí)A a = new A()這個(gè)意思。
⑵軟引用(SoftReference)
如果一個(gè)對(duì)象只具有軟引用,則內(nèi)存空間足夠,垃圾回收器就不會(huì)回收它;如果內(nèi)存空間不足了,就會(huì)回收這些對(duì)象的內(nèi)存。只要垃圾回收器沒有回收它,該對(duì)象就可以被程序使用。軟引用可用來實(shí)現(xiàn)內(nèi)存敏感的高速緩存(下文給出示例)。
軟引用可以和一個(gè)引用隊(duì)列(ReferenceQueue)聯(lián)合使用,如果軟引用所引用的對(duì)象被垃圾回收器回收,Java虛擬機(jī)就會(huì)把這個(gè)軟引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。
⑶弱引用(WeakReference)
弱引用與軟引用的區(qū)別在于:只具有弱引用的對(duì)象擁有更短暫的生命周期。在垃圾回收器線程掃描它所管轄的內(nèi)存區(qū)域的過程中,一旦發(fā)現(xiàn)了只具有弱引用的對(duì)象,不管當(dāng)前內(nèi)存空間足夠與否,都會(huì)回收它的內(nèi)存。不過,由于垃圾回收器是一個(gè)優(yōu)先級(jí)很低的線程,因此不一定會(huì)很快發(fā)現(xiàn)那些只具有弱引用的對(duì)象。
弱引用可以和一個(gè)引用隊(duì)列(ReferenceQueue)聯(lián)合使用,如果弱引用所引用的對(duì)象被垃圾回收,Java虛擬機(jī)就會(huì)把這個(gè)弱引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。
⑷虛引用(PhantomReference)
“虛引用”顧名思義,就是形同虛設(shè),與其他幾種引用都不同,虛引用并不會(huì)決定對(duì)象的生命周期。如果一個(gè)對(duì)象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時(shí)候都可能被垃圾回收器回收。
虛引用主要用來跟蹤對(duì)象被垃圾回收器回收的活動(dòng)。虛引用與軟引用和弱引用的一個(gè)區(qū)別在于:虛引用必須和引用隊(duì)列 (ReferenceQueue)聯(lián)合使用。當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí),如果發(fā)現(xiàn)它還有虛引用,就會(huì)在回收對(duì)象的內(nèi)存之前,把這個(gè)虛引用加入到與之 關(guān)聯(lián)的引用隊(duì)列中。
ReferenceQueue queue = new ReferenceQueue ();
PhantomReference pr = new PhantomReference (object, queue);
程序可以通過判斷引用隊(duì)列中是否已經(jīng)加入了虛引用,來了解被引用的對(duì)象是否將要被垃圾回收。如果程序發(fā)現(xiàn)某個(gè)虛引用已經(jīng)被加入到引用隊(duì)列,那么就可以在所引用的對(duì)象的內(nèi)存被回收之前采取必要的行動(dòng)。
17. 抽象類和接口的區(qū)別
18. java的基礎(chǔ)類型和字節(jié)大小。
19. Hashtable,HashMap,ConcurrentHashMap 底層實(shí)現(xiàn)原理與線程安全問題(建議熟悉 jdk 源碼,才能從容應(yīng)答)
20. 如果不讓你用Java Jdk提供的工具,你自己實(shí)現(xiàn)一個(gè)Map,你怎么做。說了好久,說了HashMap源代碼,如果我做,就會(huì)借鑒HashMap的原理,說了一通HashMap實(shí)現(xiàn)
21. Hash沖突怎么辦?哪些解決散列沖突的方法?
開放地址法 插入元素時(shí),如果發(fā)生沖突,算法會(huì)簡單的從該槽位置向后循環(huán)遍歷hash表,直到找到表中的下一個(gè)空槽,并將該元素放入該槽中(會(huì)導(dǎo)致相同hash值的元素挨在一起和其他hash值對(duì)應(yīng)的槽被占用)。查找元素時(shí),首先散列值所指向的槽,如果沒有找到匹配,則繼續(xù)從該槽遍歷hash表,直到:(1)找到相應(yīng)的元素;(2)找到一個(gè)空槽,指示查找的元素不存在,(所以不能隨便刪除元素);(3)整個(gè)hash表遍歷完畢(指示該元素不存在并且hash表是滿的)
拉鏈法(hashMap采用的是該種方法)
再散列(雙重散列,多重散列)
建立一個(gè)公共溢出區(qū)
22. HashMap沖突很厲害,最差性能,你會(huì)怎么解決?從O(n)提升到log(n)咯,用二叉排序樹的思路說了一通
23. rehash
24. hashCode() 與 equals() 生成算法、方法怎么重寫
如何重寫equals()方法
如果你決定要重寫equals()方法,那么你一定要明確這么做所帶來的風(fēng)險(xiǎn),并確保自己能寫出一個(gè)健壯的equals()方法.一定要注意的一點(diǎn)是,在重寫equals()后,一定要重寫hashCode()方法.具體原因稍候再進(jìn)行說明.
我們先看看 JavaSE 7 Specification中對(duì)equals()方法的說明:
It is reflexive: for any non-null reference value x, x.equals(x) should return true.
It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.
It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.
It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified.
For any non-null reference value x, x.equals(null) should return false.
這段話用了很多離散數(shù)學(xué)中的術(shù)數(shù).簡單說明一下:
1. 自反性:A.equals(A)要返回true.
2. 對(duì)稱性:如果A.equals(B)返回true, 則B.equals(A)也要返回true.
3. 傳遞性:如果A.equals(B)為true, B.equals(C)為true, 則A.equals(C)也要為true. 說白了就是 A = B , B = C , 那么A = C.
4. 一致性:只要A,B對(duì)象的狀態(tài)沒有改變,A.equals(B)必須始終返回true.
5. A.equals(null) 要返回false.
相信只要不是專業(yè)研究數(shù)學(xué)的人,都對(duì)上面的東西不來電.在實(shí)際應(yīng)用中我們只需要按照一定的步驟重寫equals()方法就可以了.為了說明方便,我們先定義一個(gè)程序員類(Coder):
[java] view plain copy
class Coder {
private String name;
private int age;
// getters and setters
}
我們想要的是,如果2個(gè)程序員對(duì)象的name和age都是相同的,那么我們就認(rèn)為這兩個(gè)程序員是一個(gè)人.這時(shí)候我們就要重寫其equals()方法.因?yàn)槟J(rèn)的equals()實(shí)際是判斷兩個(gè)引用是否指向內(nèi)在中的同一個(gè)對(duì)象,相當(dāng)于 == . 重寫時(shí)要遵循以下三步:
1. 判斷是否等于自身.
[java] view plain copy
if(other == this)
return true;
2. 使用instanceof運(yùn)算符判斷 other 是否為Coder類型的對(duì)象.
[java] view plain copy
if(!(other instanceof Coder))
return false;
3. 比較Coder類中你自定義的數(shù)據(jù)域,name和age,一個(gè)都不能少.
[java] view plain copy
Coder o = (Coder)other;
return o.name.equals(name) && o.age == age;
看到這有人可能會(huì)問,第3步中有一個(gè)強(qiáng)制轉(zhuǎn)換,如果有人將一個(gè)Integer類的對(duì)象傳到了這個(gè)equals中,那么會(huì)不會(huì)扔ClassCastException呢?這個(gè)擔(dān)心其實(shí)是多余的.因?yàn)槲覀冊(cè)诘诙街幸呀?jīng)進(jìn)行了instanceof 的判斷,如果other是非Coder對(duì)象,甚至other是個(gè)null, 那么在這一步中都會(huì)直接返回false, 從而后面的代碼得不到執(zhí)行的機(jī)會(huì).
上面的三步也是<Effective Java>中推薦的步驟,基本可保證萬無一失.
如何重寫hashCode()方法
在JavaSE 7 Specification中指出,"Note that it is generally necessary to override the hashCode method whenever this method(equals) is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes."
如果你重寫了equals()方法,那么一定要記得重寫hashCode()方法.我們?cè)诖髮W(xué)計(jì)算機(jī)數(shù)據(jù)結(jié)構(gòu)課程中都已經(jīng)學(xué)過哈希表(hash table)了,hashCode()方法就是為哈希表服務(wù)的.
當(dāng)我們?cè)谑褂眯稳鏗ashMap, HashSet這樣前面以Hash開頭的集合類時(shí),hashCode()就會(huì)被隱式調(diào)用以來創(chuàng)建哈希映射關(guān)系.稍后我們?cè)賹?duì)此進(jìn)行說明.這里我們先重點(diǎn)關(guān)注一下hashCode()方法的寫法.
<Effective Java>中給出了一個(gè)能最大程度上避免哈希沖突的寫法,但我個(gè)人認(rèn)為對(duì)于一般的應(yīng)用來說沒有必要搞的這么麻煩.如果你的應(yīng)用中HashSet中需要存放上萬上百萬個(gè)對(duì)象時(shí),那你應(yīng)該嚴(yán)格遵循書中給定的方法.如果是寫一個(gè)中小型的應(yīng)用,那么下面的原則就已經(jīng)足夠使用了:
要保證Coder對(duì)象中所有的成員都能在hashCode中得到體現(xiàn).
對(duì)于本例,我們可以這么寫:
[java] view plain copy
@Override
public int hashCode() {
int result = 17;
result = result * 31 + name.hashCode();
result = result * 31 + age;
return result;
}
其中int result = 17你也可以改成20, 50等等都可以.看到這里我突然有些好奇,想看一下String類中的hashCode()方法是如何實(shí)現(xiàn)的.查文檔知:
"Returns a hash code for this string. The hash code for a String object is computed as
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
using int arithmetic, where s[i] is the ith character of the string, n is the length of the string, and ^ indicates exponentiation. (The hash value of the empty string is zero.)"
對(duì)每個(gè)字符的ASCII碼計(jì)算n - 1次方然后再進(jìn)行加和,可見Sun對(duì)hashCode的實(shí)現(xiàn)是很嚴(yán)謹(jǐn)?shù)? 這樣能最大程度避免2個(gè)不同的String會(huì)出現(xiàn)相同的hashCode的情況.
重寫equals()而不重寫hashCode()的風(fēng)險(xiǎn)
在Oracle的Hash Table實(shí)現(xiàn)中引用了bucket的概念.如下圖所示:
從上圖中可以看出,帶bucket的hash table大致相當(dāng)于哈希表與鏈表的結(jié)合體.即在每個(gè)bucket上會(huì)掛一個(gè)鏈表,鏈表的每個(gè)結(jié)點(diǎn)都用來存放對(duì)象.Java通過hashCode()方法來確定某個(gè)對(duì)象應(yīng)該位于哪個(gè)bucket中,然后在相應(yīng)的鏈表中進(jìn)行查找.在理想情況下,如果你的hashCode()方法寫的足夠健壯,那么每個(gè)bucket將會(huì)只有一個(gè)結(jié)點(diǎn),這樣就實(shí)現(xiàn)了查找操作的常量級(jí)的時(shí)間復(fù)雜度.即無論你的對(duì)象放在哪片內(nèi)存中,我都可以通過hashCode()立刻定位到該區(qū)域,而不需要從頭到尾進(jìn)行遍歷查找.這也是哈希表的最主要的應(yīng)用.
如:
當(dāng)我們調(diào)用HashSet的put(Object o)方法時(shí),首先會(huì)根據(jù)o.hashCode()的返回值定位到相應(yīng)的bucket中,如果該bucket中沒有結(jié)點(diǎn),則將 o 放到這里,如果已經(jīng)有結(jié)點(diǎn)了, 則把 o 掛到鏈表末端.同理,當(dāng)調(diào)用contains(Object o)時(shí),Java會(huì)通過hashCode()的返回值定位到相應(yīng)的bucket中,然后再在對(duì)應(yīng)的鏈表中的結(jié)點(diǎn)依次調(diào)用equals()方法來判斷結(jié)點(diǎn)中的對(duì)象是否是你想要的對(duì)象.
下面我們通過一個(gè)例子來體會(huì)一下這個(gè)過程:
我們先創(chuàng)建2個(gè)新的Coder對(duì)象:
[java] view plain copy
Coder c1 = new Coder("bruce", 10);
Coder c2 = new Coder("bruce", 10);
假定我們已經(jīng)重寫了Coder的equals()方法而沒有重寫hashCode()方法:
[java] view plain copy
@Override
public boolean equals(Object other) {
System.out.println("equals method invoked!");
if(other == this)
return true;
if(!(other instanceof Coder))
return false;
Coder o = (Coder)other;
return o.name.equals(name) && o.age == age;
}
然后我們構(gòu)造一個(gè)HashSet,將c1對(duì)象放入到set中:
[java] view plain copy
Set<Coder> set = new HashSet<Coder>();
set.add(c1);
再執(zhí)行:
[java] view plain copy
System.out.println(set.contains(c2));
我們期望contains(c2)方法返回true, 但實(shí)際上它返回了false.
c1和c2的name和age都是相同的,為什么我把c1放到HashSet中后,再調(diào)用contains(c2)卻返回false呢?這就是hashCode()在作怪了.因?yàn)槟銢]有重寫hashCode()方法,所以HashSet在查找c2時(shí),會(huì)在不同的bucket中查找.比如c1放到05這個(gè)bucket中了,在查找c2時(shí)卻在06這個(gè)bucket中找,這樣當(dāng)然找不到了.因此,我們重寫hashCode()的目的在于,在A.equals(B)返回true的情況下,A, B 的hashCode()要返回相同的值.
我讓hashCode()每次都返回一個(gè)固定的數(shù)行嗎
有人可能會(huì)這樣重寫:
[java] view plain copy
@Override
public int hashCode() {
return 10;
}
如果這樣的話,HashMap, HashSet等集合類就失去了其 "哈希的意義".用<Effective Java>中的話來說就是,哈希表退化成了鏈表.如果hashCode()每次都返回相同的數(shù),那么所有的對(duì)象都會(huì)被放到同一個(gè)bucket中,每次執(zhí)行查找操作都會(huì)遍歷鏈表,這樣就完全失去了哈希的作用.所以我們最好還是提供一個(gè)健壯的hashCode()為妙.
二、Java IO
1. 講講IO里面的常見類,字節(jié)流、字符流、接口、實(shí)現(xiàn)類、方法阻塞。
2. 講講NIO。
3. String 編碼UTF-8 和GBK的區(qū)別?
4. 什么時(shí)候使用字節(jié)流、什么時(shí)候使用字符流?
5. 遞歸讀取文件夾下的文件,代碼怎么實(shí)現(xiàn)
三、Java Web
1. session和cookie的區(qū)別和聯(lián)系,session的生命周期,多個(gè)服務(wù)部署時(shí)session管理。
2. servlet的一些相關(guān)問題
3. webservice相關(guān)問題
4. jdbc連接,forname方式的步驟,怎么聲明使用一個(gè)事務(wù)。舉例并具體代碼
5. 無框架下配置web.xml的主要配置內(nèi)容
6. jsp和servlet的區(qū)別
四、JVM
1. Java的內(nèi)存模型以及GC算法
2. jvm性能調(diào)優(yōu)都做了什么
3. 介紹JVM中7個(gè)區(qū)域,然后把每個(gè)區(qū)域可能造成內(nèi)存的溢出的情況說明
4. 介紹GC 和GC Root不正常引用。
5. 自己從classload 加載方式,加載機(jī)制說開去,從程序運(yùn)行時(shí)數(shù)據(jù)區(qū),講到內(nèi)存分配,講到String常量池,講到JVM垃圾回收機(jī)制,算法,hotspot。反正就是各種擴(kuò)展
6. jvm 如何分配直接內(nèi)存, new 對(duì)象如何不分配在堆而是棧上,常量池解析
7. 數(shù)組多大放在 JVM 老年代(不只是設(shè)置 PretenureSizeThreshold ,問通常多大,沒做過一問便知)
8. 老年代中數(shù)組的訪問方式
9. GC 算法,永久代對(duì)象如何 GC , GC 有環(huán)怎么處理
10. 誰會(huì)被 GC ,什么時(shí)候 GC
11. 如果想不被 GC 怎么辦
12. 如果想在 GC 中生存 1 次怎么辦
五、開源框架
1. hibernate和ibatis的區(qū)別
2. 講講mybatis的連接池。
3. spring框架中需要引用哪些jar包,以及這些jar包的用途
4. springMVC的原理
5. springMVC注解的意思
6. spring中beanFactory和ApplicationContext的聯(lián)系和區(qū)別
BeanFactory特點(diǎn)
BeanFactory常用的實(shí)現(xiàn)類是DefaultListableBeanFactory,調(diào)用者只需要使用getBean()方法就可以獲得指定的引用,無須關(guān)心Bean的實(shí)例化過程。創(chuàng)建Spring容器的實(shí)例時(shí),必須提供Spring容器管理的Bean的詳細(xì)配置信息。Spring的配置信息通常采用XML配置文件來設(shè)置,因此,創(chuàng)建BeanFactory實(shí)例時(shí),應(yīng)該提供XML配置文件作為參數(shù)。XML配置文件通常使用Resource對(duì)象傳入。
Resource isr = new ClassPathResource("beans.xml");
//Resource isr = new FileSystemResource("beans.xml");
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(beanFactory).loadBeanDefinition(isr);
ApplicationContext特點(diǎn)
ApplicationContext常用的實(shí)現(xiàn)類是FileSystemXmlApplicationContext、ClassPathXmlApplicationContext和AnnotationConfigApplicationContext。如果在Web應(yīng)用中使用Spring容器,則通常使用XmlWebApplicationContext、AnnotationConfigApplicationContext兩個(gè)實(shí)現(xiàn)類。如果需要使用多個(gè)XML配置文件創(chuàng)建Spring容器,可以使用FileSystemXmlApplicationContext或者是ClassPathXmlApplicationContext。
除了提供BeanFactory所支持的所有功能外,ApplicationContext還有額外的功能
默認(rèn)初始化所有的Singleton,也可以通過配置取消預(yù)初始化。
繼承MessageSource,因此支持國際化。
資源訪問,比如訪問URL和文件。
事件機(jī)制。
同時(shí)加載多個(gè)配置文件。
以聲明式方式啟動(dòng)并創(chuàng)建Spring容器。
由于ApplicationContext會(huì)預(yù)先初始化所有的Singleton Bean,于是在系統(tǒng)創(chuàng)建前期會(huì)有較大的系統(tǒng)開銷,但一旦ApplicationContext初始化完成,程序后面獲取Singleton Bean實(shí)例時(shí)候?qū)⒂休^好的性能。也可以為bean設(shè)置lazy-init屬性為true,即Spring容器將不會(huì)預(yù)先初始化該bean。
7. spring注入的幾種方式(循環(huán)注入)
8. spring如何實(shí)現(xiàn)事物管理的
set注入(通常也叫屬性注入),構(gòu)造函數(shù)注入,接口注入(這個(gè)現(xiàn)在基本不用),注解注入(@Autowire)
9. springIOC
10. spring AOP的原理
11. hibernate中的1級(jí)和2級(jí)緩存的使用方式以及區(qū)別原理(Lazy-Load的理解)
12. Hibernate的原理體系架構(gòu),五大核心接口,Hibernate對(duì)象的三種狀態(tài)轉(zhuǎn)換,事務(wù)管理。
六、多線程
1. Java創(chuàng)建線程之后,直接調(diào)用start()方法和run()的區(qū)別
2. 常用的線程池模式以及不同線程池的使用場景
3. newFixedThreadPool此種線程池如果線程數(shù)達(dá)到最大值后會(huì)怎么辦,底層原理。
4. 多線程之間通信的同步問題,synchronized鎖的是對(duì)象,衍伸出和synchronized相關(guān)很多的具體問題,例如同一個(gè)類不同方法都有synchronized鎖,一個(gè)對(duì)象是否可以同時(shí)訪問?;蛘咭粋€(gè)類的static構(gòu)造方法加上synchronized之后的鎖的影響。
5. 了解可重入鎖的含義,以及Lock 和synchronized的區(qū)別
1. lock是一個(gè)接口,而synchronized是java的一個(gè)關(guān)鍵字,synchronized是內(nèi)置的語言實(shí)現(xiàn);(具體實(shí)現(xiàn)上的區(qū)別在《Java虛擬機(jī)》中有講解底層的CAS不同,以前有讀過現(xiàn)在又遺忘了。)
2. synchronized在發(fā)生異常時(shí)候會(huì)自動(dòng)釋放占有的鎖,因此不會(huì)出現(xiàn)死鎖;而lock發(fā)生異常時(shí)候,不會(huì)主動(dòng)釋放占有的鎖,必須手動(dòng)unlock來釋放鎖,可能引起死鎖的發(fā)生。(所以最好將同步代碼塊用try catch包起來,finally中寫入unlock,避免死鎖的發(fā)生。)
3. lock等待鎖過程中可以用interrupt來終端等待,而synchronized只能等待鎖的釋放,不能響應(yīng)中斷;
4. lock可以通過trylock來知道有沒有獲取鎖,而synchronized不能;
5. Lock可以提高多個(gè)線程進(jìn)行讀操作的效率。(可以通過readwritelock實(shí)現(xiàn)讀寫分離)
6. 同步的數(shù)據(jù)結(jié)構(gòu),例如concurrentHashMap的源碼理解以及內(nèi)部實(shí)現(xiàn)原理,為什么他是同步的且效率高
7. atomicinteger和Volatile等線程安全操作的關(guān)鍵字的理解和使用
8. 線程間通信,wait和notify
9. 定時(shí)線程的使用
10. 場景:在一個(gè)主線程中,要求有大量(很多很多)子線程執(zhí)行完之后,主線程才執(zhí)行完成。多種方式,考慮效率。
11. 進(jìn)程和線程的區(qū)別
12. 什么叫線程安全?舉例說明
13. 線程的幾種狀態(tài)
14. 并發(fā)、同步的接口或方法
15. HashMap 是否線程安全,為何不安全。 ConcurrentHashMap,線程安全,為何安全。底層實(shí)現(xiàn)是怎么樣的。
16. J.U.C下的常見類的使用。 ThreadPool的深入考察; BlockingQueue的使用。(take,poll的區(qū)別,put,offer的區(qū)別);原子類的實(shí)現(xiàn)。
17. 簡單介紹下多線程的情況,從建立一個(gè)線程開始。然后怎么控制同步過程,多線程常用的方法和結(jié)構(gòu)
18. volatile的理解
19. 實(shí)現(xiàn)多線程有幾種方式,多線程同步怎么做,說說幾個(gè)線程里常用的方法
七、網(wǎng)絡(luò)通信
1. http是無狀態(tài)通信,http的請(qǐng)求方式有哪些,可以自己定義新的請(qǐng)求方式么。
2. socket通信,以及長連接,分包,連接異常斷開的處理。
3. socket通信模型的使用,AIO和NIO。
4. socket框架netty的使用,以及NIO的實(shí)現(xiàn)原理,為什么是異步非阻塞。
5. 同步和異步,阻塞和非阻塞。
6. OSI七層模型,包括TCP,IP的一些基本知識(shí)
7. http中,get post的區(qū)別
8. 說說http,tcp,udp之間關(guān)系和區(qū)別。
9. 說說瀏覽器訪問www.taobao.com,經(jīng)歷了怎樣的過程。
10. HTTP協(xié)議、 HTTPS協(xié)議,SSL協(xié)議及完整交互過程;
11. tcp的擁塞,快回傳,ip的報(bào)文丟棄
12. https處理的一個(gè)過程,對(duì)稱加密和非對(duì)稱加密
13. head各個(gè)特點(diǎn)和區(qū)別
14. 說說瀏覽器訪問www.taobao.com,經(jīng)歷了怎樣的過程。
八、數(shù)據(jù)庫MySql
1. MySql的存儲(chǔ)引擎的不同
2. 單個(gè)索引、聯(lián)合索引、主鍵索引
3. Mysql怎么分表,以及分表后如果想按條件分頁查詢?cè)趺崔k(如果不是按分表字段來查詢的話,幾乎效率低下,無解)
4. 分表之后想讓一個(gè)id多個(gè)表是自增的,效率實(shí)現(xiàn)
5. MySql的主從實(shí)時(shí)備份同步的配置,以及原理(從庫讀主庫的binlog),讀寫分離
6. 寫SQL語句。。。
7. 索引的數(shù)據(jù)結(jié)構(gòu),B+樹
8. 事務(wù)的四個(gè)特性,以及各自的特點(diǎn)(原子、隔離)等等,項(xiàng)目怎么解決這些問題
9. 數(shù)據(jù)庫的鎖:行鎖,表鎖;樂觀鎖,悲觀鎖
10. 數(shù)據(jù)庫事務(wù)的幾種粒度;
11. 關(guān)系型和非關(guān)系型數(shù)據(jù)庫區(qū)別
九、設(shè)計(jì)模式
1. 單例模式:飽漢、餓漢。以及餓漢中的延遲加載,雙重檢查
2. 工廠模式、裝飾者模式、觀察者模式。
3. 工廠方法模式的優(yōu)點(diǎn)(低耦合、高內(nèi)聚,開放封閉原則)
十、算法
1. 使用隨機(jī)算法產(chǎn)生一個(gè)數(shù),要求把1-1000W之間這些數(shù)全部生成。(考察高效率,解決產(chǎn)生沖突的問題)
2. 兩個(gè)有序數(shù)組的合并排序
3. 一個(gè)數(shù)組的倒序
4. 計(jì)算一個(gè)正整數(shù)的正平方根
5. 說白了就是常見的那些查找、排序算法以及各自的時(shí)間復(fù)雜度
6. 二叉樹的遍歷算法
7. DFS,BFS算法
9. 比較重要的數(shù)據(jù)結(jié)構(gòu),如鏈表,隊(duì)列,棧的基本理解及大致實(shí)現(xiàn)。
10. 排序算法與時(shí)空復(fù)雜度(快排為什么不穩(wěn)定,為什么你的項(xiàng)目還在用)
11. 逆波蘭計(jì)算器
12. Hoffman 編碼
13. 查找樹與紅黑樹
十一、并發(fā)與性能調(diào)優(yōu)
1. 有個(gè)每秒鐘5k個(gè)請(qǐng)求,查詢手機(jī)號(hào)所屬地的筆試題(記得不完整,沒列出),如何設(shè)計(jì)算法?請(qǐng)求再多,比如5w,如何設(shè)計(jì)整個(gè)系統(tǒng)?
2. 高并發(fā)情況下,我們系統(tǒng)是如何支撐大量的請(qǐng)求的
3. 集群如何同步會(huì)話狀態(tài)
4. 負(fù)載均衡的原理
5 .如果有一個(gè)特別大的訪問量,到數(shù)據(jù)庫上,怎么做優(yōu)化(DB設(shè)計(jì),DBIO,SQL優(yōu)化,Java優(yōu)化)
6. 如果出現(xiàn)大面積并發(fā),在不增加服務(wù)器的基礎(chǔ)上,如何解決服務(wù)器響應(yīng)不及時(shí)問題“。
7. 假如你的項(xiàng)目出現(xiàn)性能瓶頸了,你覺得可能會(huì)是哪些方面,怎么解決問題。
8. 如何查找 造成 性能瓶頸出現(xiàn)的位置,是哪個(gè)位置照成性能瓶頸。
9. 你的項(xiàng)目中使用過緩存機(jī)制嗎?有沒用用戶非本地緩存
————————————————
版權(quán)聲明:本文為CSDN博主「zhouwei1818」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhouwei1818/article/details/80180872
如果可以的話,**建議以一個(gè)和面試官交流的心態(tài)去面試**。而且普通面試大部分問答都是有一些套路的。
面試的過程中,肯定會(huì)有答不上來的時(shí)候,這個(gè)時(shí)候,坦然的說不知道,就行了;或者再說出來點(diǎn)你知道的,例如思路。**重點(diǎn)** 答不出來的時(shí)候一定要淡定,你和面試官是平等的!反過來讓你問面試官,他也肯定有答不上來的!
java基礎(chǔ)必考,線程、集合(list、map、linklist、array,什么無key遍歷map啊,鏈表倒置啊,這幾個(gè)東西的數(shù)據(jù)結(jié)構(gòu)和插入查詢特性啊,線程創(chuàng)建方式和同步啊)相關(guān)必問。最好能說清楚常見的設(shè)計(jì)模式、要能手寫一個(gè)單列模式。
**框架** :主要說你熟練的,會(huì)問一些,但是一般都比較基礎(chǔ),只要找;除非,你說你看過這個(gè)框架的源碼,剛好面試官也比較了解。
**數(shù)據(jù)庫** 可能會(huì)問你都用過什么,最好有一個(gè)用的熟練的,沒事兒去配置一下主從數(shù)據(jù)庫費(fèi)不了多少時(shí)間,然后就好答這個(gè)問題了。sql,一般是必考的,分組查詢,排序,連結(jié)查詢。很可能會(huì)讓你手寫sql語句。我還遇到了一個(gè)讓你查前多少行的,以及不用框架實(shí)現(xiàn)分頁查詢的。
**源碼** 其實(shí)源碼沒有那么的高大上,即使你說你熟練源碼,剛好面試官也熟悉,他最多也只能問問你這框架從啟動(dòng)到配置完成,從接收請(qǐng)求,到處理完成再返回的 ** 流程**然后再問一下,你從這些源碼里學(xué)到了什么?這個(gè)問題,建議去百度(我都是臨面試了才去百度這些有套路的問題)。
**前端** 你要是像我一樣,囂張到簡歷寫的連前端你都會(huì)不少,(不過現(xiàn)在確實(shí)很多公司的招聘后端的要求也要會(huì)一些前端)那就很可能要多面你一會(huì)兒了,再問問你簡歷里寫的用過的框架,手寫幾串js的代碼啊,還有可能會(huì)通過js代碼考察下對(duì)DOM概念的理解。正則表達(dá)式也是有可能的。
一般算法和數(shù)據(jù)結(jié)構(gòu)是必考的,操作系統(tǒng)也經(jīng)常被問。如果是校招的話,筆試中還會(huì)有一些排列組合啊,語文表達(dá)啊,思維拓展?。阏Σ蝗ジ咧姓校扛咧袆偖厴I(yè)的時(shí)候比較符合需求!!),其次,筆試過了還會(huì)有好幾輪面試,不管你說你扣過源碼,還是跟過還可以的項(xiàng)目,都會(huì)被往深里問,再往深里問,再再往深里問!
下邊是一個(gè)簡單的面試記錄
問:說說你的突出點(diǎn)
答:java基礎(chǔ)扎實(shí)(這個(gè)慌說的次數(shù)多了,現(xiàn)在說起來都沒感覺了,哈哈),框架使用熟練(這個(gè)慌說了你們也發(fā)現(xiàn)不了,所以也沒啥感覺),熟悉Tomcat源碼,springMVC源碼和結(jié)構(gòu)。
問:如果想要統(tǒng)計(jì)springMVC每一個(gè)訪問時(shí)長,放到log文件里,你在哪里做這個(gè)統(tǒng)計(jì)?為什么?
答:在preHandle攔截器里記錄訪問開始的時(shí)間,在postHandle里判斷是哪個(gè)訪問,計(jì)算訪問時(shí)間并存儲(chǔ)。
問:在posthandler里計(jì)算,并存儲(chǔ)是吧。答:是。
問:為什么?
答了一個(gè)錯(cuò)誤答案,然后又是一頓鄙視。,,
再問:用一個(gè)什么變量存?ThreadLocal?還是一個(gè)函數(shù)內(nèi)部局部變量,?
答:線程內(nèi),(其實(shí)是在猜)。
問:為什么? 你不要猜,也不用在乎我的反應(yīng),無論你答什么我都會(huì)問你為什么。
答:函數(shù)內(nèi)變量可能會(huì)不能覆蓋整個(gè)訪問的歷程,,一頓鄙視,然后突然反應(yīng)過來,不對(duì),我說的有問題,外層函數(shù)是可以的,那就放在函數(shù)內(nèi)局部變量里,節(jié)省資源。
問:如果我想把計(jì)算結(jié)果存到log里,在哪里做這個(gè)事情?
答:(悠長的停頓) 在posthandler處理結(jié)束,返回請(qǐng)求之前
問:為什么?
答:不占用處理請(qǐng)求的資源,(錯(cuò)誤答案,已經(jīng)慌亂)
問:確定?
答:不確定,,,停頓,,不對(duì) ,還是會(huì)占用資源。
問:然后呢
答:(不說話了,,,)(后來想想,這事兒應(yīng)該另起一個(gè)線程去做)
(鄙視狀,,,)
問:恩,說說Tomcat
答:(內(nèi)心:幸虧沒問tomcat優(yōu)化,JVM優(yōu)化,,不過,說說?說啥啊?難道說說這個(gè)干啥用的?還是說說哪個(gè)公司出的?說這些會(huì)不會(huì)直接趕人啊,,,就這樣過了最少一分鐘,哈哈)然后我就說了下tomcat的結(jié)構(gòu),和啟動(dòng)過程。
接著問:Tomcat和里面的Servlet是一個(gè)進(jìn)程還是多個(gè)進(jìn)程,
答:一個(gè)進(jìn)程內(nèi)
一頓鄙視,再問:為什么,,,??
答:因?yàn)槲矣X得進(jìn)程是分配資源的基本單位,一般來講,一個(gè)應(yīng)用就是一個(gè)進(jìn)程。
問:你確定?
(內(nèi)心:大爺?shù)?,估?jì)已經(jīng)掛了,那我還怕個(gè)球,,,于是乎,坐直,平視,語氣和神態(tài)突然就平靜了)
答:確定。
問:你大學(xué)什么專業(yè)?學(xué)過操作系統(tǒng)嗎?
答:計(jì)算機(jī)科學(xué)與技術(shù),當(dāng)然學(xué)過,我清楚的記得這一點(diǎn),進(jìn)程是分配資源的基本單位,不過,可能太久了,記不清了(其實(shí)內(nèi)心是:你長的美,你說的都對(duì))。
問:ok,一個(gè)應(yīng)用可以啟多個(gè)進(jìn)程嗎?
答:不可以
問:(鄙視狀)確定?
答:(平靜狀)不太確定
問:呵呵
答:麻煩您給講講吧,我不太懂。
問:一個(gè)應(yīng)用當(dāng)然是可以啟多個(gè)線程的,更何況還有跨應(yīng)用的線程調(diào)用,資源也是可以動(dòng)態(tài)分配的,,,(當(dāng)時(shí)沒聽太懂,也記不清了。)。末了來一句,難道你就沒打開過你的資源管理器看過嗎?
答:當(dāng)然看過,不過都是卡了才看,看哪個(gè)程序占用太高,給結(jié)束了。(內(nèi)心:看過,但是跟這個(gè)問題有毛關(guān)系嗎??)
上邊是倆個(gè)長問題,還有一些其他的,例如:
問:你覺得要做一個(gè)厲害的程序員應(yīng)該具備哪些特點(diǎn)?
這個(gè)就是一些,F(xiàn)Q啊,工具啊,總結(jié)啊,交流啊什么的;比如說,善用google,要至少對(duì)一個(gè)跨平臺(tái)的工具很了解,善于學(xué)習(xí)最新的技術(shù),善于掌握有力的工具,多逛各大社區(qū),善于總結(jié)。(我就隨便一寫,找工作的話,要提前準(zhǔn)備類似問題。)
問:我看你學(xué)了這么多東西,但是好像沒有認(rèn)真的去思考過為什么,你有沒有想過當(dāng)你記憶達(dá)到一個(gè)上限時(shí)你還能學(xué)什么?你還能干什么?
這個(gè)當(dāng)然是要反駁的,我說我當(dāng)然有思考,然后問你思考的啥,然后答當(dāng)時(shí)就想知道Tomcat到springMVC的銜接是怎么銜接的,然后被鄙視:那你直接打幾個(gè)斷點(diǎn)調(diào)試一下不完了嗎,java的調(diào)試不是很強(qiáng)嗎?(貌似這個(gè)他也不太確定。而我也不知道斷點(diǎn)打到哪去,更不用提怎么調(diào)試,哈哈)。
問:我看你這寫的有一個(gè)了解分布式處理,分布式處理是什么?我怎么沒聽過。(這個(gè)就是一個(gè)概念問題,不重要。)
java面試主體分為兩個(gè)部分:
(1).如何理解面向?qū)ο蟮木幊?/p>
(2).如何理解內(nèi)存中的堆棧和靜態(tài)存儲(chǔ)區(qū)的用法
(3).是否可以繼承String 類
(4).String和StringBuilder、StringBuffer區(qū)別?
等等這些常見的java基礎(chǔ)類題目
(1).spring mvc 工作機(jī)制原理
(2).Struts工作機(jī)制?為什么要使用Struts?
(3).如何優(yōu)化Hibernate?
現(xiàn)在只是簡單的列舉幾個(gè)面試題目,很多公司的面試直接都沒有筆試,因?yàn)樗降母叩屯ǔR饬x上講幾句話就能測試出水平的深淺,所以在面試需要注意以下幾點(diǎn):
1.簡歷上面不要摻雜太多的水份
2.面試過程中要懂得實(shí)事求是,不要吹的太厲害,中間遇上一個(gè)技術(shù)高手幾句話就能讓自己下不了臺(tái)
3.對(duì)于一些沒有工作經(jīng)驗(yàn)的初學(xué)者能做的事情,就是老老實(shí)實(shí)把基礎(chǔ)做好,沒有經(jīng)驗(yàn)?zāi)茏C明自己的只有基礎(chǔ),也只有打好自己的基礎(chǔ)才靠譜。
覺得有收獲就點(diǎn)贊
作為從事java開發(fā)6年的程序猿,參于的面試有七八十場吧,程序猿面試問題是根據(jù)企業(yè)的招聘需求而定的,三年和五年的程序員遇到的問題是有區(qū)別的,所以不能一概而論。
五年開發(fā)經(jīng)驗(yàn)的程序員問道的問題會(huì)更趨向于原理方面,當(dāng)然三年經(jīng)驗(yàn)的問題依然會(huì)問道,但是側(cè)重點(diǎn)不一樣了
ConcurrentHashMap的實(shí)現(xiàn)原理
java并發(fā)中的最佳實(shí)踐有哪些
volatile關(guān)鍵字的用途
是否用過消息隊(duì)列
是否用過zookeeper和dubbo
zookeeper的選舉機(jī)制說一下
以上就是一些面試會(huì)遇到的問題,當(dāng)然只是列舉了一些,因?yàn)槊總€(gè)面試官的側(cè)重點(diǎn)不一樣,有的面試官喜歡連環(huán)炮是的發(fā)問,問完一個(gè)接著深入問另一個(gè)相關(guān)的問題,知道自己回答不上來為止,有的是東一個(gè)問題西一個(gè)問題,所以沒有什么面試寶典,唯一能做的就是加深自己的修煉
我是北漂coder,以上就是我的回答,歡迎關(guān)注,一起探討交流
多線程,集合,jvm調(diào)優(yōu),gc ,spring 套餐,dubbo,主流框架。還有數(shù)據(jù)結(jié)構(gòu)。設(shè)計(jì)模式。
小面是我面試的經(jīng)歷。
【【冷酷到底】面試深受打擊,感覺迷茫了。一個(gè)程序員的自白】https://m.zjurl.cn/item/6529754521017516552/?iid=26166306190&app=news_article×tamp=1521475420&tt_from=copy_link&utm_source=copy_link&utm_medium=toutiao_ios&utm_campaign=client_share
2021年很多公司都在問黑紅樹,數(shù)據(jù)結(jié)構(gòu)與算法一定要看哦~
尚硅谷Java大廠面試題第3季,跳槽必刷題目+必掃技術(shù)盲點(diǎn)(周陽主講)_嗶哩嗶哩_bilibili
https://www.bilibili.com/video/BV1Hy4y1B78T?
尚硅谷Java大廠面試題第2季,面試必刷,跳槽大廠神器_嗶哩嗶哩_bilibili
https://www.bilibili.com/video/BV18b411M7xz?
尚硅谷經(jīng)典Java面試題第一季(java面試精講)_嗶哩嗶哩_bilibili
https://www.bilibili.com/video/BV1Eb411P7bP?
強(qiáng)烈推薦一個(gè)網(wǎng)站:
Java面試題-幫助你通過Java面試 (zwmst.com)
https://zwmst.com/
1.常用的數(shù)據(jù)結(jié)構(gòu)
2.數(shù)據(jù)里有{1,2,3, 4,5,6,7.8,9},請(qǐng)隨機(jī)打亂順序,生成一個(gè)新的數(shù)組(請(qǐng)以代碼實(shí)現(xiàn))
3.寫出代碼判斷一 個(gè)整數(shù)是不是2的階次方( 請(qǐng)代碼實(shí)現(xiàn),謝絕調(diào)用API方法)
4.假設(shè)今日是2015年3月1日,星期日,請(qǐng)算出13個(gè)月零6天后是星期幾,距離現(xiàn)在多少天(請(qǐng)用代碼實(shí)現(xiàn),謝絕調(diào)用API方法)
5.有兩個(gè)籃子,分別為A和B,籃子A里裝有雞蛋,籃子B里裝有蘋果,請(qǐng)用面向?qū)ο蟮乃枷雽?shí)現(xiàn)兩個(gè)籃子里的物品交換(請(qǐng)用代碼實(shí)現(xiàn))
1.知識(shí)點(diǎn)匯總
2.知識(shí)點(diǎn)詳解:
3.類加載與卸載
4.簡述一下JM的內(nèi)存模型
5.堆和棧的區(qū)別
6.什么時(shí)候會(huì)觸發(fā)FullC
7.什么是Java虛擬機(jī)?為什么Java被稱作是“平臺(tái)無關(guān)的編程語言
8.Java內(nèi)存結(jié)構(gòu)
9.對(duì)象分配規(guī)則
10.描述一下J加載class文件的原理機(jī)制?
11.Java對(duì)象創(chuàng)建過程
12.類的生命周期
13.簡述Javs的對(duì)象結(jié)構(gòu)
14.如何判斷對(duì)象可以被回收?
15.JVM的永久代中會(huì)發(fā)生垃圾回收么?
16.垃圾收集算法
17.調(diào)優(yōu)命令有哪些?
18.調(diào)優(yōu)工具
19.Minor GC與Full GC分別在什么時(shí)候發(fā)生?
20.你知道哪些JM性能調(diào)優(yōu)
21.JYM內(nèi)存分哪幾個(gè)區(qū),每個(gè)區(qū)的作用是什么?
22.簡述J ava垃圾回收機(jī)制?
23.什么是類加載器,類加載器有哪些?”
24.你有沒有遇到過OutOfMemory問題?你是怎么來處理這個(gè)問題的?處理過程中有哪些收獲?
26.跟JTM內(nèi)存相關(guān)的幾個(gè)核心參數(shù)圖解
27.如何啟動(dòng)系統(tǒng)的時(shí)候設(shè)置JVM的啟動(dòng)參數(shù)
1.Java中實(shí)現(xiàn)多線程有幾種方法
2.如何停止-個(gè)正在運(yùn)行的線程
3.noti fy 0和noti fyAll 0有什么區(qū)別?
4.sleep 0和waitO有什么區(qū)別
5.volatile是什么?可以保證有序性嗎?
6.Thread 類中的start0和run0方法有什么區(qū)別?
7.為什么wait, notify 和notifyA11這些方法不在thread類里面?
8.為什么wai t和noti fy方法要在同步塊中調(diào)用?
9.Java中interrupted和isInterruptedd方法的區(qū)別?
10.Java中synchronized和Reentr antLock有什么不同?
11.有三個(gè)線程T1, T2, T3,如何保證順序執(zhí)行?
12.Symchr oni Ie dMap和C oncurrentHashMap有什么區(qū)別?
13.什么是線程安全
14.Thread類中的yi el a方法有什么作用?
15.Java線程池中submitO和execute 0方法有什么區(qū)別?
16.說-說自己對(duì)于synchronized關(guān)鍵字的了解
17.說說自己是怎么使用symchronized關(guān)鍵字,在項(xiàng)目中用到了嗎synchr oni zed關(guān)鍵字最主要的三種使用方式:
18.什么是線程安全? Vector是一個(gè)線程安全類嗎?
19.volatile關(guān)鍵字的作用?
20.常用的線程池有哪些?
21.簡述一下你對(duì)線程 池的理解
22.Java程序是如何執(zhí)行的
23.說一說自己對(duì)于synchronized關(guān)鍵字的了解
24.說說自己是怎么使用synchronized關(guān)鍵字,在項(xiàng)目中用到了嗎
25.講一下synchronired 關(guān)鍵字的底層原理
26.為什么要用線程池?
27.實(shí)現(xiàn)Runnabl e接口和Callable接口的區(qū)別
28.執(zhí)行execute 0方法和submi t0方法的區(qū)別是什么呢?
29.如何創(chuàng)建線程池
1.Java語言有哪些特點(diǎn)
2.面向?qū)ο蠛兔嫦蜻^程的區(qū)別
3.八種基本數(shù)據(jù)類型的大小,以及他們的封裝類
4.標(biāo)識(shí)符的命名規(guī)則。
5.instanceof 關(guān)鍵字的作用
6.Java自動(dòng)裝箱與拆箱
7.重載和重寫的區(qū)別
8.equa1s與==的區(qū)別
9.Hasheode的作用
10.String String StringBuffer和StringBuilder 的區(qū)別是什么?
11.ArrayList和1inke aList的區(qū)
12.HashMap和HashT able的區(qū)別
13.Collecti on包結(jié)構(gòu),與Collecti ons的區(qū)別
14.Javs的四種引用,強(qiáng)弱軟虛
15.泛型常用特點(diǎn)
16.Jav創(chuàng)建對(duì)象有幾種方式?
17.有沒有可能兩個(gè)不相等的對(duì)象有相同的hasheode
18.深拷貝和淺拷貝的區(qū)別是什么?
19.final有哪些用法?
20.stati 都有哪些用法?
21.3*0. 1==0. 3返回值是什么
22.a=a+b與a+=b有什么區(qū)別嗎?
23.try catch finally; try里有return, finally還執(zhí)行么?
24.Exepti on與Error包結(jié)構(gòu)
25.00M你遇到過哪些情況,SOF你遇到過哪些情況
26.簡述線程、程序、進(jìn)程的基本概念。以及他們之間關(guān)系是什么
27.線程有哪些基本狀態(tài)?
28.Java序列化中如果有些字段不想進(jìn)行序列化,怎么辦?
29.Java中I0流
30.Java I0與HI0的區(qū)別
31.java反射的作用于原理
32.說說List, Set, Map三者的區(qū)別?
1.Sprine的I0C和AOP機(jī)制?
2.Spring中Autowired和Resouree關(guān)鍵字的區(qū)別?
3.依賴注入的方式有幾種,各是什么?
4.講一下什么是Spring
5.Spr ing MVC流程.
6.Spri ngMVYC怎么樣設(shè)定重定向和轉(zhuǎn)發(fā)的?
7. Sprin/MVC常用的注解有哪些?
8.Sprina的AOP理解:
9.Sprine的I0C理解
10.解釋- -下spring be an的生命周期
11.解釋Spring支持的幾種bean的作用域。
12. Spring基于xm1注入bean的幾種方式:
13.Spring框架中都用到了哪些設(shè)計(jì)模式?
1.什么是SpringBoot?為什么要用SpringBoot
2.Spring Boot. 的核心注解是哪個(gè)?它主要由哪幾個(gè)注解組成的?
3.運(yùn)行Spring Boot有哪幾種方式
4.如何理解Spring Boot 中的Starters?
5.如何在Spring Boo.啟動(dòng)的時(shí)候運(yùn)行一些特定的代碼?
6.Spring Boot需要獨(dú)立的容器運(yùn)行嗎?
7.Spring Boot中的監(jiān)視器是什么?
8.如何使用Spring Boot實(shí)現(xiàn)異常處理?
9.你如何理解Spring Boot中的Starters?
10.springboot常用的starter有哪些
11.SpringBoot 實(shí)現(xiàn)熱部署有哪幾種方式?
12.如何理解Spring Boot配置加載順序?
13.Spring Boot的核心配置文件有哪幾個(gè)?它們的區(qū)別是什么?
14.如何集成Spring Boot和ActiveMQ?
15.如何重新加載Spring Boot上的更改,而無需重新啟動(dòng)服務(wù)器?
16.Spring Boot、Spring MVC和Spring有什么區(qū)別?
17. 能否舉一個(gè)例子來解釋更多Staters的內(nèi)容?
18.Spring Boot還提供了其它的哪些Starter Project Opti ons
1.數(shù)據(jù)庫的三范式是什么
2.數(shù)據(jù)庫引擎有哪些
3.InoDB與MyISAM的區(qū)別
4.數(shù)據(jù)庫的事務(wù)
5.索引問題
6.SQL優(yōu)化
7.簡單說一說drop、 delete與truncate的區(qū)別
8.什么是視圖
9.什么是內(nèi)聯(lián)接、左外聯(lián)接、右外聯(lián)接?
10.并發(fā)事務(wù)帶來哪些問題?
11.事務(wù)隔離級(jí)別有哪些?MySQI的默認(rèn)隔離級(jí)別是?
12.大表如何優(yōu)化?
13.分庫分表之后,id主鍵如何處理?
14.mysq1有關(guān)權(quán)限的表都有哪幾個(gè)
15.mysq1有哪些數(shù)據(jù)類型
16.創(chuàng)建索引的三種方式,刪除索引
1.什么是MyBatis
2.MyBati s的優(yōu)點(diǎn)和缺點(diǎn)
3.#}和$ {}的區(qū)別是什么?
4.當(dāng)實(shí)體類中的屬性名和表中的字段名不一樣,怎么辦?
5.Mybatis是如何進(jìn)行分頁的?分頁插件的原理是什么?
6.Mybatis是如何將sql執(zhí)行結(jié)果封裝為目標(biāo)對(duì)象并返回的?都有哪些映射形式?
7.如何執(zhí)行批量插入?
8.Xm1映射文件中,除了常見的select |insert lupdae |delete標(biāo)簽之外,還有哪些標(biāo)簽?
9.MyBatis實(shí)現(xiàn)一對(duì)一有幾種方式?具體怎么操作的?
10.Mybatis是否支持延遲加載?如果支持,它的實(shí)現(xiàn)原理是什么?
11.Mybatis的一級(jí)、二級(jí)緩存:
1.Redi s持久化機(jī)制
2.緩存雪崩、緩存穿透、緩存預(yù)熱、緩存更新、緩存降級(jí)等問題
3.熱點(diǎn)數(shù)據(jù)和冷數(shù)據(jù)是什么
4.Memcache與Redi s;的區(qū)別都有哪些?
5.單線程的redi s為什么這么快
6.redi s的數(shù)據(jù)類型,以及每種數(shù)據(jù)類型的使用場景
7.redi s的過期策略以及內(nèi)存淘汰機(jī)制
8.Redis為什么是單線程的
9.Redis常見性能問題和解決方案?
10.為什么Redi s的操作是原子性的,怎么保證原子性的?
11.Redis事務(wù)
1.簡述一下什么是Nginx,它有什么優(yōu)勢和功能?
2.Nginx是如何處理一個(gè)HTTP請(qǐng)求的呢?
3.列舉-些Ngi nx的特性
4.請(qǐng)列舉Nginx和Apache之間的不同點(diǎn)
5.在Hginx中;如何使用未定義的服務(wù)器名稱來阻止處理請(qǐng)求?
6.請(qǐng)解釋Nei rx服務(wù)器上的Master和W orker進(jìn)程分別是什么?
7.請(qǐng)解釋代理中的正向代理和反向代理
8.解釋Nginx用途
1.什么是SpringCloud
2.什么是微服務(wù)
3.SpringCloud有什么優(yōu)勢
4.什么是服務(wù)熔斷?什么是服務(wù)降級(jí)?
5.Eureks和zookeeper都可以提供服務(wù)注冊(cè)與發(fā)現(xiàn)的功能,請(qǐng)說說兩個(gè)的區(qū)別?
6.SpringBoot和SpringCloud的區(qū)別?
7.負(fù)載平衡的意義什么?
8.什么是Hystrix?它如何實(shí)現(xiàn)容錯(cuò)?
9.什么是Hystrix斷路器?我們需要它嗎?
10.說說RPC的實(shí)現(xiàn)原理
1. ZooKeeper 是什么?
2. ZooKeeper 提供了什么?
3. Zookeeper文件系統(tǒng)
4. ZAB 協(xié)議?
5. 四種類型的數(shù)據(jù)節(jié)點(diǎn)Znode
6. Zookeeper Watcher 機(jī)制--數(shù)據(jù)變更通知
7.客戶端注冊(cè)Watcher 實(shí)現(xiàn)
8. 服務(wù)端處理Watcher 實(shí)現(xiàn)
9.客戶端回調(diào)Watcher
10. ACL 權(quán)限控制機(jī)制
11. Chroot 特性
12.會(huì)話管理
13.服務(wù)器角色
14. Zookeeper 下Server工作狀態(tài)
15.數(shù)據(jù)同步
16. zookeeper 是如何保證事務(wù)的順序一致性的?
17.分布式集群中為什么會(huì)有Master?
18. zk 節(jié)點(diǎn)宕機(jī)如何處理?
19. zookeeper 負(fù)載均衡和nginx負(fù)載均衡區(qū)別
20. Zookeeper 有哪幾種幾種部署模式?
21.集群最少要幾臺(tái)機(jī)器,集群規(guī)則是怎樣的?
22. 集群支持動(dòng)態(tài)添加機(jī)器嗎?
23. Zookeeper 對(duì)節(jié)點(diǎn)的watch監(jiān)聽通知是永久的嗎?為什么不是永久的?
24. Zookeeper 的java客戶端都有哪些?
25. chubby 是什么,和zookeeper比你怎么看?
26. 說幾個(gè)zookeeper 常用的命令。
27. ZAB和Paxos算法的聯(lián)系與區(qū)別?
28. Zookeeper的典型應(yīng)用場景
1.如何獲取topic 主題的列表
2.生產(chǎn)者和消費(fèi)者的命令行是什么?
3.consumer 是推還是拉?
4.講講kafka維護(hù)消費(fèi)狀態(tài)跟蹤的方法
5.講一下主從同步
6.為什么需要消息系統(tǒng),mysql不能滿足需求嗎?
7.Zookeeper 對(duì)于Kafka的作用是什么?
9.Kafka判斷-個(gè)節(jié)點(diǎn)是否還活著有那兩個(gè)條件?
10.Kafka與傳統(tǒng)MQ消息系統(tǒng)之間有三個(gè)關(guān)鍵區(qū)別
11.講一講kafka的ack的三種機(jī)制
12.消費(fèi)者如何不自動(dòng)提交偏移里由應(yīng)用提交?
13.消費(fèi)者故障,出現(xiàn)活鎖問題如何解決?
14.如何控制消費(fèi)的位置
15.kafka分布式(不是單機(jī))的情況下,如何保證消息的順序消費(fèi)
16.kafka的高可用機(jī)制是什么?
17.kafka如何減少數(shù)據(jù)丟失
18.kafka如何不消費(fèi)重復(fù)數(shù)據(jù)?比如扣款,我們不能重復(fù)的扣。
1.為什么使用順
2.MQ優(yōu)缺點(diǎn)
3.Kafka、ActiveMQ、Rabbi tMQ、RocketMQ都有什么區(qū)別?
4.如何保證高可用的?
5.如何保證消息的可靠傳輸?如果消息丟了怎么辦
6.如何保證消息的順序性
7.如何解決消息隊(duì)列的延時(shí)以及過期失效問題?消息隊(duì)列滿了以后該怎么處理?有幾百萬消息持續(xù)積壓幾小時(shí),說說怎么解決?
8.設(shè)計(jì)M9的思路
1.elasticsearch. 了解多少,說說你們公司es. 的集群架構(gòu),索引數(shù)據(jù)大小,分片有多少,以及一些調(diào)優(yōu)手段。
2.elasticsear ch的倒排索引是什么
3.elasticsearch 索引數(shù)據(jù)多了怎么辦,如何調(diào)優(yōu),部署
4.elasticsearch是如何實(shí)現(xiàn)mster 選舉的
5.詳細(xì)描述一 下Elasticsearch索引文檔的過程
6.詳細(xì)描述一 下Flasticsearch搜索的過程?
7.Elasticsearch 在部署時(shí),對(duì)Linux的設(shè)置有哪些優(yōu)化方法
8.lucence內(nèi)部結(jié)構(gòu)是什么?
9.Elasticsearch 是如何實(shí)現(xiàn)Master選舉的?
10.Elasticsearch 中的節(jié)點(diǎn)(比如共20個(gè)),其中的10個(gè)
11.客戶端在和集群連接時(shí),如何選擇特定的節(jié)點(diǎn)執(zhí)行請(qǐng)求的?
12.詳細(xì)描述一 下Elasticsearch索引文檔的過程。
13.詳細(xì)描述一 下Elasticsearch更新和刪除文檔的過程。
14.詳細(xì)描述一 下Elasticsearch搜索的過程。
15.在Elasticsearch中,是怎么根據(jù)一個(gè)詞找到對(duì)應(yīng)的倒排索引的?
16.Elasticsearch 在部署時(shí):又Linux的設(shè)置有哪些優(yōu)化方法?
17.對(duì)于GC方面,在使用Elasticsearch時(shí)要注意什么?
18.Elasticsearch對(duì)于大數(shù)據(jù)量(上億量級(jí)) 的聚合如何實(shí)現(xiàn)?
19.在并發(fā)情況下,F(xiàn)lasticsearc h如果保證讀寫- 致?
20.如何監(jiān)控Elasticsearch集群狀態(tài)?
21.介紹下你們電商搜索的整體技術(shù)架構(gòu)。
22.介紹一下你們的個(gè)性化搜索方
23.是否了解字典樹?
24.拼寫糾錯(cuò)是如何實(shí)現(xiàn)的?
1.絕對(duì)路徑用什么符號(hào)表示?當(dāng)前目錄、上層自錄用什么表示?主目錄用什么表示?切換目錄用什么命令?
2.怎么查看當(dāng)前進(jìn)程?怎么執(zhí)行退出?怎么查看當(dāng)前路徑?
3.怎么清屏?怎么退出當(dāng)前命令?怎么執(zhí)行睡眠?怎么查看當(dāng)前用戶id?查看指定幫助用什么命令?
4.Ls命令執(zhí)行什么功能?可以帶哪些參數(shù),有什么區(qū)別?
5.建立軟鏈接(快捷方式),以及硬鏈接的命令。
6.目錄創(chuàng)建用什么命令?創(chuàng)建文件用什么命令?復(fù)制文件用什么命令?
7.查看文件內(nèi)容有哪些命令可以使用?
8.隨意寫文件命令?怎么向屏幕輸出帶空格的字符串,比如”hello world" ?
9.終端是哪個(gè)文件夾下的哪個(gè)文件?黑洞文件是哪個(gè)文件夾下的哪個(gè)命令?
10.移動(dòng)文件用哪個(gè)命令?改名用哪個(gè)命令?
11.復(fù)制文件用哪個(gè)命令?如果需要連同文件夾一塊復(fù)制呢?如果需要有提示功能呢?
12.刪除文件用哪個(gè)命令?如果需要連目錄及目錄下文件一塊刪除呢?刪除空文件夾用什么命令?
13.Linux下命令有哪幾種可使用的通配符?分別代表什么含義?
14.用什么命令對(duì)一個(gè)文件的內(nèi)容進(jìn)行統(tǒng)計(jì)? (型號(hào)、 單詞數(shù)、字節(jié)數(shù))
15.Grep命令有什么用?如何忽略大小寫?如何查找不含該串的行?
16.Linur中進(jìn)程有哪幾種狀態(tài)?在ps顯示出來的信息中,分別用什么符號(hào)表示的?
17.怎么使一個(gè)命令在后臺(tái)運(yùn)行?
18.利用ps怎么顯示所有的進(jìn)程?怎么利用ps查看指定進(jìn)程的信
19.哪個(gè)命令專i ]用來查看后臺(tái)任務(wù)?
20.把后臺(tái)任務(wù)調(diào)到前臺(tái)執(zhí)行使用什么命令?把停下的后臺(tái)任務(wù)在后臺(tái)執(zhí)行起來用什么命令?
21.終止進(jìn)程用什么命令?帶什么參數(shù)?
22.怎么查看系統(tǒng)支持的所有信號(hào)?
23.搜索文件用什么命令?格式是怎么樣的?
24.查看當(dāng)前誰在使用該主機(jī)用什么命令?查找自己所在的終端信息用什么命令?
25.使用什么命令查看用過的命令列表?
26.使用什么命令查看磁盤使用空間?空閑空間呢?
27.使用什么命令查看網(wǎng)絡(luò)是否連通?
28.使用什么命令查看ip 地址及接口信息?
29.查看各類環(huán)境變量用什么命令
30.通過什么命令指定命令提示符
31.查找命令的可執(zhí)行文件是去哪查找的?怎么對(duì)其進(jìn)行設(shè)置及添加
32.通過什么命令查找執(zhí)行命令?
33.怎么對(duì)命令進(jìn)行取別名?
34.du和df的定義,以及區(qū)別
35.awk 詳解。
36.當(dāng)你需要給命令綁定一個(gè)宏或者按鍵的時(shí)候,應(yīng)該怎么做呢?
37.如果一個(gè)linux新手想要知道當(dāng)前系統(tǒng)支持的所有命令的列表, 他需要怎么做?
38.如果你的助手想要打印出當(dāng)前的目錄棧:你會(huì)建議他怎么做?
39.你的系統(tǒng)目前有許多正在運(yùn)行的任務(wù),在不重啟機(jī)器的條件下,有什么方法可以把所有正在運(yùn)行的進(jìn)程移除呢?
40.bash shell 中的hash 命令有什么作用?
41.哪-個(gè)bash內(nèi)置命令能夠進(jìn)行數(shù)學(xué)運(yùn)算。
42.怎樣一頁一頁地查看一個(gè)大文件的內(nèi)容呢?
43.數(shù)據(jù)字典屬于哪-個(gè)用戶的?
44.怎樣查看一個(gè)linw: 命令的概要與用法?假設(shè)你在/bin目錄中偶然看到一個(gè)你從沒見過的的命令,怎樣才能知道它的作用和用法呢?
45.使用哪一個(gè)命令可以查看自己文件系統(tǒng)的磁盤空間配額呢?
46.列舉幾個(gè)常用的Linux命令
47.你平時(shí)是怎么查看日志的?
1.為什么說簡歷很重要?
2.先從面試來說
3.再從面試說起
4.必知必會(huì)的幾點(diǎn)
5.必須了解的兩大法則
6.項(xiàng)目經(jīng)歷怎么寫
7.專業(yè)技能怎么寫
8.排版注意事項(xiàng)
9.其他一些小tips
0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答1
回答