Java中常見的面試題
阿新 • • 發佈:2021-01-30
技術標籤:Javajavaspringmysqlspring boot微服務
整理一部分面試的知識點
1.異常 錯誤和異常的區別: 錯誤指的是由於硬體貨系統原因導致的通過程式碼無法解決的問題 相對較嚴重 異常是指程式執行過程當中出現的例外情況而已 異常分為執行時異常和非執行時異常 非執行時異常: 在編譯器就需要給出處理,否則編譯器都無法通過,他們都直接繼承Exception 執行時異常: 編譯的時候不需要給出解決方案,程式執行時體現出來的異常,繼承RuntimeException 注意: 只要是個異常一定在執行的時候出現 常見的執行時異常: ... 課件裡整理過 try catch finally處理異常 JDK7.0新出的: TWR處理異常 throws和throw的區別: throw: 用在方法體中,在沒有異常的晴空下 主動製造異常 throw new Exception throws: 用在方法簽名最後,表示本方法出現的指定種類的異常 不作處理,拋還給上級處理 2.Set和List的區別 Set集合要求元素必須唯一,對順序沒有要求,SortedSet要求唯一且有序 List集合有序且唯一 預設按照新增的順序,可以指定排序 -> Collection.sort(list集合,比較器) 3.ArrayList和LinkedList的區別 ArrayList底層基於陣列實現,優勢在於查詢遍歷隨機訪問,但是為了保證連續儲存,新增刪除效率低,ArrayList初始大小為10,每次1.5倍進行擴容 LinkedList基於連結串列實現,優勢在於新增和刪除效率高,查詢遍歷和隨機訪問,它是一個雙向連結串列,沒有初始化大小,也沒有擴容的機制,就是一直在前面或者後面新增就好。 4.雙向連結串列 連結串列: 指在記憶體的底層元素和元素並不是連續儲存的,只是靠著引用指向來形成先後關係的 雙向: 每個記錄不但儲存下一個指向,還要儲存上一個記錄的地址 5.資料型別 基本資料型別: boolean,char,byte,short,int,long,float,double String是引用資料型別,是final修飾的, 6.HashMap和Hashtable的區別 Hashtable底層大量的方法使用了synchronized所以執行緒安全,但是效率低 HashMap底層沒有同步機制,所以效率高,但是多執行緒的場景下可能出現併發錯誤 對null的處理不同: HashMap無論鍵還是值都可以新增null,但是之間唯一 HashTable 無論主鍵還是值都不能放null,否則觸發空指標異常 底層實現分組的雜湊演算法不同 HashMap預設16組,分組組數必須是2的n次方 & (分組組數-1) Hashtable預設11個小組,%分組組數 出現版本不同 HashMap JDK1.2 HashTable JDK1.0 7.抽象類 介面區別 抽象類 abstract class / 繼承型別中可以不給出方法的實現 介面 interface class / 繼承型別中必須給出方法的實現 抽象類當中定義的變數是每個這個型別的物件都有一份的屬性 抽象類當中定義的方法可以是普通方法,也可以定義抽象方法 介面當中定義的變數預設就是常量: public static final 介面當中定義的方法預設就是公共的抽象方法: public abstract 8.run方法 和start方法 run()是程式的核心邏輯,是搶到時間片之後要執行的操作 start()才是啟動執行緒要呼叫的方法 如果直接.run()那麼程式當中不會多一個執行緒,而是呼叫它的哪個執行緒 去執行run()裡面的操作 執行緒: 程式當中一條獨立的執行線索 9.集合型別 集合型別主要有3種:set,list,map 1.list(有序,可重複) ArrayList/LinkedList/Vector/Stack List裡存放的物件是有序的,同時也是可以重複的,List關注的是索引,擁有一系列和索引相關的方 法,查詢速度快。因為往list集合裡插入或刪除資料時,會伴隨著後面資料的移動,所有插入刪除資料 速度慢。 2.Set(無序、不能重複) HashSet/TreeSet/LinkedHashSet Set裡存放的物件是無序,不能重複的,集合中的物件不按特定的方式排序,只是簡單地把物件加入集 閤中。 3.Map(鍵值對型別,鍵唯一,值不唯一) HashMap/HashTable /TreeMap/ConcurrentMap/LinkedHashMap Map集合中儲存的是鍵值對,鍵不能重複,值可以重複。根據鍵得到值,對map集合遍歷時先得到鍵的 set集合,對set集合進行遍歷,得到相應的值。 10.wait()和sleep()區別 wait() 是object類的方法,它會導致當前執行緒阻塞,但是這種阻塞是要先釋放鎖標記,然後進入等待池阻塞 sleep() 是Thread類的靜態方法讓執行緒在指定的毫秒內 去普通阻塞狀態 11.過載和重寫的區別 Overload: 發生在同一個類當中,兩個方法名字相同,但是引數列表不同 Override: 發生在有繼承關係的兩個類的子類中,子類對從父類繼承來的方法不滿意,從而進行了重新實現 12.陣列轉集合 集合轉陣列 集合 = Arrays.asList(陣列) 陣列 = list.toArray() 13.所有類都有哪個統一的父類 Object 這個類有什麼方法 toString() clone() finalize() equals() hashCode() wait() notify() notifyAll() getClass() 14.高內聚 低耦合的理解!!!!! 高內聚: 各模組功能明確,一個功能一個模組實現 低耦合: 專案要增加一個欄位,如果只修改文件,不用修改好幾處程式碼,則低耦合 15.final關鍵字修飾類 方法 變數的作用(String) 修飾的類 最終類 不能被繼承 修飾的方法 最終方法 不能被覆蓋 修飾的變數 一旦賦值就再也不能修改 16.為什麼一定要使用迭代器迴圈 否則在遍歷list的過程當中直接對list集合進行刪除操作會觸發CME異常 17.使用字串時,一般會使用哪個? StringBuffer 和 + 號的區別 一般使用Stringbuffer 或者 StringBuilder + 會導致字串多次開闢新空間,轉移老元素 改變引用指向和回收舊空間的操作 效率很低 而StringBuffer 和 StringBuilder 的append 是在底層預留緩衝空間當中直接完成內容的追加(某些情況時也會涉及擴容) 其效率遠遠高於+每次擴容的 18.怎麼用java 實現快取 Map<String,Object> 鍵值對主鍵放關鍵字,值放儲存物件,形成標準的快取雛形 19. 兩種單例模式的優缺點: 懶漢式: 延遲載入,記憶體不會有多餘的開支,但是給使用者感官很差 醉漢式: 給使用者感官很高,能夠第一時間得到想要的物件,但是如果一直沒人呼叫,那麼這個記憶體就浪費了 20.Java虛擬機器是怎麼進行記憶體回收的 就是找堆記憶體當中哪些物件滿足零引用的回收條件 所有的垃圾回收器演算法和實現核心目的就是將堆記憶體當中再也不需要的物件回收掉 21.堆放物件,棧放引用 執行緒池的方式 new FixedThreadPool(3): 可重用的執行緒池 new CachedThreadPool(): 快取機制的執行緒池 new SingleThreadExecutor(): 單一例項的執行緒執行器 %ThreadPoolExecutor有方法 getActiveCount()可以得到當前活動執行緒數 22.建立執行緒的三種方式: extends Thread implement Runnable implement Callable<T> 後兩者的區別 Callable接口出現於JDK5.0 為了彌補原本Runnable的兩大不足 1> 方法定義為void 沒法返回資料 2> 方法沒有任何throws宣告 必須try catch 23.list如何去除重複元素 首先new一個Set集合(因為唯一) 將list中的資料放進去,然後addAll() 放回list 24.字串怎麼比較大小 String類是實現過Comparable介面的 想要比較字串大小 可以直接a.compareTo(c) 預設的升序 25.CurrentHashMap和Hashtable的區別 java.util.concurrent.ConcurrentHashMap java.util.Hashtable 他們都是執行緒安全 只是ConcurrentHashMap 分段加鎖 所以效率更高 26.list怎麼刪除 迭代器寫法 for(Interator<Integer> car = list.iterator(); car.hasNext();){ Integer num = car.next(); ... } 27.sql怎麼優化... 1.少用‘*’代替所有列名 2.用exists代替in,用 in 代替 or 3.多表連線時,儘量減少表的查詢次數 4.刪除全表資料的時候用truncate代替delete 5.合理使用索引(詳見索引)根據情況選擇合適的索引型別,索引型別有普通索引、唯一索引、點陣圖索 引、函式索引,在資料量大,查詢多,增刪改少的列適合新增索引,提高查詢效率,但是增刪改數 據,資料庫會浪費資源去維護索引。 6.sql語句儘量大寫,Oracle會預設把小寫轉換成大寫在執行 7.在保證語句完整的情況下,多使用commit(begin...end) 8.優化group by,將不需要的資料儘量在分組之前過濾掉 9.連表查詢的時候儘量使用表的別名,減少解析時間 10.表連線在where之前,where條件過濾順序,能夠更多的過濾資料的放在前面 1.選擇最有效的表名順序 2.oracle的解析按照從上而下解析,因此表之間的連結必須寫在where條件之前 3.sql在執行帶萬用字元的語句時,如果 '%' 在首位,那麼在欄位上建立的主鍵或者索引將會失效 4.使用 truncate代替delete 當沒有提交事務時,執行回滾,資料會恢復到執行delete之前,而當用 truncate時,回滾端則不會存放可恢復的資訊,減少資源的呼叫 5.用 where 子句代替 having having只會在檢索出所有記錄之後才對結果集進行過濾,這個處理需要排序 總計等操作,如果能通過where子句限制記錄的數目,則減少這方面的開銷 6.減少對錶的查詢 7.用 in 代替 or 8.刪除重複記錄 9.避免使用耗費資源的操作 10.避免在索引上使用函式,至少要包含組合索引的第一列,自動選擇索引 11.用索引提高效率 12.用 >= 代替 > 13.用 >= <= 避免使用NOT命令 14.字元型欄位的引號 在where條件中不加引號就不會用到索引 28.什麼情況下會使索引失效? 1.使用like關鍵字模糊查詢時,% 放在前面索引就不起作用 2.使用聯合索引時,只有查詢條件中使用了這些欄位中的第一個欄位 索引才會生效 3.使用or關鍵字的查詢,前後的兩個條件中的列都是索引時,索引才會生效 4.儘量避免在where子句中使用!= 或 < >操作符 5.避免在where子句中對欄位進行表示式操作 6.避免在where 子句中對欄位進行函式操作 7.不要再where 子句中的 = 左邊進行函式 算術運算或者其他表示式運算 8.對查詢進行優化,避免全表掃描 9.索引不是越多越好,索引固然能夠提高查詢效率,但是降低了 29.樂觀鎖和悲觀鎖 悲觀鎖是行鎖... 悲觀鎖(Pessimistic Lock) 很悲觀,每次去拿資料的時候都認為別人會修改,所以每次拿資料都會上鎖,這樣別人拿到的資料就會block 直到它拿到鎖 樂觀鎖(Optimistic Lock) 很樂觀,每次去拿資料的時候認為別人不會修改,所以不會上鎖,但是更新的時候會判斷一下在此期間別人有沒有更新資料,可以使用版本號等機制判斷 兩種鎖的優缺點: 不可認為一種好於另一種,樂觀鎖適用於寫的比較少的情況下,即衝突真的很少,這樣可以省去了鎖的開銷,加大系統的整個吞吐量,但是如果經常產生衝突 會不斷進行retry 這樣反倒降低了效能,所以這種情況下還是用悲觀鎖比較合適 讀取頻繁使用樂觀鎖,寫入頻繁使用悲觀鎖 30.Oracle的主要特點 優點: 1.開放性 2.可伸縮性,並行性 3.安全性 4.效能 5.客戶端支援應用模式 6.使用風險 長時間開發經驗完全向下相容得廣泛應用的風險低 缺點: 對硬體的要求很高,價格貴,管理維護麻煩,操作比較複雜 需要技術含量較高 31.MySQL 優點: 1.體積小,速度快,總體擁有成本低,開源 2.支援多種作業系統 3.是開源的資料庫,提供的介面支援多種語言連線操作 4.MySQL核心程式採用完全的多執行緒程式設計,執行緒是輕量級的程序,他可以靈活地為使用者提供服務,而不過多的系統資源 5.MySQL有一個非常靈活而且安全的許可權和口令系統 6.支援ODBC for Windows 支援所有的ODBC2.5函式和其他許多函式 可以用Access連結MySQL伺服器 7.支援大型資料庫,可以方便地支援成千上萬條記錄的資料庫 8.擁有非常快速且穩定的基於執行緒的記憶體分配系統,可以持續使用不必擔心其穩定性 9.提供高度多樣性,能夠提供很多不同的使用者介面 缺點: 1.不支援熱備份 2.安全系統複雜而非標準 3.沒有一種儲存過程語言 4.價格隨平臺和安裝方式變化 32. 時間函式 怎麼使用 1.add_months(): 在某個日期上增加多少個月 2.months_between(): 兩個日期之間有多少月份 3.last_day(): 當前給定月份所在的最後一天 4.next_day(): 下一個星期幾 33.資料庫的事務隔離級別,之前整理過,看之前的課件 34.連結串列查詢 內連線 inner join on = join on 兩張表有關聯的資料 外連線 outer join on = join on 不僅包含有關聯的還包含未關聯的 左外連線 left join on 左表為主 左表所有資料 對應不上右表的資料展示空 右外連線 right join on 右表為主 右表所有資料 對應不上左表的資料展示空 全外連線 full join on 35.Oracle除了聚組函式之外 還有那些函式 聚組函式: max() min() avg() sum() count() group by 分組 單行函式: ceil() floor() round(2) trunc(2) sign() abs() power() sqrt() 日期函式: add_months() months_between() last_day() next_day() 轉換函式: to_number() to_char() to_date() 字元函式: lower() upper() initcap() length() substr(3/2) instr(4/3/2) replace(3) concat() trim() ltrim() rtrim() lpad() rpad() 通用函式: nvl(a1,a2) nvl2(3) decode(N) (case when then else end) 36.資料庫中 字串轉換成日期格式 to_date() 日期格式轉換成字串格式 to_char() 37.MySQL如果資料量很大怎麼辦? 1.對查詢進行優化,儘量避免全表掃描 2.儘量避免在where子句中對欄位進行null值判斷/ 使用!= 或< > 操作符/ 使用or來連線條件 3.in 和 not in 也要慎重 4.如果在where子句中使用引數也會導致全表掃描 5.避免在where子句中對欄位進行表示式操作/ 對欄位進行函式操作/ "=" 左邊進行函式,算術運算或其他表示式運算 6.不要寫一些沒有意義的查詢 7.很多時候用exists 代替 in 是一個好的選擇 8.儘量使用數字型欄位 9.儘可能使用 varchar/nvarchar代替char/nchar 10.任何地方不要使用 select * from x,用具體的欄位列表代替 * 11.儘量使用表變數來代表臨時表 12.臨時表並不是不可使用,適當的使用它們可以使某些例程更有效 13.儘量避免使用遊標,因為遊標的效率較差,如果遊標操作的資料超過1萬行,那麼就應該考慮改寫 14.儘量避免大事務操作,提高系統併發能力 15.儘量避免向客戶端返回大資料量 38.MySQL萬用字元_和%的區別 %: 表示任意個或多個字元, 可以匹配任意型別和長度的字元 _: 表示任意單個字元,匹配單個任意字元,它常用來限制表示式的字元長度語句 39.索引的好處與壞處 好處: 1.通過建立唯一性索引 可以保證資料庫表中每一行資料的唯一性 2.可以大大加快資料的檢索速度 3.可以加速表與表之間的連線 4.在使用分組 排序 子句進行資料檢索時,可以顯著減少查詢中分組和排序的時間 5.通過使用索引,在查詢的過程中,使用優化隱藏器,提高系統的效能 壞處: 1.建立索引和維護索引要耗費時間,隨著資料量的增加而增加 2.索引需要佔物理空間 3.當對錶中的資料進行增加,刪除,修改的時候, 索引也要動態維護 降低了資料的維護速度 40.MySQL和Oracle的分頁 MySQL: select 欄位 from 表 limit 起始索引值 顯示記錄數 Oracle: select * from --第三層限制最小值 ( select A.*,ROWNUM rn from --第二層通過ROWNUM限制最大值 (select * from emp) A --第一層查詢要分頁的所有資料 where ROWNUM<=currentPage*size ) where rn>(currentPage-1)*size; ROWNUM是偽列,總是從1開始,只能使用<=,而不能使用>=,所以在第二層要給其起個別名,變成邏輯列比較 currentPage表示當前頁 size表示每頁要顯示的記錄數
MyBatis面試題:
1.MyBatis的流程 1.通過SQLSessionFactoryBuilder建立SqlSessionFactory - 在SqlSessionFactoryBuilder的build()方法中使用XMLConfigBuilder用來解析配置檔案xxx.xml 並將資料存放到Configuration物件中,然後建立並返回一個DefaultSessionFactory 2.通過SqlSessionFactory建立SqlSession 用於執行sql語句 3.通過SqlSession拿到Mapper物件的代理 4.通過MapperProxy呼叫Mapper中相應的方法 5.提交或者回滾 6.關閉session 2.MyBatis中的#{}和${}的區別 1.#{}內部使用預編譯PreparedStatement機制執行SQL,支援?佔位符,可以防止SQL注入問題 2.${}內部採用Statement機制將引數和SQL拼裝在一起傳送執行,不支援?佔位符,引數需要拼接 只要能用到佔位符的地方,儘量使用#{} 如果是表名 列名 like模糊查詢後面的引數 建議使用${} 3.MyBatis怎麼進行分頁,分頁外掛的原理是什麼? 1.MyBatis使用RowBounds物件進行分頁 ,它針對ResultSet結果集執行的記憶體分頁 假分頁 2.可以在SQL內直接書寫帶有物理分頁的引數來完成物理分頁功能 MySQL(limit) Oracle(rownum) 3.使用分頁外掛來完成物理分頁(pageHelper) 分頁外掛的基本原理是使用MyBatis提供外掛介面,實現自定義外掛 在外掛的攔截方法內攔截待執行的sql,重寫sql,新增對應的物理分頁語句和物理分頁的引數 4.MyBatis的外掛執行原理,怎麼編寫一個外掛 MyBatis僅可以編寫針對ParameterHandler,ResultSetHandler,StatementHandler,Executor這四個介面的外掛, 使用動態代理,為需要攔截的介面生成代理物件以實現介面方法攔截功能 每當執行這四種介面的方法時,就會進入攔截方法, InvocationHandler的invoke(),只會攔截你指定需要攔截的方法 實現MyBatis的Interceptor介面並複寫intercept() 給外掛編寫註解,執行要攔截哪一個介面的哪些方法即可,做完之後需要在配置檔案中配置編寫的外掛 5.mapper介面的工作原理 接口裡的方法能過載嗎? 工作原理是JDK動態代理,MyBatis執行時會使用JDK動態代理為Dao介面生成代理物件,代理物件會攔截介面方法,轉而執行MappedStatement所代表的sql,然後將sql執行結果返回 Mapper接口裡的方法是不能過載的 6.xml對映檔案的標籤,動態sql的執行原理 <resultMap> <parameterMap> <sql> <include> <selectKey> 動態sql標籤 <trim> <where> <set> <foreach> <if> <choose> <when> <otherwise> <bind> 執行原理: 使用OGNL從sql引數物件中計算表示式的值,根據表示式的值動態拼接sql,最後完成動態sql功能 7.MyBatis是否支援延遲載入 實現原理是什麼 按需載入,我們需要什麼的時候再去進行什麼操作。而且先從單表查詢,需要時再從關聯表去關聯查詢,能大大提高資料庫效能,因為查詢單表要比關聯查詢多張錶速度要快 MyBatis僅支援association關聯物件和collection關聯集合物件的延遲載入 association是一對一,collection是一對多 原理使用CGLIB建立目標物件的代理物件,當呼叫目標方法時,進入攔截器方法,傳送事先儲存好的查詢關聯物件的sql 把關聯物件查詢出來 然後進行賦值 8.如果MyBatis寫sql查詢表中空欄位會怎麼樣 如果使用resultMap對映時,如果欄位是空,則不會對映這個欄位 MyBatis不知道傳入的null引數對應jdbc型別是什麼,因為在MyBatis看來 null在資料庫有很多型別 解決1: 傳入該引數的地方寫明jdbc型別 解決2: 使用MyBatis config配置 callSettersOnNulls = true 解決3: 整合spring的時候,不適用mybatis-config.xml,只修改SqlSessionFactoryBean的屬性 configurationProperties即可 解決4: 如果想要配置空欄位的預設值,建立一個類 實現MyBatis的TypeHandler介面 解決5: 直接給物件屬性設定初始化值 9.SqlSessionFactoryBean的作用 SqlSessionFactoryBean和SqlSessionFactory的區別 在spring整合MyBatis的時候,我們需要配置SqlSessionFactoryBean來充當SqlSessionFactory SqlSessionFactoryBean實現了spring的FactoryBean<T>介面,泛型出就是寫的SqlSessionFactory 所以說實際使用SqlSessionFactoryBean的時候實際上在spring ioc容器中的bean是SqlSessionFactory 當把這個bean注入到spring中去了以後,ioc容器中的其他型別就可以拿到SqlSession例項了,就可以執行SQL任務了 10.MyBatis快取 一級快取: MyBatis內部實現的一個特性,使用者不能配置預設情況下自動支援快取 一般使用者沒有定製它的權利,儲存作用於為SqlSession 當SqlSessionclose 或者flush之後,就會清空 二級快取: 開啟方式在mapper的配置檔案中配置 <cache /> 儲存作用域為Mapper,多用於訪問多的查詢請求,且使用者對查詢結果實時性要求不高 11.MyBatis和Hibernate的區別 1.Hibernate是全自動的,MyBatis是半自動的 2.Hibernate自動生成SQL,MyBatis自己寫SQL 3.Hibernate擁有完整的日誌系統,MyBatis除了基本記錄功能外,其他功能薄弱很多 4.MyBatis比Hibernate需要關心很多細節,Hibernate配置比MyBatis複雜 5.MyBatis的sql都是寫在xml裡,優化比hibernate方便很多,hibernate的SQL都是自動生成,無法直接維護
Spring
1.談一談對spring的理解,spring的核心是什麼,Spring IOC 和 AOP 的理解
Spring框架是一個輕量級的javaSE/javaEE應用開發框架,是構建企業級應用程式的一站式解決方案
Spring是模組化的 大約分為20個模組,我們只引用需要的模組,不需要的模組不引用
Spring的核心是 ioc 和 aop (控制翻轉和麵向切面程式設計)
IOC:
控制反轉,是一種設計思想,是一個重要的面向物件程式設計的法則;ioc讓我們把物件交給容器管理,而不是在物件內部直接管理
AOP:
面向切面的程式設計,是oop面向物件程式設計的一種完善,oop最大的問題就是無法解耦,而aop的出現就是為了解決這個問題,aop將整個系統分為 核心業務邏輯 和 非核心業務邏輯,而aop的關注點則是 非核心業務邏輯,Spring將非核心服務封裝成一個aop元件,然後通過配置資訊形成 核心業務 和 aop元件 的呼叫關係,當執行核心業務時,會在合適的時機呼叫aop元件
2. Spring的Bean作用域 預設是singleton
提供了五種作用域
('singleton' 'prototype') 基本作用域; ('request' 'session' 'global session') web作用域
singleton: 在Spring IOC容器中僅存一個bean例項,bean以單例方式存在
prototype: 每次呼叫bean,都返回一個新的例項,每次呼叫getBean() 相當於執行new物件
request: 每次http請求都會建立一個新的Bean,僅適合WebApplicationContext環境
session: 同一個session 共享一個bean例項,不同session用不同的bean
global session: 標準的HTTP Session 該作用域僅在基於web的Spring ApplicationContext情形下有效
***3.Spring Bean的生命週期
4.Spring事務
Spring提供了 程式設計式事務 和 基於AOP方式的宣告式事務
Spring程式設計式事務管理高層的抽象主要包括三個介面: 事務管理器 事務定義資訊 事務具體執行狀態
Spring為不同的持久化框架提供了不同事務管理器的介面實現
Spring 基於AOP的宣告式事務的三種方式
基於TransactionProxyFactoryBean的方式: 需要為每個事務管理的類配置一個 TransactionProxyFactoryBean進行管理,使用時還需在類中注入該代理類
基於AspectJ的方式: 直接在配置檔案配置好之後,可以按照方法名進行管理
基於註解方式: 配置好事務管理器之後,開啟註解事務,在類上新增@Transactional即可
5.Spring事務的傳播行為
七種傳播行為:
REQUIRED: 當前有事務就加入 沒有就建立新的
REQUIRED_NEW: 不管有沒有 建立新的事務,先執行新的再執行老的
SUPPORTS: 當前有就加入 沒有就不用
NOT_SUPPORTED: 不使用事務,如果當前有 就先停掉\
MANDATORY: 必須在已有事務中執行,沒有就拋異常
NEVER: 以非事務方式執行,如果有就拋異常
NESTED: 巢狀事務
6.Spring事務的隔離級別
未提交讀: 一個事務可以讀到另一個事務修改但是沒有提交的資料 啥也不能預防 很少去用
已提交讀: 一個事務只能讀取另一個事務已經提交的資料 防止髒讀 預設就是這個隔離級別
可重複讀: 一個事務可以多次重複的執行某個查詢,返回的記錄都相同 預防髒讀 不可重複讀
序列化: 所有的事務依次執行,事務之間就完全不可能產生干擾 嚴重影響程式效能,不推薦用這個
7.Spring事務回滾機制
只有在丟擲執行時異常時才會回滾該事物,可以自己定義丟擲什麼異常時回滾事務/不會滾事務
8.過濾器和Spring攔截器的區別
都是AOP程式設計思想的體現,能實現許可權檢查,日誌記錄等
區別:
1.攔截器基於反射(JDK的動態代理實現) 過濾器基於函式回撥
2.攔截器不依賴於Servlet容器, 過濾器依賴於Servlet容器
3.攔截器只能對Controller請求起作用,過濾器對所有請求都起作用
4.攔截器可以訪問Controller上下文的物件,過濾器不可以訪問
5.攔截器可以深入方法前後 異常丟擲前後,可以重複呼叫,過濾器只能在Servlet前後起作用,只在初 始化時被呼叫一次
攔截器依賴於具體的介面,在執行期間動態生成位元組碼
9.反射機制,Spring中哪些用到反射
反射是java語言提供一套在執行期間動態獲得類中資訊的API
通過反射,可以在執行期動態獲得類中的屬性和方法,對於任意一個物件都能呼叫它的任意一個方法和屬性
通過反射 可以在執行期動態的建立類的物件和執行類中的方法
Spring通過反射建立物件,並將物件當到Spring ioc 容器中
Spring的攔截器也是基於反射實現(JDK動態代理)
10.SpringMVC
SpringMVC是構建在Servlet api基礎之上的MVC框架 它是Spring框架的一個模組
實現了請求驅動型別的輕量級web框架,天然能夠和Spring進行整合
支援與其他檢視技術整合,更加簡單地異常處理,提供了對靜態檔案的支援,支援Restful風格請求
SpringMVC主要的元件
DispatcherServlet: 前端控制器 作為統一的訪問點,進行全域性流程控制
HandlerMapping: 處理器對映器 用於查詢處理器
HandlerAdapter: 處理器介面卡 用於執行處理器
ViewResolver: 檢視解析器 用於解析邏輯檢視ModelAndView 返回View
ModelAndView: 邏輯檢視
Controller: 處理器 用於處理請求
11.常用註解:
@Component @Controller @Service @RestController @Autowired @RequestMapping @GetMapping @PostMapping @DeleteMapping @PutMapping @RequestParam @Value
@PathVariable @ResponseBody @Configuration @Bean @Qualifier @ComponentScan
@ConfigurationProperties @SpringBootApplication @EnableAutoConfiguration
@SpringBootConfiguration
[email protected]註解的作用
相當於@RequestMappingHandlerMapping和@RequestMappingHandlerAdapter的組合
@RequestMapping可以使用value屬性將請求的url對映到處理器的方法之上
預設可以接受所有型別的http請求方法
Spring4.3之後,Spring提供了@GetMapping @PostMapping @PutMapping @DeleteMapping來處理請求
13.SpringMVC怎麼將url對映到Controller
主要通過處理器對映器來對映url和Controller
提供了幾種常用的處理器對映器
BeanNameURLHandlerMapping: 使用name屬性作為url 將url對映到Controller
SimplerUrlHandlerMapping: 使用mappings屬性將url對映到Controller
RequestMappingHandlerMapping: 通過@RequestMapping 註解 將url對映到Controller上,必 須配合RequestMappingHandlerAdapter使用
SpringBoot
$1.SpringBoot
SpringBoot主要用來簡化Spring開發過程
不是一個全新的MVC框架,自動配置了Spring框架和第三方類庫
它的核心思想"約定大於配置"
SpringBoot內建Servlet容器
提供了"starter"依賴簡化構建配置
提供了準生產級功能
完全沒有程式碼生成和xml配置
為SpringCloud微服務奠定了基礎,使微服務構建變得簡單
2.SpringBoot的自動配置原理
SpringBoot藉助Spring提供的java config 方式將Bean載入到容器中
在SpringBoot啟動類上有一個@SpringBootApplication的註解,這個註解由 @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan 組成
SpringBoot利用@EnableAutoConfiguration註解引入的AutoConfigurationImportSelector類 在這個類中 使用SpringFactoriesLoader類 將classpath下所有jar包中的META-INF/spring.factories檔案中所有符合自動配置條件的型別進行載入
最後通過反射的方式 利用java config 方式 將bean載入到spring的ioc容器中,完成自動配置
3.SpringBoot和SpringMVC的區別
SpringMVC是建立在Servlet基礎之上的一個MVC框架 主要解決web開發問題 但是它的配置非常複雜
SpringBoot為了簡化開發者的使用,採用約定大約配置的思想,簡化了配置流程
內嵌了Servlet容器,很容易建立一個獨立執行的準生產級別的Spring專案
4.SpringBoot如何處理跨域
何為跨域?
當一個請求url的協議 域名 埠 三者之間任意一個與當前頁面url不同即為跨域
1.實現WebMvcConfigurer介面的addCorsMappings()方法 但是不能跟攔截器一起使用否則跨域失效
2.使用Spring web 自帶的CorsFilter處理
3.使用自定義的過濾器(或者攔截器)實現,但是這個過濾器(或者攔截器)一定要配置所有過濾器(或者攔截器)的最前面 需要實現Filter介面 重寫裡面的doFilter()
5.SpringBoot和dubbo是怎麼搭建的
SpringBoot整合Dubbo 直接引入Dubbo官方提供的starter依賴即可
然後在配置檔案配置應用名稱,註冊中心,介面暴露方式等
在SpringBoot的啟動類上加@EnableDubbo 啟動Dubbo配置
在服務提供者釋出服務時使用@Service
在服務消費者消費服務時使用@Reference
微服務、SpringCloud
$1.對微服務框架的理解
微服務是一種架構風格,它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調互相配合
對於一個大型複雜的業務系統:
它的業務功能也可以拆分為多個獨立的服務,各個服務之間是鬆耦合的,通過遠端協議進行通訊,各個 微服務均可被部署,擴容,升降級
Dubbo和SpringCloud的區別(主要就是RPC和REST的對比)
SpringCloud藉助SpringBoot提供一套完整的微服務解決方案,而Dubbo的定義是一款高效能的RPC框架
1.在服務呼叫方式方面: Dubbo採用RPC方式 SpringCloud用REST方式
2.在註冊中心方面: Dubbo推薦使用Zookeeper,SpringCloud使用Eureka
3.在服務閘道器方面: Dubbo沒有服務閘道器,SpringCloud提供了zuul和Spring cloud gateway
4.在斷路器方面: Dubbo不完善,SpringCloud整合了Hystrix
5.在分散式配置方面: Dubbo沒有提供,SpringCloud提供了 Spring cloud config
6.在服務跟蹤方面: Dubbo沒有提供,SpringCloud提供了Spring cloud sleuth
問題:
1.HashMap Hashtable的區別
Hashtable底層大量使用了synchronized,所以執行緒安全,但是效率低
HashMap底層沒有同步機制,所以效率較高,但是多執行緒的場景下可能出現併發錯誤
對null的處理不同
HashMap 無論主鍵還是值,都可以新增null,但是之間唯一
Hashtable 無論主鍵還是值,都不能放null,否則空指標異常
底層實現分組和雜湊演算法不同
HashMap 預設16組 二倍擴容
Hashtable 預設11組, %分組組數
出現版本不同
HashMap JDK1.2
Hashtable JDK1.0
2.設計模式:
單例模式:
class x{
private x(){} // 私有化構造方法
private static x only = new x(); // 有一個私有的靜態屬性 指向例項
public static x getOnly(){ // 提供了一個公有的靜態方法向外面提供這個例項
return only;
}
}
工廠模式
代理模式
包裝模式
策略模式
觀察者模式
命令模式
3.類能繼承一個類還是多個類
Java當中的類支援單根繼承,但是介面支援多重繼承
4.如果集合裡面有一萬條資料 如何排序
Collections.sort(list集合); Collections.sort(list集合,比較器物件)
Collection是所有單值型別集合的父介面
Collections是集合的工具類
5.後端陣列去重
new個set然後addAll()
資料庫如何去重
查的去重: select distinct name from student;
刪除重複: group by 欄位名
6.set和List的區別
set集合要求元素必須唯一 對順序沒有要求,SortedSet要求有序且唯一
List集合有序且不唯一 預設按照新增順序,可以指定排序
7.建立執行緒池常用的三種
newFixedThreadPool(3) 可重用的執行緒池
newCachedThreadPool() 帶有快取機制的執行緒池
newSingleThreadPool() 單一例項的執行緒執行器
如何拿到當前執行緒數
ThreadPoolExecutor.getActiveCount()