柚子快報(bào)邀請(qǐng)碼778899分享:八股面試2(自用)
柚子快報(bào)邀請(qǐng)碼778899分享:八股面試2(自用)
mysql存儲(chǔ)引擎
存儲(chǔ)引擎:定義數(shù)據(jù)的存儲(chǔ)方式,以及數(shù)據(jù)讀取的實(shí)現(xiàn)邏輯
在以前數(shù)據(jù)庫5.5默認(rèn)MyISAM引擎,之后默認(rèn)InnoDB引擎
MyISAM引擎的數(shù)據(jù)和索引是分開存儲(chǔ)的,InnoDb將索引和文件存儲(chǔ)在同一個(gè)文件。
MyISAM不支持事務(wù),InnoDB支持事務(wù)
MyISAM只支持表鎖,InnoDB支持表鎖,行鎖等
(補(bǔ)充:表鎖和行鎖)
表鎖:粒度更粗的鎖,鎖定整個(gè)數(shù)據(jù)表,其他事務(wù)不能對(duì)該表進(jìn)行任何讀寫操作。并發(fā)低不會(huì)死鎖
行鎖:粒度更細(xì)的鎖,鎖定數(shù)據(jù)表中的特定行,其他事務(wù)只能對(duì)該表的其他行進(jìn)行讀寫操作,并發(fā)高,會(huì)死鎖。
MyISAM不支持外鍵,InnoDB支持外鍵
如果大部分表操作是查詢-->選用MyISAM,反之若是需要支持事務(wù),使用InnoDB
ArrayList和LinkedList的區(qū)別
都是List接口下的兩個(gè)實(shí)現(xiàn)類
1.內(nèi)部實(shí)現(xiàn)
ArrayList使用的是數(shù)組的實(shí)現(xiàn),通過索引訪問元素,支持快速隨機(jī)訪問
LinkedList使用的是雙向鏈表,每個(gè)元素都包含指向前一個(gè)元素和后一個(gè)元素的引用,適合插入刪除操作
2.數(shù)據(jù)訪問的時(shí)間復(fù)雜度不同
ArrayList時(shí)間復(fù)雜度為O(1),LinkedList需要從頭部或者尾部開始遍歷鏈表直到找到元素,故為O(n)
3.空間占用
ArrayList基于數(shù)組實(shí)現(xiàn),占用空間是連續(xù)的,可能產(chǎn)生內(nèi)存碎片;LinkedList通過鏈表連接元素,每個(gè)元素都包含前后節(jié)點(diǎn)的引用,占用的空間比較大
線程安全的集合有哪些
1.Vector 相當(dāng)于 ArrayList 的翻版,是長度可變的數(shù)組,Vector的每個(gè)方法都加了 synchronized 修飾符,是線程安全的。
2.Hashtable是一個(gè)線程安全的集合,是單線程集合,它給幾乎所有public方法都加上了synchronized關(guān)鍵字
3.ConcurrentHashMap?采用了分段鎖(Segment),并非鎖住整個(gè)方法,而是通過原子操作和局部加鎖的方法保證了多線程的線程安全,且盡可能減少了性能損耗。
設(shè)計(jì)模式
單例模式
1.提供有且僅有一個(gè)單例的實(shí)例
2.私有化它的構(gòu)造方法,不讓外部通過構(gòu)造方法創(chuàng)建單例類的實(shí)例
3.提供一個(gè)公共方法給外界獲取這個(gè)實(shí)例
代理模式
工廠模式
1.工廠方法模式
抽象工廠實(shí)現(xiàn)類只生產(chǎn)單一產(chǎn)品
2.抽象工廠(超級(jí)工廠)
抽象工廠實(shí)現(xiàn)類可以生產(chǎn)某一類的產(chǎn)品
觀察者模式
可以理解為:我發(fā)朋友圈,其他人(觀察者)可以自動(dòng)立刻看到我發(fā)送的內(nèi)容。
使用場景
List 元素去重 ?
該問題可以分為去重是否考慮順序
去重不考慮順序:
1.使用循環(huán)去重,判斷集合中該元素是否存在,不存在才添加
2.使用循環(huán)去重,判斷集合中該元素是否有相等的,有的話則remove刪除
3.使用set去重(最簡單),先裝進(jìn)hashSet,再裝進(jìn)ArrayList集合
去重考慮順序:
1.使用LinkedHashSet
2.使用Stream流的distinct方法去重
判斷元素是否在List里面
可以使用contains()方法來檢查一個(gè)元素是否存在于一個(gè)List中
線程之間通信方式 ?
1.使用volatile和synchronized關(guān)鍵字
volatile:告訴程序,任何對(duì)于該變量的訪問都需要從共享內(nèi)存中獲取,并且它們的改變必須同步刷新到共享內(nèi)存里面,即可保證所有線程對(duì)該變量訪問的可見性
synchronized:同步方法或代碼塊,確保同一時(shí)間只有一個(gè)線程可以執(zhí)行某個(gè)特定區(qū)域的代碼。
2.等待/通知機(jī)制
等待通知機(jī)制
一個(gè)線程修改對(duì)應(yīng)的一個(gè)值,另外一個(gè)線程可以感知到變化,進(jìn)行相應(yīng)的操作
線程是搶占式執(zhí)行的,無法預(yù)知線程之間的執(zhí)行順序。但有時(shí)程序員也希望能合理協(xié)調(diào)多個(gè)線程的執(zhí)行順序。因此,在 Java 中使用了等待(wait)和通知(notify)機(jī)制,用于在應(yīng)用層面上干預(yù)多個(gè)線程的執(zhí)行順序。
3.管道pipe輸入/輸出流
和文件/網(wǎng)絡(luò) 輸入/輸出流的區(qū)別在于,主要用于線程之間的數(shù)據(jù)傳輸,傳輸?shù)拿浇槭莾?nèi)存
4.Thread.join
用于讓一個(gè)線程A等待另一個(gè)線程B執(zhí)行完。
5.ThreadLocal
可以通過set方法設(shè)置值,也能通過get方法獲得set的值
Mybatis一級(jí)緩存和二級(jí)緩存 ?
一級(jí)緩存:是sqlSession級(jí)別的緩存,也叫本地緩存,每個(gè)用戶執(zhí)行查詢時(shí),都需要使用sqlSession來執(zhí)行,為了避免每一次都去查詢數(shù)據(jù)庫,mybatis把查詢出來的數(shù)據(jù)緩存到sqlSession的本地緩存里面,后續(xù)sql如果命中緩存,就可以直接從本地緩存中讀取數(shù)據(jù)。
二級(jí)緩存:當(dāng)多個(gè)用戶在查詢數(shù)據(jù)時(shí),只要有任何一個(gè)sqlSession拿到了數(shù)據(jù)就會(huì)放入到二級(jí)緩存里面,其他的sqlSession就可以直接從二級(jí)緩存里面去加載數(shù)據(jù)。
每個(gè)sqlSession都有自己的一級(jí)緩存,不共享
二級(jí)緩存是由每個(gè)sqlSession放入組成的,共享
MyBatis的一級(jí)緩存是基于SqlSession的,也就是說,在一個(gè)SqlSession內(nèi)部,如果多次查詢相同的數(shù)據(jù),MyBatis會(huì)首先從一級(jí)緩存中查找。如果一級(jí)緩存中有數(shù)據(jù),則直接返回結(jié)果;如果沒有,則查詢數(shù)據(jù)庫,并將結(jié)果放入一級(jí)緩存。
然而,如果有多個(gè)SqlSession都需要查詢相同的數(shù)據(jù),那么一級(jí)緩存就無法滿足需求了,因?yàn)槊總€(gè)SqlSession都有自己的一級(jí)緩存,它們之間不共享數(shù)據(jù)。為了解決這個(gè)問題,MyBatis引入了二級(jí)緩存。二級(jí)緩存是基于mapper的namespace的,這意味著多個(gè)SqlSession可以共享同一個(gè)mapper的二級(jí)緩存。當(dāng)多個(gè)SqlSession都需要查詢相同的數(shù)據(jù)時(shí),MyBatis會(huì)先檢查二級(jí)緩存,如果有數(shù)據(jù),則直接返回;如果沒有,則查詢數(shù)據(jù)庫,并將結(jié)果放入二級(jí)緩存。
Redis為什么是單線程 ?
Redis最大的兩個(gè)特點(diǎn):基于內(nèi)存,單線程模型
這個(gè)問題要先明白,redis的單線程指代的是什么
單線程指的是,如圖,接收命令1,返回結(jié)果1,執(zhí)行命令,接受命令2,返回結(jié)果2,這些所有的步驟,都是由1個(gè)線程來完成的。
為什么要設(shè)計(jì)成單線程:
1.單線程簡化設(shè)計(jì),避免了多線程常見問題,如鎖,并發(fā)控制,單線程不存在這些問題。
2.避免鎖的開銷,多線程環(huán)境為了保證數(shù)據(jù)的一致性,需要使用鎖來同步不同線程的操作,但是對(duì)于鎖會(huì)產(chǎn)生額外的開銷,如獲取鎖,釋放鎖,死鎖
3.降低cpu的消耗,避免上下文切換
柚子快報(bào)邀請(qǐng)碼778899分享:八股面試2(自用)
相關(guān)文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。