【Java核心面試寶典】Day22、Java數據庫、數據結構面經總結
一、數據庫索引的作用和使用場景
作用:
1、通過創建唯一性索引,可以保證數據庫中每一行數據的唯一性
2、大大加快數據檢索速度,加快表與表之間的連接
3、在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序時間
4、通過使用索引,在查詢過程中,可以優化隱藏器,提高系統性能
缺點:
1、創建索引和維護索引都需要消耗時間,這種時間會隨著數量的增加而增加
2、索引需要占用一定的物理空間,除表結構要占用數據空間以外,索引也需要占用物理空間
3、當對表中數據進行增加。刪除和修改時,都需要動態的維護索引,這樣就降低了數據的維護速度
使用場景:
1、在經常需要搜索的列上,可以增加搜索速度
2、在擁有主鍵的列上,可以強制該列的唯一性和組織表中數據的排列結構
3、在經常需要建立連接的列上使用,可以加快連接查詢的速度
4、在經常需要根據范圍進行搜索的列上創建索引,因為索引已經排序,所以其指定的范圍是連續的
5、在需要經常進行排序的列上使用索引,因為索引已經排序,所以可以加快排序的時間
6、在經常使用在where子句的列上創建索引,加快條件的判斷
二、數據庫優化有做過嗎?有哪些優化?
數據庫優化的方式:
1、選取最適用的字段屬性(將表中字段的寬度設置得盡可能小;盡量把字段設置為not null,防止進行null值比較;盡可能將屬性設置為數值型數據enum,數值型數據處理起來比文本數據要快)
2、使用連接(join)查詢來代替子查詢(是因為使用連接查詢不需要在內存中創建臨時表來完成邏輯上需要兩個步驟的查詢工作)
3、使用聯合(union)來代替手動創建的臨時表,(它會將需要創建臨時表的兩個或多個select查詢合并到一個查詢中,在客戶端查詢會話結束后,會自動刪除這個臨時表,保證數據庫的完整性)
4、進行事務控制(事務的重要作用是當多個用戶同時使用相同的數據源時,它可以利用鎖定數據庫的方法來為用戶提供一種安全的訪問方式,這樣可以保證用戶的操作不被其它的用戶所干擾)
5、鎖定表(防止多條語句同時對一個表進行操作)
6、使用外鍵(增加表結構的關聯性)
7、使用索引(加快查詢速度)
8、優化查詢語句(最好將相同的字段進行比較;在建有索引的列上盡量不要使用函數操作;在搜索字符型字段時,盡量不要使用like或通配符;避免在查詢中進行自動類型轉換,自動類型轉換會讓索引失效;)
三、二叉樹如果一側子樹節點過多,如何優化?
在插入元素的時候不斷的修改樹結構,保持二叉樹的平衡,就可以避免二叉樹一側子節點過多
四、B+樹了解過嗎?
B樹和B+樹主要用于數據庫索引方面,
B樹相對于平衡二叉樹,每個節點包含的關鍵字增加了,在應用到數據庫的時候,可以減少數據查詢次數和復雜度。
B+樹是B樹的升級版,相對于B樹,B+樹更加充分的利用了節點空間,提升了查詢速度,查詢速度接近于二分查找。
B+樹的特點:
B+樹的層級更少,相對于B樹,B+樹的非葉子節點所能夠存儲的關鍵字數量更多,樹的層級更少,所以查詢更快。
B+樹的查詢速度更穩定,B+樹的所有關鍵字數據都存儲在葉子節點上,所以每次查找次數都是相同的,
B+樹天然具備排序能力,B+樹所有的葉子節點數據構成了一個有序鏈表,在查詢大小區間的數據的時候更加的方便,數據緊密型更高,緩存的命中率也會比B樹高。
B+樹的全節點遍歷更快,B+樹遍歷整棵樹只需要遍歷所有的葉子節點即可,
五、紅黑樹如何實現快速查詢的?
利用二分查找提升查詢效率
六、堆結構知道多少?說一說堆排序?
堆的結構是一個完全二叉樹,主要是用于數組的存儲,
堆分為大根堆和小根堆,堆排序是對直接選擇排序的優化,以大根堆為例,在進行元素的排序的時候,會從所有的元素中取出最大的元素和第一個元素互換,然后再從剩下的元素里面選出最大的和第二個元素互換,以此類推,直到所有的記錄排序完畢。
七、抽象類和接口的使用場景
抽象類的使用場景:
1、既想約束子類有共同的行為,又想擁有自己的方法,又能擁有實例變量
接口的應用場景:
約束多個類擁有統一的行為,但是不在乎每一個類是如何實現的。
作為能夠實現特定功能的標識存在,或者是什么都不做的純粹的標識
實現類具備很多不同的功能,但是這些功能沒有什么聯系
使用接口的引用調用具體實現類的方法
八、抽象類和接口的區別?
1、抽象類對變量沒有限制,接口只能包含常量
2、抽象類擁有構造方法,接口沒有構造方法
3、抽象類中的方法可以是抽象的,也可以不是抽象的,但是接口中的方法必須是public abstract的,
九、如何進行單元測試?
在代碼編寫完成之后,進行單元測試主要分為兩個步驟:
人工靜態檢查
該階段主要保證代碼算法的正確性和邏輯性,盡可能的發現程序中沒有發現的錯誤。
動態執行跟蹤
執行待測程序,將實際運行結果和預期結果進行比較,發現其中存在的錯誤
十、如何實現低耦合?
1、少用繼承,多用接口隱藏實現的細節
2、模塊的功能設計盡可能的單一
3、遵循一個定義只在一個地方出現
4、少用全局變量
5、類中的屬性和方法少用public,多用private
6、少用“硬編碼”,盡量避免直接使用sql語句操作數據庫
7、盡量減少模塊直接操作或調用其他模塊,
8、盡量使用數據耦合,少用控制耦合,限制公共耦合的范圍,不用內容耦合
十一、聚集索引和非聚集索引的區別?
聚集索引:該索引中鍵值的邏輯順序決定了表中相應行的物理順序
聚集索引的使用情況:
列經常被分組排序
返回某范圍內的數據
數據列中的數據基本不同
主鍵列和外鍵列
非聚集索引:數據存儲在一個地方,索引存儲在另一個地方,索引的指針指向數據的存儲位置
非聚集索引的使用情況:
列經常用分組排序
頻繁更新的列
主鍵列和外鍵列
頻繁修改索引列
十二、springboot中的容器有什么用?
1、添加組件(@configtion、@bean、Component、@Controller、@Service、@Repository)
2、導入xml配置文件
十三、shiro中的token有什么用?是如何生成的?
Token的使用比session更有用,因為session過多的時候會占用服務器資源,而且在分布式系統中很難完成session的共享,
Token和session的作用都是對用戶請求進行合法性認證。
Token存放位置:
Token會放置在請求頭中,在前后端分離的時代,服務器認證通過之后,會返回給客戶端一個token,在vue項目中,將這個token設置在全局cookie中,每次請求通過interceptors.request.use這個攔截,動態地為每個請求帶上剛剛那個token,
Token的實現過程:
1.用戶登錄校驗,校驗成功后就生成Token并返回給客戶端。
2.客戶端收到數據后保存在客戶端的cookie中
3.客戶端每次訪問API都從cookie中取出token并攜帶到服務器端。
4.服務器端采用filter過濾器校驗請求攜帶的token。校驗成功則返回請求數據,校驗失敗則返回錯誤碼
不存儲token,無論在緩存中或者數據庫中的驗證過程:在用戶登錄認證完成之后,服務器會向客戶端返回一個加了密的token,這個token是由用戶請求的部分信息、請求的URL、時間戳這三部分融合在一起形成的,在客戶端再次發送請求的時候,會重新根據請求的部分內容、請求的URL、時間戳生成一個新的token,然后將這個新的token和之前的token進行比較,如果相同則這次合法。這樣token不會占用存儲空間,而且加密的過程要比從數據庫中進行查詢快得多。
十四、vue和后臺交互時如何規范接口?
一般常使用代理方式配置接口
以上是我在面試之后的總結,歡迎小伙伴們補充指正!
我是灰小猿,我們下期見!
Java 數據庫 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。