集錦一: html
一、 JVM結構原理、GC工做機制詳解java
答:具體參照:JVM結構、GC工做機制詳解 ,說到GC,記住兩點:一、GC是負責回收全部無任何引用對象的內存空間。 注意:垃圾回收回收的是無任何引用的對象佔據的內存空間而不是對象自己,二、GC回收機制的兩種算法,a、引用計數法 b、可達性分析算法( 這裏的可達性,你們能夠看基礎2 Java對象的什麼週期),至於更詳細的GC算法介紹,你們能夠參考:Java GC機制算法mysql
二、Java對象的生命週期linux
答:建立階段 、 應用階段 、不可見階段 、不可達階段 、收集階段 、終結階段、 對象空間從新分配階段等等,具體參照:Java 對象的生命週期nginx
三、Map或者HashMap的存儲原理web
答:HashMap是由數組+鏈表的一個結構組成,具體參照:HashMap的實現原理面試
四、當數據表中A、B字段作了組合索引,那麼單獨使用A或單獨使用B會有索引效果嗎?(使用like查詢如何有索引效果)redis
答:看A、B兩字段作組合索引的時候,誰在前面,誰在後面,若是A在前,那麼單獨使用A會有索引效果,單獨使用B則沒有,反之亦然。同理,使用like模糊查詢時,若是隻是使用前面%,那麼有索引效果,若是使用雙%號匹配,那麼則無索引效果算法
五、數據庫存儲日期格式時,如何考慮時區轉換問題?spring
答:使用TimeStamp , 緣由參照:Java編程中遇到的時區轉換問題
六、Java Object類中有哪些方法?
七、HTTP協議,GET和POST 的區別
一、SimpleDataFormat是非線程安全的,如何更好的使用而避免風險呢
答:關於SimpleDateFormat安全的時間格式化線程安全問題
二、如何看待設計模式,並簡單說說你對觀察者模式的理解
三、集羣環境中,session如何實現共享
答:
二、session多服務器共享方案,還有一種方案就是使用一個固定的服務器專門保持session,其餘服務器共享
四、分佈式、集羣環境中,緩存如何刷新,如何保持同步?
答:
A、緩存如何刷新? 一、定時刷新 二、主動刷新覆蓋 ,每一個緩存框架都有自帶的刷新機制,或者說緩存失效機制,就拿Redis和 Ehcache舉例, 他們都有自帶的過時機制,另外主動刷新覆蓋時,只需獲取對應的key進行數據的覆蓋便可
B、緩存如何保持同步? 這個redis有自帶的集羣同步機制,即複製功能,具體參考:基於Redis分佈式緩存實現 ,Ehcache也有分佈式緩存同步的配置,只須要配置不一樣服務器地址便可,參照:Ehcache分佈式緩存同步
五、一條sql執行過長的時間,你如何優化,從哪些方面?
答:
一、查看sql是否涉及多表的聯表或者子查詢,若是有,看是否能進行業務拆分,相關字段冗餘或者合併成臨時表(業務和算法的優化)
二、涉及鏈表的查詢,是否能進行分表查詢,單表查詢以後的結果進行字段整合
三、若是以上兩種都不能操做,非要鏈表查詢,那麼考慮對相對應的查詢條件作索引。加快查詢速度
四、針對數量大的表進行歷史表分離(如交易流水錶)
五、數據庫主從分離,讀寫分離,下降讀寫針對同一表同時的壓力,至於主從同步,mysql有自帶的binlog實現 主從同步
六、explain分析sql語句,查看執行計劃,分析索引是否用上,分析掃描行數等等
七、查看mysql執行日誌,看看是否有其餘方面的問題
我的理解:從根本上來講,查詢慢是佔用mysql內存比較多,那麼能夠從這方面去酌手考慮
一、SpringMVC的原理以及返回數據如何渲染到jsp/html上?
答:Spring MVC的核心就是 DispatcherServlet , 一個請求通過 DispatcherServlet ,轉發給HandlerMapping ,而後經反射,對應 Controller及其裏面方法的@RequestMapping地址,最後經ModelAndView和ViewResoler返回給對應視圖 。 具體可參考:Spring MVC的工做原理
二、一個類對象屬性發生改變時,如何讓調用者知道?
答:Java event時間監聽 ,即在set方法改變屬性時,觸發 ,這種模式也能夠理解爲觀察者模式,具體查看:觀察者模式簡單案例和說明
三、重寫equals爲什麼要重寫hashCode?
答:判斷兩個對象是否相等,比較的就是其hashCode, 若是你重載了equals,好比說是基於對象的內容實現的,而保留hashCode的實現不變,那麼極可能某兩個對象明明是「相等」,而hashCode卻不同。 hashcode不同,就沒法認定兩個對象相等了
四、談談你對JVM的理解?
答: Java語言的一個很是重要的特色就是與平臺的無關性。而使用Java虛擬機是實現這一特色的關鍵。Java編譯器只要面向JVM,生成JVM能理解的代碼或字節碼文件。Java源文件經編譯成字節碼程序,經過JVM將每一條指令翻譯成不一樣平臺機器碼,經過特定平臺運行。
JVM執行程序的過程 :I.加載。class文件 ,II.管理並分配內存 ,III.執行垃圾收集
JRE(java運行時環境)由JVM構造的java程序的運行環境
具體詳情:JVM原理和調優
五、Mysql的事物隔離級別?
答:Mysql的事物隔離級別 其實跟 Spring的事物隔離級別同樣,都是一、Read Uncommitted(讀取未提交內容), 二、Read Committed(讀取提交內容),三、Repeatable Read(可重讀),四、Serializable(可串行化) 具體參照:mysql事物隔離級別
六、Spring的原理
答:Spring的核心是IOC和AOP ,IOC是依賴注入和控制反轉, 其注入方式可分爲set注入、構造器注入、接口注入等等。IOC就是一個容器,負責實例化、定位、配置應用程序中的對象及創建這些對象間的依賴。簡單理解就是:JAVA每一個業務邏輯處理至少須要兩個或者以上的對象協做進行工做,可是每一個對象在使用它的合做對象的時候,都須要頻繁的new 對象來實現,你就會發現,對象間的耦合度高了。而IOC的思想是:Spring容器來管理這些,對象只須要處理自己業務關係就行了。至於什麼是控制反轉,就是得到依賴對象的方式反轉了。
AOP呢,面向切面編程,最直接的體現就是Spring事物管理。至於Spring事物的相關資料,就不細說了,參考:Spring註解式事物管理
七、談談你對NIO的理解
答:IO是面向流,NIO是面向緩衝 ,這裏不細講了,具體參照:Java NIO和IO的區別
八、ArrayList和LinkedList、Vector的區別?
答:總得來講能夠理解爲:.
1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
2.對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針。
3.對於新增和刪除操做add和remove,LinedList比較佔優點,由於ArrayList要移動數據
Vector和ArrayList相似,但屬於強同步類,即線程安全的,具體比較參照:比較ArrayList、LinkedList、Vector
九、隨便說說幾個單例模式,並選擇一種線程安全的
答:單例的類別:懶漢、餓漢、枚舉、靜態內部類、雙重校驗鎖 等等 , 選擇線程安全我選最後一種,雙重校驗鎖。 具體實現方式參照:Java:單例模式的七種寫法
十、談談紅黑樹
答:算法和數據結構一直是我薄弱之處,這方面說本身補吧,成效不大,這裏我就推薦一個:紅黑樹
十一、舉例說說幾個排序,並說明其排序原理
答:這裏我就不細說了,你們本身看看 Java實現幾種常見的排序算法
十二、Mysql索引的原理
答:索引的做用你們都知道,就是加快查詢速度,可是原理,我說不上來,這裏直接看吧:Mysql索引工做原理
1三、序列化的原理和做用
答:Serialization(序列化)是一種將對象以一連串的字節描述的過程;反序列化deserialization是一種將這些字節重建成一個對象的過程,主要用於HTTP或者WebService接口傳輸過程當中對象參數的傳播,具體可參看:Java序列化機制和原理
一、說說線程安全的幾種實現方式?
答:什麼是線程安全? 個人理解是這樣的,一個對象被多個線程同時訪問,還能保持其內部屬性的順序性及同步性,則認定爲線程安全。實現線程安全的三種方式:被volatile、synchronized等關鍵字修飾,或者使用java.util.concurrent下面的類庫。 至於前二者的關係,參考:synchronized和volatile的用法區別
二、方法內部,如何實現更好的異步?
答:咱們知道異步其實就是讓另外一個線程去跑,那麼如何建立線程? 第一種直接new Thread ,第二種new 一個實現Runnable接口的實現類。 第三種,經過線程池來管理建立等 ,這裏說到更好的實現異步,那就是說咱們在方法內部避免頻繁的new 線程,就能夠考慮線程池了。 那麼線程池如何建立? 這裏能夠new 一個線程池,可是須要考慮單例,或者在程序初始啓東時,就建立一個線程池,讓他跑着,而後在具體方法的時候,經過線程池來建立線程,實現異步
三、項目中爲什麼要用緩存?如何理解nginx + tomcat + redis 集羣緩存?
答1:最直接的表現就是減輕數據庫的壓力。避免由於數據讀取頻繁或過大而影響數據庫性能,下降程序宕機的可能性
答2:nginx經常使用作靜態內容服務和代理服務器,直面外來請求轉發給後面的應用服務。nginx自己也能作緩存,好比靜態頁面的緩存什麼的。而tomcat是應用服務器,處理JAVA WEB程序功能等等 。你也能夠這麼理解,假設把用戶的請求當作是一條河流,那麼nginx就至關於一個水利工程,tomcat至關於一條條分流的支流,而redis 至關於支流旁邊的一個個水庫。 當你洪水來了,nginx根據你每條支流的承受力度分發不一樣的水流量,在確保程序正常運行的狀況下,分發給每條支流(tomcat)不一樣的水流量。而redis至關於一個個支流的水庫,存儲水源,下降壓力,讓後面的水量平穩。
四、平常項目中,若是你接手,你準備從哪些方面調優?
答:這個呢首先是瞭解哪些須要優化,須要優化確定是項目性能遭遇瓶頸或者猜想即將遭遇了,咱們纔會去考慮優化。那麼怎麼優化?
a、擴容 ,擴容的理解,就是擴充服務器並行處理的能力,簡單來講就是加服務器,增長處理請求的能力,例如增長nginx 、tomcat等應用服務器的個數,或者物理服務器的個數,還有加大服務器帶寬等等,這裏考慮的是硬件方面
b、調優 ,調優,包括系統調優和代碼調優 。 系統調優就是說加快處理速度,好比咱們所提到的CDN、ehcache、redis等緩存技術,消息隊列等等,加快服務間的響應速度,增長系統吞吐量,避免併發,至於代碼調優,這些就須要多積累了,好比重構、工廠等, 數據庫調優的話這個我不是很懂,只知道索引和存儲過程,具體參考:Mysql數據庫調優21個最佳實踐 ,其餘數據庫調優方面就各位本身找找吧
五、談談你對分佈式的理解
答:我的理解:分佈式就是把一個系統/業務 拆分紅多個子系統/子業務 去協同處理,這個過程就叫分佈式,具體的演變方式參考:Java分佈式應用技術架構介紹
六、Redis實現消息隊列
答:Redis實現消息隊列 、參考2
八、分享一個調優工具和方案:如何利用 JConsole觀察分析Java程序的運行,進行排錯調優
一、假設商戶表A(id , city ) ,交易流水錶B (aid, amount , time) 這裏的time表明交易時間, 請用sql寫出查詢每一個城市每月的銷售業績(答案可在評論裏回覆)
二、假設有一個數組 A ,int[] A = { 1 , 3 , -1 ,0 , 2 , 1 , -4 , 2 , 0 ,1 ... N}; 原來是須要查出大於0的數組,可是因爲傳參錯誤或者其餘緣由,致使查出0和負數了,如今要求在不使用新數組和新集合的狀況下(即只使用這個A數組,因數組數據比較大,且只能用一次循環) 實現正數放到數組的前面,小於等於0的數放到數組的末尾(答案可在評論裏回覆)
面試還會問到一些關於設計方案相關的問題,好比
一、你的接口服務數據被人截包了,你如何防止數據惡意提交?
答:咱們能夠在接口傳輸參數裏面設置一個業務編號,這個編號用來區分是否重複提交。這樣即便數據被抓包了,對方也沒法區分每一個字段你的含義,這時,這個業務編號的做用就來了
二、假設服務器常常宕機,你從哪些方面去排查問題?
答:這個就留個各位看官補充了,可評論回覆
集錦二:
1、Java基礎
1. String類爲何是final的。
2. HashMap的源碼,實現原理,底層結構。
3. 說說你知道的幾個Java集合類:list、set、queue、map實現類咯。。。
4. 描述一下ArrayList和LinkedList各自實現和區別
5. Java中的隊列都有哪些,有什麼區別。
6. 反射中,Class.forName和classloader的區別
7. Java七、Java8的新特性(baidu問的,好BT)
8. Java數組和鏈表兩種結構的操做效率,在哪些狀況下(從開頭開始,從結尾開始,從中間開始),哪些操做(插入,查找,刪除)的效率高
9. Java內存泄露的問題調查定位:jmap,jstack的使用等等
10. string、stringbuilder、stringbuffer區別
11. hashtable和hashmap的區別
13 .異常的結構,運行時異常和非運行時異常,各舉個例子
14. String a= 「abc」 String b = 「abc」 String c = new String(「abc」) String d = 「ab」 + 「c」 .他們之間用 == 比較的結果
15. String 類的經常使用方法
16. Java 的引用類型有哪幾種
17. 抽象類和接口的區別
18. java的基礎類型和字節大小。
19. Hashtable,HashMap,ConcurrentHashMap 底層實現原理與線程安全問題(建議熟悉 jdk 源碼,才能從容應答)
20. 若是不讓你用Java Jdk提供的工具,你本身實現一個Map,你怎麼作。說了很久,說了HashMap源代碼,若是我作,就會借鑑HashMap的原理,說了一通HashMap實現
21. Hash衝突怎麼辦?哪些解決散列衝突的方法?
22. HashMap衝突很厲害,最差性能,你會怎麼解決?從O(n)提高到log(n)咯,用二叉排序樹的思路說了一通
23. rehash
24. hashCode() 與 equals() 生成算法、方法怎麼重寫
2、Java IO
1. 講講IO裏面的常見類,字節流、字符流、接口、實現類、方法阻塞。
2. 講講NIO。
3. String 編碼UTF-8 和GBK的區別?
4. 何時使用字節流、何時使用字符流?
5. 遞歸讀取文件夾下的文件,代碼怎麼實現
3、Java Web
1. session和cookie的區別和聯繫,session的生命週期,多個服務部署時session管理。
2. servlet的一些相關問題
3. webservice相關問題
4. jdbc鏈接,forname方式的步驟,怎麼聲明使用一個事務。舉例並具體代碼
5. 無框架下配置web.xml的主要配置內容
6. jsp和servlet的區別
4、JVM
1. Java的內存模型以及GC算法
2. jvm性能調優都作了什麼
3. 介紹JVM中7個區域,而後把每一個區域可能形成內存的溢出的狀況說明
4. 介紹GC 和GC Root不正常引用。
5. 本身從classload 加載方式,加載機制說開去,從程序運行時數據區,講到內存分配,講到String常量池,講到JVM垃圾回收機制,算法,hotspot。反正就是各類擴展
6. jvm 如何分配直接內存, new 對象如何不分配在堆而是棧上,常量池解析
7. 數組多大放在 JVM 老年代(不僅是設置 PretenureSizeThreshold ,問一般多大,沒作過一問便知)
8. 老年代中數組的訪問方式
9. GC 算法,永久代對象如何 GC , GC 有環怎麼處理
10. 誰會被 GC ,何時 GC
11. 若是想不被 GC 怎麼辦
12. 若是想在 GC 中生存 1 次怎麼辦
5、開源框架
1. hibernate和ibatis的區別
2. 講講mybatis的鏈接池。
3. spring框架中須要引用哪些jar包,以及這些jar包的用途
4. springMVC的原理
5. springMVC註解的意思
6. spring中beanFactory和ApplicationContext的聯繫和區別
7. spring注入的幾種方式(循環注入)
8. spring如何實現事物管理的
9. springIOC
10. spring AOP的原理
11. hibernate中的1級和2級緩存的使用方式以及區別原理(Lazy-Load的理解)
12. Hibernate的原理體系架構,五大核心接口,Hibernate對象的三種狀態轉換,事務管理。
6、多線程
1. Java建立線程以後,直接調用start()方法和run()的區別
2. 經常使用的線程池模式以及不一樣線程池的使用場景
3. newFixedThreadPool此種線程池若是線程數達到最大值後會怎麼辦,底層原理。
4. 多線程之間通訊的同步問題,synchronized鎖的是對象,衍伸出和synchronized相關不少的具體問題,例如同一個類不一樣方法都有synchronized鎖,一個對象是否能夠同時訪問。或者一個類的static構造方法加上synchronized以後的鎖的影響。
5. 瞭解可重入鎖的含義,以及ReentrantLock 和synchronized的區別
6. 同步的數據結構,例如concurrentHashMap的源碼理解以及內部實現原理,爲何他是同步的且效率高
7. atomicinteger和Volatile等線程安全操做的關鍵字的理解和使用
8. 線程間通訊,wait和notify
9. 定時線程的使用
10. 場景:在一個主線程中,要求有大量(不少不少)子線程執行完以後,主線程才執行完成。多種方式,考慮效率。
11. 進程和線程的區別
12. 什麼叫線程安全?舉例說明
13. 線程的幾種狀態
14. 併發、同步的接口或方法
15. HashMap 是否線程安全,爲什麼不安全。 ConcurrentHashMap,線程安全,爲什麼安全。底層實現是怎麼樣的。
16. J.U.C下的常見類的使用。 ThreadPool的深刻考察; BlockingQueue的使用。(take,poll的區別,put,offer的區別);原子類的實現。
17. 簡單介紹下多線程的狀況,從創建一個線程開始。而後怎麼控制同步過程,多線程經常使用的方法和結構
18. volatile的理解
19. 實現多線程有幾種方式,多線程同步怎麼作,說說幾個線程裏經常使用的方法
7、網絡通訊
1. http是無狀態通訊,http的請求方式有哪些,能夠本身定義新的請求方式麼。
2. socket通訊,以及長鏈接,分包,鏈接異常斷開的處理。
3. socket通訊模型的使用,AIO和NIO。
4. socket框架netty的使用,以及NIO的實現原理,爲何是異步非阻塞。
5. 同步和異步,阻塞和非阻塞。
6. OSI七層模型,包括TCP,IP的一些基本知識
7. http中,get post的區別
8. 說說http,tcp,udp之間關係和區別。
9. 說說瀏覽器訪問www.taobao.com,經歷了怎樣的過程。
10. HTTP協議、 HTTPS協議,SSL協議及完整交互過程;
11. tcp的擁塞,快回傳,ip的報文丟棄
12. https處理的一個過程,對稱加密和非對稱加密
13. head各個特色和區別
14. 說說瀏覽器訪問www.taobao.com,經歷了怎樣的過程。
8、數據庫MySql
1. MySql的存儲引擎的不一樣
2. 單個索引、聯合索引、主鍵索引
3. Mysql怎麼分表,以及分表後若是想按條件分頁查詢怎麼辦(若是不是按分表字段來查詢的話,幾乎效率低下,無解)
4. 分表以後想讓一個id多個表是自增的,效率實現
5. MySql的主從實時備份同步的配置,以及原理(從庫讀主庫的binlog),讀寫分離
6. 寫SQL語句。。。
7. 索引的數據結構,B+樹
8. 事務的四個特性,以及各自的特色(原子、隔離)等等,項目怎麼解決這些問題
9. 數據庫的鎖:行鎖,表鎖;樂觀鎖,悲觀鎖
10. 數據庫事務的幾種粒度;
11. 關係型和非關係型數據庫區別
9、設計模式
1. 單例模式:飽漢、餓漢。以及餓漢中的延遲加載,雙重檢查
2. 工廠模式、裝飾者模式、觀察者模式。
3. 工廠方法模式的優勢(低耦合、高內聚,開放封閉原則)
10、算法
1. 使用隨機算法產生一個數,要求把1-1000W之間這些數所有生成。(考察高效率,解決產生衝突的問題)
2. 兩個有序數組的合併排序
3. 一個數組的倒序
4. 計算一個正整數的正平方根
5. 說白了就是常見的那些查找、排序算法以及各自的時間複雜度
6. 二叉樹的遍歷算法
7. DFS,BFS算法
9. 比較重要的數據結構,如鏈表,隊列,棧的基本理解及大體實現。
10. 排序算法與時空複雜度(快排爲何不穩定,爲何你的項目還在用)
11. 逆波蘭計算器
12. Hoffman 編碼
13. 查找樹與紅黑樹
11、併發與性能調優
1. 有個每秒鐘5k個請求,查詢手機號所屬地的筆試題(記得不完整,沒列出),如何設計算法?請求再多,好比5w,如何設計整個系統?
2. 高併發狀況下,咱們系統是如何支撐大量的請求的
3. 集羣如何同步會話狀態
4. 負載均衡的原理
5 .若是有一個特別大的訪問量,到數據庫上,怎麼作優化(DB設計,DBIO,SQL優化,Java優化)
6. 若是出現大面積併發,在不增長服務器的基礎上,如何解決服務器響應不及時問題「。
7. 假如你的項目出現性能瓶頸了,你以爲可能會是哪些方面,怎麼解決問題。
8. 如何查找 形成 性能瓶頸出現的位置,是哪一個位置照成性能瓶頸。
9. 你的項目中使用過緩存機制嗎?有沒用用戶非本地緩存
12、其餘
1.經常使用的linux下的命令