作者專注於Java、架構、Linux、小程序、爬蟲、自動化等技術。 工作期間含淚整理出一些資料,微信搜索【程序員高手之路】,回覆 【java】【黑客】【爬蟲】【小程序】【面試】等關鍵字免費獲取資料。技術交流、項目合作可私聊。
目錄
Xml映射文件中,除了常見的select|insert|updae|delete標籤之外,還有哪些標籤?
前言
這篇文章是我近期面試遇到的一些問題(技術類),做的一個總結。
注意:
1.有些問題沒有標準答案,需要讀者朋友在網上查找。
2.有些問題答案太長,三言兩語道不盡,直接給了鏈接,可以複製鏈接去搜索。
3.有些技術涉及到很多問題,我給了總結的鏈接之後,又給大家列出了我面試遇到的題目
Part 1 java基礎
1.1. JDK的基本的類庫
存放位置:jre/lib/rt.jar(這個問題很簡單,但是很多人答不上來!)
常用的 Java 核心包 (Java Core Package)
java.lang Java 編程語言的基本類庫(Object、String、StringBuffer、StringBuilder、System、Runtime、Throwable、Exception、Error、Thread、Math等)
java.io 通過數據流、對象序列以及文件系統實現的系統輸入、輸出
java.util 集合類、時間處理模式、日期時間工具等各類常用工具包
其它還有
java.sql 訪問和處理來自於 Java 標準數據源數據的類
java.test 以一種獨立於自然語言的方式處理文本、日期、數字和消息的類和接口
java.math簡明的整數算術以及十進制算術的基本函數
1.2. java內存模型
1.程序計數器:是一個數據結構,用於保存當前正常執行的程序的內存地址。Java虛擬機的多線程就是通過線程輪流切換並分配處理器時間來實現的,爲了線程切換後能恢復到正確的位置,每條線程都需要一個獨立的程序計數器,互不影響,該區域爲“線程私有”。
2.Java虛擬機棧:線程私有的,與線程生命週期相同,用於存儲局部變量表,操作棧,方法返回值。局部變量表放着基本數據類型,還有對象的引用。
3.本地方法棧:跟虛擬機棧很像,不過它是爲虛擬機使用到的Native方法服務。
4.Java堆:所有線程共享的一塊內存區域,對象實例幾乎都在這分配內存。
5.方法區:各個線程共享的區域,儲存虛擬機加載的類信息,常量,靜態變量,編譯後的代碼。
1.3. 類加載過程
參考:https://blog.csdn.net/u010942465/article/details/81709246
1.4. Unsafe類
參考:https://www.cnblogs.com/thomas12112406/p/6510787.html
Unsafe類使Java擁有了像C語言的指針一樣操作內存空間的能力,同時也帶來了指針的問題
1.5. Session、cookie區別
1、cookie數據存放在客戶端,session數據放在服務器上。
2、cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,考慮到安全應當使用session。
3、session會在一定時間內保存在服務器上,當訪問增多,會比較佔用你服務器的性能,考慮性能應當使用cookie。
4、不同瀏覽器對cookie的數據大小限制不同,個數限制也不相同。
5、可以考慮將登陸信息等重要信息存放爲session,不重要的信息可以放在cookie中。
1.6. 權限問題
參考:https://blog.csdn.net/Y0Q2T57s/article/details/82921270
1.7. 安全問題
參考:https://blog.csdn.net/wojiushiwo945you/article/details/77920165
1.8 HashMap實現原理
參考:https://blog.csdn.net/T2080305/article/details/82626210
1.9. HashMap和HashTable的區別
1.HashMap繼承了AbstractMap,HashTable繼承Dictionary抽象類,兩者均實現Map接口
2.HashMap和Hashtable的底層實現都是數組+鏈表結構實現、
3.Hashtable是線程安全,HashMap是非線程安全
HashMap的性能會高於Hashtable,我們平時使用時若無特殊需求建議使用HashMap,在多線程環境下若使用HashMap需要使用Collections.synchronizedMap()方法來獲取一個線程安全的集合(Collections.synchronizedMap()實現原理是Collections定義了一個SynchronizedMap的內部類,這個類實現了Map接口,在調用方法時使用synchronized來保證線程同步
4.兩者計算hash的方法不同:
Hashtable計算hash是直接使用key的hashcode對table數組的長度直接進行取模
HashMap計算hash對key的hashcode進行了二次hash,以獲得更好的散列值,然後對table數組長度取摸
5.HashMap可以使用null作爲key,不過建議還是儘量避免這樣使用。HashMap以null作爲key時,總是存儲在table數組的第一個節點上。而Hashtable則不允許null作爲key
6.HashMap的初始容量爲16,Hashtable初始容量爲11,兩者的填充因子默認都是0.75
7.HashMap擴容時是當前容量翻倍即:capacity2,Hashtable擴容時是容量翻倍+1即:capacity2+1
1.9. ArrayList和LinkedList的區別
1、ArrayList和LinkedList可想從名字分析,它們一個是Array(動態數組)的數據結構,一個是Link(鏈表)的數據結構,此外,它們兩個都是對List接口的實現。
前者是數組隊列,相當於動態數組;後者爲雙向鏈表結構,也可當作堆棧、隊列、雙端隊列
2、當隨機訪問List時(get和set操作),ArrayList比LinkedList的效率更高,因爲LinkedList是線性的數據存儲方式,所以需要移動指針從前往後依次查找。
3、當對數據進行增加和刪除的操作時(add和remove操作),LinkedList比ArrayList的效率更高,因爲ArrayList是數組,所以在其中進行增刪操作時,會對操作點之後所有數據的下標索引造成影響,需要進行數據的移動。
4、從利用效率來看,ArrayList自由性較低,因爲它需要手動的設置固定大小的容量,但是它的使用比較方便,只需要創建,然後添加數據,通過調用下標進行使用;而LinkedList自由性較高,能夠動態的隨數據量的變化而變化,但是它不便於使用。
5、ArrayList主要控件開銷在於需要在lList列表預留一定空間;而LinkList主要控件開銷在於需要存儲結點信息以及結點指針信息。
1.10 設計模式
參考:http://c.biancheng.net/design_pattern/
1.11 垃圾回收算法
參考: https://www.cnblogs.com/jiangtunan/p/11025521.html
Part 2 多線程問題
多線程問題(必問)
多線程的面試題太多了,下面的三個鏈接總結的很全面很詳細:
https://www.cnblogs.com/Jansens520/p/8624708.html
https://www.cnblogs.com/wangjintao-0623/p/9727234.html
https://blog.csdn.net/zl1zl2zl3/article/details/81868173
Concurrenthashmap原理分析有用
HashTable容器在競爭激烈的併發環境下表現出效率低下的原因,是因爲所有訪問HashTable的線程都必須競爭同一把鎖,那假如容器裏有多把鎖,每一把鎖用於鎖容器其中一部分數據,那麼當多線程訪問容器裏不同數據段的數據時,線程間就不會存在鎖競爭,從而可以有效的提高併發訪問效率,這就是ConcurrentHashMap所使用的鎖分段技術,首先將數據分成一段一段的存儲,然後給每一段數據配一把鎖,當一個線程佔用鎖訪問其中一個段數據的時候,其他段的數據也能被其他線程訪問。
Volitile關鍵字的作用
參考:https://www.cnblogs.com/xd502djj/p/9873067.html
Part 3 Spring與ORM映射框架
面試題集錦:
https://blog.csdn.net/qq_34337272/article/details/90955736
3.1. Spring作用域
singleton:單例模式,當spring創建applicationContext容器的時候,spring會欲初始化所有的該作用域實例,加上lazy-init就可以避免預處理;
prototype:原型模式,每次通過getBean獲取該bean就會新產生一個實例,創建後spring將不再對其管理;
====下面是在web項目下才用到的===
request:搞web的大家都應該明白request的域了吧,就是每次請求都新產生一個實例,和prototype不同就是創建後,接下來的管理,spring依然在監聽;
session:每次會話,同上;
global session:全局的web域,類似於servlet中的application。
3.2. SpringMVC面試題
面試題集錦:
https://blog.csdn.net/a745233700/article/details/80963758
SpringMVC的流程
SpringMVC與Struts2的區別
(1)springmvc的入口是一個servlet即前端控制器(DispatchServlet),而struts2入口是一個filter過慮器(StrutsPrepareAndExecuteFilter)。
(2)springmvc是基於方法開發(一個url對應一個方法),請求參數傳遞到方法的形參,可以設計爲單例或多例(建議單例),struts2是基於類開發,傳遞參數是通過類的屬性,只能設計爲多例。
(3)Struts採用值棧存儲請求和響應的數據,通過OGNL存取數據,springmvc通過參數解析器是將request請求內容解析,並給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最後又將ModelAndView中的模型數據通過reques域傳輸到頁面。Jsp視圖解析器默認使用jstl
過濾器與攔截器區別
①過濾器只能在容器初始化時被調用一次,在action的生命週期中,而攔截器可以多次被調用
②過濾器可以對幾乎所有的請求起作用,攔截器只能對action請求起作用。
③過濾器不能訪問action上下文、值棧裏的對象,而攔截器可以訪問。
④過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。
⑤過濾器是基於函數回調,而攔截器是基於java的反射機制的。
⑥過濾器不能獲取IOC容器中的各個bean,而攔截器可以,這點很重要,在攔截器裏注入一個service,可以調用業務邏輯。
4.4. Mybatis面試題
面試題集錦:
https://blog.csdn.net/a745233700/article/details/80977133
#{}和${}的區別是什麼?
#{}是預編譯處理,${}是字符串替換。
Mybatis在處理#{}時,會將sql中的#{}替換爲?號,調用PreparedStatement的set方法來賦值;
Mybatis在處理${}時,就是把${}替換成變量的值。
使用#{}可以有效的防止SQL注入,提高系統安全性。
Xml映射文件中,除了常見的select|insert|updae|delete標籤之外,還有哪些標籤?
trim | where | set | foreach | if | choose | when | otherwise | bind
Mybatis批量插入數據
可以使用foreach標籤
Part 4 SpringBoot相關
Springboot面試題集錦:
https://blog.csdn.net/Kevin_Gu6/article/details/88547424
Springboot優點
內置Tomcat、jetty,簡化配置配置,restful風格
springboot核心註解
SpringbootApplication,包含3個配置springbootConfiguration、enableAutoConfiguration、componentScan
Spring Boot 支持哪些日誌框架
Spring Boot支持Java Util Logging,Log4j2,Lockback作爲日誌框架,如果你使用starters啓動器,Spring Boot將使用Logback作爲默認日誌框架。無論使用哪種日誌框架,Spring Boot都支持配置將日誌輸出到控制檯或者文件中
Part 5 數據庫相關
面試題集錦:
https://www.cnblogs.com/wenxiaofei/p/9853682.html
什麼是數據庫約束,常見的約束有哪幾種?
數據庫約束用於保證數據庫表數據的完整性(正確性和一致性)。可以通過定義約束\索引\觸發器來保證數據的完整性。
總體來講,約束可以分爲:
主鍵約束:primary key;
外鍵約束:foreign key;
唯一約束:unique;
檢查約束:check;
空值約束:not null;
默認值約束:default;
樂觀鎖和悲觀鎖
參考:https://blog.csdn.net/qq_34337272/article/details/81072874
什麼是事務
事務是對數據庫中一系列操作進行統一的回滾或者提交的操作,主要用來保證數據的完整性和一致性。
事務四大特性
原子性(Atomicity): 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。
一致性(Consistency): 事務開始前和結束後,數據庫的完整性約束沒有被破壞。比如A向B轉賬,不可能A扣了錢,B卻沒收到。
隔離性(Isolation): 隔離性是當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。同一時間,只允許一個事務請求同一數據,不同的事務之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。
持久性(Durability): 持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。
事務的併發問題
1、髒讀:事務A讀取了事務B更新的數據,然後B回滾操作,那麼A讀取到的數據是髒數據
2、不可重複讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據時,結果因此本事務先後兩次讀到的數據結果會不一致。
3、幻讀:幻讀解決了不重複讀,保證了同一個事務裏,查詢的結果都是事務開始時的狀態(一致性)。
例如:事務T1對一個表中所有的行的某個數據項做了從“1”修改爲“2”的操作 這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值還是爲“1”並且提交給數據庫。而操作事務T1的用戶如果再查看剛剛修改的數據,會發現還有跟沒有修改一樣,其實這行是從事務T2中添加的,就好像產生幻覺一樣,這就是發生了幻讀。
事務的隔離級別
1. 讀未提交:另一個事務修改了數據,但尚未提交,而本事務中的SELECT會讀到這些未被提交的數據髒讀
2. 不可重複讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據時,結果因此本事務先後兩次讀到的數據結果會不一致。
3. 可重複讀:在同一個事務裏,SELECT的結果是事務開始時時間點的狀態,因此,同樣的SELECT操作讀到的結果會是一致的。但是,會有幻讀現象
4. 串行化:最高的隔離級別,在這個隔離級別下,不會產生任何異常。併發的事務,就像事務是在一個個按照順序執行一樣
事務的傳播行爲
1.PROPAGATION_REQUIRED:如果當前沒有事務,就創建一個新事務,如果當前存在事務,就加入該事務,該設置是最常用的設置。
2.PROPAGATION_SUPPORTS:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執行。
3.PROPAGATION_MANDATORY:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就拋出異常。
4.PROPAGATION_REQUIRES_NEW:創建新事務,無論當前存不存在事務,都創建新事務。
5.PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
6.PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。
7.PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。
sql編寫以及優化(必問)
參考:
https://blog.csdn.net/qq_38789941/article/details/83744271
Part 5 其它問題
怎麼設計一個高併發系統(比如100萬人同時搶票)
https://blog.csdn.net/java_leejin/article/details/98096274
Spring cloud(有些公司的項目用不到這個)
面試題集錦:
https://blog.csdn.net/hjq_ku/article/details/89504229
https://blog.csdn.net/oldshaui/article/details/90675149
java性能優化
http://www.wityx.com/post/424_1_1.html
java8的新特性
https://www.cnblogs.com/onetwo/p/8526374.html
redis相關問題
https://www.cnblogs.com/jasontec/p/9699242.html
linux常用命令
https://blog.csdn.net/qq_26230421/article/details/98359696
這些技術都會的話就可以上戰場了
更多精彩內容請關注公衆號:程序員高手之路
在公衆號裏回覆“架構”,免費獲取以下項目視頻教程