標籤:number 資料 ioc tor ati 相容 決定 壓縮 隔離等級
兩周的時間,面試了杭州將近20多家軟體公司,有時下熱門的互連網行業,也有傳統行業。涉及的行業眾多,社交直播平台的、安防監控的、消費信貸的、大Alibaba Antifraud Service、互連網醫學、電商的等等。這裡寫一下自己面試過程中的遇到的面試題,藉以反思一下自己面試的不足。
1.Spring架構的IOC和AOP原理;
IOC:在傳統的程式實現裡,由代碼來控制組件之間的關係,使用new關鍵字來實現兩個組件之間的結合,這樣會帶來對象之間的耦合,像齒輪轉動一樣,有了IOC,它將實現組件關係從內部像外部轉移,由容器在運行期間將依賴關係注入到組件中。根據類名動態產生對象,這種編程方式可以在對象產生的時候才決定到底是哪一種對象。
AOP:通過在代理對象中包裹切面,運行期間將切面織入到容器管理的bean中,代理類封裝了目標類,並攔截被通知方法的調用,再將調用轉寄給真正的目標bean。當攔截到方法調用,在調用目標bean之前代理會執行切面邏輯。AOP提供了兩種方式來組建代理程式對象:JDKProxy和Cglib,具體使用哪種方式由AopProxyFactory根據AdvisedSupport對象的配置來決定。預設策略是如果目標類是介面就使用JDK動態代理請求,否則使用Cglib來代理。
2.類載入機制
Class檔案由類裝載器裝載後,在jvm中將形成一份描述class結構元資訊對象,通過該對象可以獲知class的結構資訊,如建構函式、屬性和方法。
雙親委派模型:
如果一個類載入器接收到類載入請求,它首先把這個請求委託給父類載入器去完成,因此,所有載入請求都應該傳送到頂層啟動類載入器中,只有父載入器反饋自己無法完成這個載入請求,子載入器才會嘗試自己去載入。
裝載:
- 通過一個類的全限定名擷取此類的二進位位元組流;
- 將這個位元組流所代表的靜態儲存結構轉化為方法區運行時的資料結構;
- 在java堆中產生一個代表這個類的java.lang.Class作為方法區這些資料的入口;
驗證:
- 檔案格式驗證:保證輸入的位元組流能正確解析並儲存於方法區內;
- 中繼資料驗證:對類中的各個資料類型進行校正分析;
- 對方法體驗證,保證被校正的類的方法在運行中不會做出危害虛擬機器安全的行為;
- 符號引用驗證:對常量池中的各種符號引用進行匹配校正;
準備:
正式為類變數分配記憶體,並設定變數初始值,記憶體都將在方法區進行分配;
解析:
虛擬機器將常量池中的符號引用替換為直接引用的過程
3.分散式交易
基於XA協議的兩階段交易認可和訊息+最終一致性
4.常用設計模式
單例、工廠、適配器、責任鏈、門面、裝飾、策略、觀察者等 說出幾個,並知道實現方法和應用情境。
5.sql調優
- 盡量避免使用查詢模糊比對,會導致索引失效。like‘%param%‘
- 避免對索引欄位進行計算操作,在索引欄位上使用not/<>/!=等,避免在索引欄位上出現isNull/isNotNull,以及不要在索引上使用函數或空值;
- 嵌套子查詢可以考慮使用暫存資料表
- union all能解決的情境不要使用union
- 避免在where語句中出現in/not in/having
- 不要以字元格式設定聲明數字
- select 語句要標識要查詢的欄位,不要總是select *!!
6.分庫分表策略
- 中間變數=user_id%(分庫數量*每個分表數量)
- 庫=取整(中間變數/每個庫表數量)
- 表=中間變數%每個庫表數量
[email protected]和@Autowired區別
同:都是做bean注入使用
異:@AutoWired預設按照類型byType裝配對象,依賴對象必須存在,如果允許null值,可以設定required屬性為false。@Resource預設按照byName注入,由j2ee提供;
8.java7新特性、java8新特性
9.servlet生命週期
初始化階段調用init方法
響應客戶請求調用service方法
終止階段調用destory方法
10.頁面載入慢的原因
減少請求數、減少資源大小、找最快的伺服器三方面去最佳化。
最佳化圖片資源的格式和大小;
開啟網路壓縮;
使用瀏覽器緩衝;
減少重新導向,每一次重新導向都會導致瀏覽器重新載入請求,延長載入時間;
使用cdn緩衝靜態資源
減少dns解析次數
壓縮js和css去掉空格等
11.set底層實現
利用map的key不能重複
12.jvm分代記憶體回收
Eden區用來建立新對象,滿觸發一次young GC,將還被使用的對象複製到from區,Eden區再次用完再次用完,再觸發一次young GC,將eden和from區的還在被使用的對象複製到to區,下一次young GC則是將Eden區和to區還被使用的對象複製到from區,超過閾值對象還沒有被釋放,複製到old generation。old用完觸發full GC。合理設定young generation和old generation避免產生full gc.
13.負載平衡演算法
輪詢、加權輪詢、隨機、最少串連、源地址散列。
14.高可用架構設計
主要手段:資料和服務的冗餘備份和失效轉移
15.高可用服務
分級管理,核心應用與服務優先使用更好的硬體
逾時設定,一旦逾時,通訊架構拋出異常,應用可選擇重試和請求轉移
非同步呼叫,消費者在訊息佇列取
服務降級,拒絕服務和關閉服務,保證核心應用和功能能正常運行
等冪性設計,保證服務調用多次和一次結果相同;
16.反射機制
17.分布式緩衝的一致性hash(網易)
18.https原理(網易)
19.樂觀鎖和悲觀鎖(網易)
20.資料庫隔離等級
21.spring事務傳播屬性
22.301與302區別(網易)
301永久轉移 302暫時轉移
23.get與post區別
24.表建索引規則
避免對大資料類型建立索引
經常使用group by和order by的建立索引
用於串連的列建立索引
對那些頻繁出現在where子句中的建立索引
確定表是大量查詢還是增刪改
25.跨域有幾種方式(網易)
26.HashMap與ConcurrentHashMap
27.分布式鎖如何??
28.kafka技術優點,以及是怎麼實現的?
29.Tcp/IP協議的三向交握與四次揮手
30.線程間如何通訊?(網易)
同步(synchronized)比如線程A和線程B都持有一個object,線程B需要等到A執行後才能運行。A與B就實現了通訊,本質上是共用記憶體通訊,多個線程需要訪問同一個共用變數,誰拿了鎖就可以先執行
wait/notify機制,A調用wait進入阻塞,條件滿足時,B調用notify喚醒A
管道通訊就是使用PipedInputStream和PipedOutputStream進行通訊
31.spring如何處理循環相依性?
構造器循環相依性:
<bean id="A" class="com.donsun.student.StudentA"> 2 <constructor-arg index="0" ref="B"></constructor-arg> 3 </bean> 4 <bean id="B" class="com.donsun.student.StudentB">5 <constructor-arg index="0" ref="C"></constructor-arg> 6 </bean> 7 <bean id="C" class="com.donsun.student.StudentC">8 <constructor-arg index="0" ref="A"></constructor-arg> 9 </bean>
Spring容器會將每一個正在建立的Bean 標識符放在一個“當前建立Bean池”中,Bean標識符在建立過程中將一直保在這個池中,因此如果在建立Bean過程中發現自己已經在“當前建立Bean池”裡時將拋出BeanCurrentlyInCreationException異常表示循環相依性;而對於建立完畢的Bean將從“當前建立Bean池”中清除掉。
setter循環相依性(單例):
<!--scope="singleton"(預設就是單例方式) --> 2 <bean id="A" class="com.donsun.student.StudentA" scope="singleton"> 3 <property name="studentB" ref="B"></property> 4 </bean> 5 <bean id="B" class="com.donsun.student.StudentB" scope="singleton"> 6 <property name="studentC" ref="C"></property> 7 </bean> 8 <bean id="C" class="com.donsun.student.StudentC" scope="singleton"> 9 <property name="studentA" ref="A"></property> 10 </bean>
這種情況下,Spring先執行個體化Bean對象 ,此時Spring會將這個執行個體化結束的對象放到一個Map中,並且Spring提供了擷取這個未設定屬性的執行個體化對象引用的方法。當Spring執行個體化了StudentA、StudentB、StudentC後,緊接著會去設定對象的屬性,此時StudentA依賴StudentB,就會去Map中取出存在裡面的單例StudentB對象,以此類推,不會出來迴圈的問題;
下面是Spring源碼中的實現方法,。以下的源碼在Spring的Bean包中的DefaultSingletonBeanRegistry.Java類中
1 /** Cache of singleton objects: bean name --> bean instance(緩衝單例執行個體化對象的Map集合) */ 2 private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(64); 3 4 /** Cache of singleton factories: bean name --> ObjectFactory(單例的工廠Bean緩衝集合) */ 5 private final Map<String, ObjectFactory> singletonFactories = new HashMap<String, ObjectFactory>(16); 6 7 /** Cache of early singleton objects: bean name --> bean instance(早期的單身對象緩衝集合) */ 8 private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16); 9 10 /** Set of registered singletons, containing the bean names in registration order(單例的執行個體化對象名稱集合) */ 11 private final Set<String> registeredSingletons = new LinkedHashSet<String>(64); 12 /** 13 * 添加單例執行個體 14 * 解決循環參考的問題 15 * Add the given singleton factory for building the specified singleton 16 * if necessary. 17 * <p>To be called for eager registration of singletons, e.g. to be able to 18 * resolve circular references. 19 * @param beanName the name of the bean 20 * @param singletonFactory the factory for the singleton object 21 */ 22 protected void addSingletonFactory(String beanName, ObjectFactory singletonFactory) { 23 Assert.notNull(singletonFactory, "Singleton factory must not be null"); 24 synchronized (this.singletonObjects) { 25 if (!this.singletonObjects.containsKey(beanName)) { 26 this.singletonFactories.put(beanName, singletonFactory); 27 this.earlySingletonObjects.remove(beanName); 28 this.registeredSingletons.add(beanName); 29 } 30 } 31 }
setter循環相依性(prototype):
2 <bean id="A" class="com.donsun.student.StudentA" scope="prototype"> 3 <property name="studentB" ref="B"></property> 4 </bean> 5 <bean id="B" class="com.donsun.student.StudentB" scope="prototype"> 6 <property name="studentC" ref="C"></property> 7 </bean> 8 <bean id="C" class="com.donsun.student.StudentC" scope="prototype"> 9 <property name="studentA" ref="A"></property> 10 </bean>
因為“prototype”範圍的Bean,Spring容器不進行緩衝,因此無法提前暴露一個建立中的Bean。拋出BeanCurrentlyInCreationException
32.try{}catch(){}finally{}return各種變化傳回值
1、不管有沒有出現異常,finally塊中代碼都會執行;
2、當try和catch中有return時,finally仍然會執行;
3、finally是在return後面的運算式運算後執行的(此時並沒有返回運算後的值,而是先把要返回的值儲存起來,不管finally中的代碼怎麼樣,返回的值都不會改變,仍然是之前儲存的值),所以函數傳回值是在finally執行前確定的;
4、finally中最好不要包含return,否則程式會提前退出,傳回值不是try或catch中儲存的傳回值。
33.redis回收策略
34.集合迭代效率對比
35.ArrayList與LinkedList區別
36.jvm記憶體模型
37.java序列化演算法
38.紅/黑樹狀結構
39.synchronized用到的情境
40.線程池配置關鍵參數
41.平時用過哪些架構,看過哪些源碼以及實現原理
42.畫出你做過項目的架構圖
43.廣度優先遍曆與深度優先遍曆
44.你覺得你最擅長什嗎?
45.項目怎麼改為分布式?
46.HashMap中有個對象transient Entry[] table,為什麼要加上關鍵字transient呢?
1.看一下HashMap.get()/put()知道, 讀寫Map是根據Object.hashcode()來確定從哪個bucket讀/寫. 而Object.hashcode()是native方法, 不同的JVM裡可能是不一樣的,如果你使用預設的序列化,那麼還原序列化後,元素的位置和之前的是保持一致的,可是由於 hashCode 的值不一樣了,那麼定位函數 indexOf()返回的元素下標就會不同,這樣不是我們所想要的結果.
2.transient 是表明該資料不參與序列化。因為 HashMap 中的儲存資料的數組資料成員中,數組還有很多的空間沒有被使用,沒有被使用到的空間被序列化沒有意義。所以需要手動使用 writeObject() 方法,只序列化實際儲存元素的數組。
47.分布式鎖使用情境(網易)
48.dubbo版本號碼作用(網易)
當一個介面實現,出現不相容升級時,可以用版本號碼過渡,版本號碼不同的服務相互間
不引用。
在低壓力時間段,先升級一半提供者為新版本
再將所有消費者升級為新版本
然後將剩下的一半提供者升級為新版本
49.秒殺系統設計(網易)
50.內部類與嵌套類區別
51.演算法:遞迴實現迴文(網易)
52.演算法:程式實現字串有哪些英文字母空格數字,不能用ascii碼來判斷
53.zookeeper分布式鎖節點與其他節點區別(網易)
PERSISTENT 持久化節點
PERSISTENT_SEQUENTIAL 順序自動編號持久化節點,這種節點會根據當前已存在的節點數自動加
1EPHEMERAL 臨時節點, 用戶端session逾時這類節點就會被自動刪除EPHEMERAL_SEQUENTIAL 臨時自動編號節點
54.項目中遇到的問題以及如何解決的?
55.springMvc完整工作流程,哪些關鍵的類
56.spring用到的設計模式舉例
57.死結條件
教訓:
1.按照STAR法則製作簡曆;
2.不同的公司崗位需求肯定不同,簡曆要有針對性,不要只準備一份簡曆;
3.要按照崗位需求,在項目中突出與之匹配的技能,先過了篩選這關;
4.要準備好才投簡曆,不然自己心儀的公司讓你去面試,結果你沒怎麼準備,被刷了,那麼機會可能就沒有了!
5.項目裡列出的技術,不能停留於表面的認識,至少你自己心裡能過的去,不然你的簡曆在面試官那裡不是羊入虎口嗎~!
6.互連網公司比較關注分布式、中介軟體、並發編程、鎖之類的,建議多瞭解下java並發包以及市面流行的中介軟體;
JAVA軟體面試之杭州