一、Java底層基礎題
1、SpringMVC的原理以及返回數據如何渲染到jsp/html上?
答:Spring MVC的核心就是DispatcherServlet , 一個請求經過DispatcherServlet ,轉發給HandlerMapping ,然后經反射,對應 Controller及其里面方法的@RequestMapping地址,最后經ModelAndView和ViewResoler返回給對應視圖 。
2、一個類對象屬性發生改變時,如何讓調用者知道?
答:Java event時間監聽 ,即在set方法改變屬性時,觸發 ,這種模式也可以理解為觀察者模式。
3、重寫equals為何要重寫hashCode?
答:判斷兩個對象是否相等,比較的就是其hashCode, 如果你重載了equals,比如說是基於對象的內容實現的,而保留hashCode的實現不變,那么很可能某兩個對象明明是“相等”,而hashCode卻不一樣。 hashcode不一樣,就無法認定兩個對象相等了
4、談談你對JVM的理解?
答:Java語言的一個非常重要的特點就是與平台的無關性。而使用Java虛擬機是實現這一特點的關鍵。Java編譯器只要面向JVM,生成JVM能理解的代碼或字節碼文件。Java源文件經編譯成字節碼程序,通過JVM將每一條指令翻譯成不同平台機器碼,通過特定平台運行。
JVM執行程序的過程 :I.加載。class文件 ,II.管理並分配內存 ,III.執行垃圾收集
JRE(java運行時環境)由JVM構造的java程序的運行環境
5、Mysql的事物隔離級別?
答:Mysql的事物隔離級別 其實跟 Spring的事物隔離級別一樣,都是1、Read Uncommitted(讀取未提交內容), 2、Read Committed(讀取提交內容),3、Repeatable Read(可重讀),4、Serializable(可串行化)。
6、Spring的原理
答:Spring的核心是IOC和AOP ,IOC是依賴注入和控制反轉, 其注入方式可分為set注入、構造器注入、接口注入等等。IOC就是一個容器,負責實例化、定位、配置應用程序中的對象及建立這些對象間的依賴。簡單理解就是:JAVA每個業務邏輯處理至少需要兩個或者以上的對象協作進行工作,但是每個對象在使用它的合作對象的時候,都需要頻繁的new 對象來實現,你就會發現,對象間的耦合度高了。而IOC的思想是:Spring容器來管理這些,對象只需要處理本身業務關系就好了。至於什么是控制反轉,就是獲得依賴對象的方式反轉了。
Spring提供了對AOP技術的良好封裝, AOP稱為面向切面編程,就是系統中有很多各不相干的類的方法,在這些眾多方法中要加入某種系統功能的代碼,例如,加入日志,加入權限判斷,加入異常處理,這種應用稱為AOP。實現AOP功能采用的是代理技術,客戶端程序不再調用目標,而調用代理類,代理類與目標類對外具有相同的方法聲明,有兩種方式可以實現相同的方法聲明,一是實現相同的接口,二是作為目標的子類在,JDK中采用Proxy類產生動態代理的方式為某個接口生成實現類,如果要為某個類生成子類,則可以用CGLI B。在生成的代理類的方法中加入系統功能和調用目標類的相應方法,系統功能的代理以Advice對象進行提供,顯然要創建出代理對象,至少需要目標類和Advice類。spring提供了這種支持,只需要在spring配置文件中配置這兩個元素即可實現代理和aop功能,例如,
<bean id=”proxy” type=”org.spring.framework.aop.ProxyBeanFactory”>
<property name=”target” ref=””></property>
<property name=”advisor” ref=””></property>
</bean>
7、談談你對NIO的理解
答:IO是面向流,NIO是面向緩沖 ,(Tomcat三種運行模式之一,還有bio、apr兩種) 性能方面 bio<nio<apr.
8、ArrayList和LinkedList、Vector的區別?
答:總得來說可以理解為:.
1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指針。
3.對於新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據
Vector和ArrayList類似,但屬於強同步類,即線程安全的。
9、隨便說說幾個單例模式,並選擇一種線程安全的
答:單例的類別:懶漢、餓漢、枚舉、靜態內部類、雙重校驗鎖 等等 , 選擇線程安全我選最后一種,雙重校驗鎖。
10、談談紅黑樹
答:算法和數據結構一直是我薄弱之處,這方面說自己補吧,成效不大。
11、舉例說說幾個排序,並說明其排序原理
答:這里我就不細說了。
12、Mysql索引的原理
答:
1. 什么是索引:我們拿出一本新華字典,它的目錄實際上就是一種索引:非聚集索引。我們可以通過目錄迅速定位我們要查的字。而字典的內容部分一般都是按照拼音排序的,這實際上又是一種索引:聚集索引。
2:用不用索引
索引至少會帶來如下的overhead
額外的創建時間
額外的存儲空間(單列索引占原表5%至15%空間,想象一下如果為一個表創建三四個索引)
額外的維護時間
這一切只為了一個目的:減少在small range query的情況下的query time。如果是大range query 返回1%以上的數據,這情況下索引的意義不大。
3. 用什么索引:
low selectivity情況下 比如parent column為性別,bitmap index什么的可以考慮
high selectivity可以用btree什么的來維持二分查找的查找效率13、序列化的原理和作用
答:Serialization(序列化)是一種將對象以一連串的字節描述的過程;反序列化deserialization是一種將這些字節重建成一個對象的過程,主要用於HTTP或者WebService接口傳輸過程中對象參數的傳播。
二、並發及項目調優
1、說說線程安全的幾種實現方式?
答:什么是線程安全? 我的理解是這樣的,一個對象被多個線程同時訪問,還能保持其內部屬性的順序性及同步性,則認定為線程安全。實現線程安全的三種方式:被volatile、synchronized等關鍵字修飾,或者使用java.util.concurrent下面的類庫。 至於前兩者的關系。
答:我們知道異步其實就是讓另一個線程去跑,那么如何創建線程? 第一種直接new Thread ,第二種new 一個實現Runnable接口的實現類。 第三種,通過線程池來管理創建等 ,這里說到更好的實現異步,那就是說我們在方法內部避免頻繁的new 線程,就可以考慮線程池了。 那么線程池如何創建? 這里可以new 一個線程池,但是需要考慮單例,或者在程序初始啟東時,就創建一個線程池,讓他跑着,然后在具體方法的時候,通過線程池來創建線程,實現異步
3、項目中為何要用緩存?如何理解nginx + tomcat + redis 集群緩存?
答1:最直接的表現就是減輕數據庫的壓力。避免因為數據讀取頻繁或過大而影響數據庫性能,降低程序宕機的可能性
答2:nginx常用做靜態內容服務和代理服務器,直面外來請求轉發給后面的應用服務。nginx本身也能做緩存,比如靜態頁面的緩存什么的。而tomcat是應用服務器,處理JAVA WEB程序功能等等 。你也可以這么理解,假設把用戶的請求當做是一條河流,那么nginx就相當於一個水利工程,tomcat相當於一條條分流的支流,而redis 相當於支流旁邊的一個個水庫。 當你洪水來了,nginx根據你每條支流的承受力度分發不同的水流量,在確保程序正常運行的情況下,分發給每條支流(tomcat)不同的水流量。而redis相當於一個個支流的水庫,存儲水源,降低壓力,讓后面的水量平穩。
4、日常項目中,如果你接手,你准備從哪些方面調優?
答:這個呢首先是了解哪些需要優化,需要優化肯定是項目性能遭遇瓶頸或者猜測即將遭遇了,我們才會去考慮優化。那么怎么優化?
a、擴容 ,擴容的理解,就是擴充服務器並行處理的能力,簡單來說就是加服務器,增加處理請求的能力,例如增加nginx 、tomcat等應用服務器的個數,或者物理服務器的個數,還有加大服務器帶寬等等,這里考慮的是硬件方面
b、調優 ,調優,包括系統調優和代碼調優 。 系統調優就是說加快處理速度,比如我們所提到的CDN、ehcache、redis等緩存技術,消息隊列等等,加快服務間的響應速度,增加系統吞吐量,避免並發,至於代碼調優,這些就需要多積累了,比如重構、工廠等, 數據庫調優的話這個我不是很懂,只知道索引和存儲過程。
5、談談你對分布式的理解
答:個人理解:分布式就是把一個系統/業務 拆分成多個子系統/子業務 去協同處理,這個過程就叫分布式。
6、Redis實現消息隊列
答:Redis實現消息隊列 、參考2
7、另總結多線程相關面試題50道
8、分享一個調優工具和方案:如何利用 JConsole觀察分析Java程序的運行,進行排錯調優
9、樂觀鎖和悲觀鎖的理解及如何實現,有哪些實現方式?
樂觀鎖,每次操作時不加鎖而是假設沒有沖突而去完成某項操作,如果因為沖突失敗就重試,直到成功為止
悲觀鎖是會導致其它所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖。
樂觀鎖可以使用volatile+CAS原語實現
悲觀鎖可以使用synchronize的以及Lock。
三、手寫代碼題(包含sql題)
1、假設商戶表A(id , city ) ,交易流水表B (aid, amount , time) 這里的time代表交易時間, 請用sql寫出查詢每個城市每個月的銷售業績(答案可在評論里回復)
2、假設有一個數組 A ,int[] A = { 1 , 3 , -1 ,0 , 2 , 1 , -4 , 2 , 0 ,1 ... N}; 原來是需要查出大於0的數組,但是由於傳參錯誤或者其他原因,導致查出0和負數了,現在要求在不使用新數組和新集合的情況下(即只使用這個A數組,因數組數據比較大,且只能用一次循環) 實現正數放到數組的前面,小於等於0的數放到數組的末尾(答案可在評論里回復)
總結:
暫時就先總結這些,后續再補充吧,面試題千變萬化,不變的是知識點和技術根本。基礎很重要,故不積跬步,無以至千里;不積小流,無以成江海。學好基礎,把握好技術的原理,然后去實踐,這樣才能深入了解一門技術,學不可以已!
另外,面試過程中,保持自信,不會的咱大膽的說不會,沒啥好丟臉的,不會不是說你真的不會,也許是忘了,也許是沒注意到,記住面試題目,回來自己補充資料和相關的信息,相信你肯定會越來越從容,要記住不是為了面試而面試,而是為了未來的工作而面試,如果能一直保持這個狀態,沒有什么事情拿不下的。
拿我自己來說,很多不會,關鍵在於你願不願意去學,願不願意去付諸行動。