本文轉(zhuǎn)載自 https://blog.csdn.net/weixin_45927841/article/details/123217462
一蔑穴、java
(1)集合
1.list:LinkedList焕数、ArrayList和Vector
LinkedList 接口實(shí)現(xiàn)類屈藐, 鏈表妙同, 插入刪除, 沒有同步, 線程不安全
ArrayList 接口實(shí)現(xiàn)類, 數(shù)組七嫌, 隨機(jī)訪問, 沒有同步呢堰, 線程不安全
Vector 接口實(shí)現(xiàn)類 數(shù)組抄瑟, 同步, 線程安全
2.set:HashSet和TreeSet
HashSet 使用哈希表存儲(chǔ)元素枉疼,元素可以是null
LinkedHashSet 鏈表維護(hù)元素的插入次序
TreeSet 底層實(shí)現(xiàn)為紅黑樹皮假,元素排好序,元素不可以是null
3.map:HashMap骂维、TreeMap和HashTable
線程安全
HshaMap線程不安全
TreeMap線程不安全
HashTable線程安全
空值
HashMap一個(gè)null key,多個(gè)null value
TreeMap不能null key惹资,多個(gè)null value
HashTable都不能有null
繼承和接口
HashMap繼承AbstractMap,實(shí)現(xiàn)接口Map
TreeMap繼承AbstractMap航闺,實(shí)現(xiàn)接口NavigableMap(SortMap的一種)
HashTable繼承Dictionary褪测,實(shí)現(xiàn)接口Map
順序
HashMap中key是無序的
TreeMap是有序的
HashTable是無序的
構(gòu)造函數(shù)
HashMap有調(diào)優(yōu)初始容量和負(fù)載因子
TreeMap沒有
HashTable有
數(shù)據(jù)結(jié)構(gòu)
HashMap是鏈表+數(shù)組+紅黑樹
TreeMap是紅黑樹
HashTable是鏈表+數(shù)組
4.list、set和map的區(qū)別
list:元素按進(jìn)入先后有序保存潦刃,可重復(fù)
set:不可重復(fù)侮措,并做內(nèi)部排序
map:代表具有映射關(guān)系的集合,其所有的key是一個(gè)Set集合乖杠,即key無序且不能重復(fù)分扎。
5.HashMap擴(kuò)容機(jī)制
數(shù)組的初始容量為16,而容量是以2的次方擴(kuò)充的胧洒,一是為了提高性能使用足夠大的數(shù)組畏吓,二是為了能使用位運(yùn)算代替取模預(yù)算(據(jù)說提升了5~8倍)。
數(shù)組是否需要擴(kuò)充是通過負(fù)載因子判斷的卫漫,如果當(dāng)前元素個(gè)數(shù)為數(shù)組容量的0.75時(shí)菲饼,就會(huì)擴(kuò)充數(shù)組。這個(gè)0.75就是默認(rèn)的負(fù)載因子列赎,可由構(gòu)造器傳入宏悦。我們也可以設(shè)置大于1的負(fù)載因子,這樣數(shù)組就不會(huì)擴(kuò)充,犧牲性能饼煞,節(jié)省內(nèi)存辫塌。
為了解決碰撞,數(shù)組中的元素是單向鏈表類型派哲。當(dāng)鏈表長(zhǎng)度到達(dá)一個(gè)閾值時(shí)(7或8),會(huì)將鏈表轉(zhuǎn)換成紅黑樹提高性能掺喻。而當(dāng)鏈表長(zhǎng)度縮小到另一個(gè)閾值時(shí)(6)芭届,又會(huì)將紅黑樹轉(zhuǎn)換回單向鏈表提高性能。
對(duì)于第三點(diǎn)補(bǔ)充說明感耙,檢查鏈表長(zhǎng)度轉(zhuǎn)換成紅黑樹之前褂乍,還會(huì)先檢測(cè)當(dāng)前數(shù)組數(shù)組是否到達(dá)一個(gè)閾值(64),如果沒有到達(dá)這個(gè)容量即硼,會(huì)放棄轉(zhuǎn)換逃片,先去擴(kuò)充數(shù)組。所以上面也說了鏈表長(zhǎng)度的閾值是7或8只酥,因?yàn)闀?huì)有一次放棄轉(zhuǎn)換的操作褥实。
6.HashMap中的循環(huán)鏈表是如何產(chǎn)生的
由于多線程,存在兩個(gè)線程同時(shí)對(duì)鏈表進(jìn)行擴(kuò)容的情況裂允,執(zhí)行transfer函數(shù)(鏈表數(shù)據(jù)轉(zhuǎn)移)會(huì)導(dǎo)致鏈表數(shù)據(jù)倒置损离,當(dāng)兩個(gè)線程同時(shí)此操作,就導(dǎo)致鏈表死循環(huán)
7.B樹和B+樹的區(qū)別
B樹是二叉排序樹進(jìn)化而來绝编;B+樹是分塊查找進(jìn)化而來
B+樹葉節(jié)點(diǎn)包含所有數(shù)據(jù)僻澎,非葉節(jié)點(diǎn)僅起到索引作用;B樹終端節(jié)點(diǎn)及以上都包含數(shù)據(jù)且不重復(fù)(葉節(jié)點(diǎn)只是一個(gè)概念十饥,并不存在)
B+樹葉節(jié)點(diǎn)包含了全部關(guān)鍵字
B+樹支持順序查找和多路查找窟勃,B樹只支持多路查找
- HashMap為什么用紅黑樹而不是AVL樹或者B+樹
AVL樹更加嚴(yán)格平衡,因此可以提供更快的査找效果逗堵。因此秉氧,對(duì)于查找密集型任務(wù)使用AVL樹沒毛病。 但是對(duì)于插入密集型任務(wù)砸捏,紅黑樹要好一些谬运。
B/B+樹的節(jié)點(diǎn)可以存儲(chǔ)多個(gè)數(shù)據(jù),當(dāng)數(shù)據(jù)量不夠多時(shí)垦藏,數(shù)據(jù)都會(huì)”擠在“一個(gè)節(jié)點(diǎn)中梆暖,查詢效率會(huì)退化為鏈表。
9.CopyOnWriteArrayList的原理
線程并發(fā)訪問進(jìn)行讀操作時(shí)掂骏,沒有加鎖限制
寫操作時(shí)轰驳,先將容器復(fù)制一份,再在新的副本上執(zhí)行寫操作,此時(shí)寫操作是上鎖的级解。結(jié)束之后再將原容器的引用指向新容器冒黑。注意,在上鎖執(zhí)行寫操作的過程中勤哗,如果有需要讀操作抡爹,會(huì)作用在原容器上。因此上鎖的寫操作不會(huì)影響到并發(fā)訪問的讀操作芒划。
10.BlockingQueue中有哪些方法
共四組增刪API
拋異常:如果操作無法立即執(zhí)行冬竟,則拋一個(gè)異常;
特定值:如果操作無法立即執(zhí)行民逼,則返回一個(gè)特定的值(一般是 true / false)泵殴。
阻塞:如果操作無法立即執(zhí)行,則該方法調(diào)用將會(huì)發(fā)生阻塞拼苍,直到能夠執(zhí)行笑诅;
超時(shí):如果操作無法立即執(zhí)行,則該方法調(diào)用將會(huì)發(fā)生阻塞疮鲫,直到能夠執(zhí)行吆你。但等待時(shí)間不會(huì)超過給定值,并返回一個(gè)特定值以告知該操作是否成功(典型的是true / false)棚点。
(4)多線程
1.Java中線程安全的基本數(shù)據(jù)結(jié)構(gòu)
string
HashTable
ConcurrentHashMap
CopyOnWriteArrayList
CopyOnWriteArraySet
Vector
stringBuffer
2.創(chuàng)建線程有哪幾種方式
繼承Thread類
實(shí)現(xiàn)Runnable接口
實(shí)現(xiàn)Callable接口
3.線程的生命周期
線程的狀態(tài)有五種:新建(new)早处、就緒(start())、運(yùn)行(分配到cpu)瘫析、阻塞和死亡
CPU在多條線程之間切換砌梆,于是線程狀態(tài)也會(huì)多次在運(yùn)行、就緒之間切換贬循。
出現(xiàn)阻塞的情況
線程調(diào)用sleep()方法主動(dòng)放棄所占用的處理器資源咸包。
線程調(diào)用了一個(gè)阻塞式IO方法,在該方法返回之前杖虾,該線程被阻塞烂瘫。
線程試圖獲得一個(gè)同步監(jiān)視器,但該同步監(jiān)視器正被其他線程所持有奇适。
線程在等待某個(gè)通知(notify)
程序調(diào)用了線程的suspend()方法將該線程掛起坟比。但這個(gè)方法容易導(dǎo)致死鎖,所以應(yīng)該盡量避免使用該方法嚷往。
解除阻塞重新進(jìn)入就緒狀態(tài)的情況
調(diào)用sleep()方法的線程經(jīng)過了指定時(shí)間
線程調(diào)用的阻塞式IO方法已經(jīng)返回葛账。
線程成功地獲得了試圖取得的同步監(jiān)視器。
線程正在等待某個(gè)通知時(shí)皮仁,其他線程發(fā)出了一個(gè)通知籍琳。
處于掛起狀態(tài)的線程被調(diào)用了resume()恢復(fù)方法菲宴。
出現(xiàn)死亡的情況
run()或call()方法執(zhí)行完成,線程正常結(jié)束
線程拋出一個(gè)未捕獲的Exception或Error趋急。
直接調(diào)用該線程的stop()方法來結(jié)束該線程喝峦,該方法容易導(dǎo)致死鎖,通常不推薦使用
4.如何實(shí)現(xiàn)線程同步
同步方法(synchronized)
同步代碼塊
ReentrantLock
volatile
5.Java多線程之間的通信方式
wait()呜达、notify()谣蠢、notifyAll()。采用采用synchronized來保證線程安全
await()查近、signal()扩劝、signalAll()炕檩。采用lock保證線程安全
BlockingQueue们拙。當(dāng)生產(chǎn)者線程試圖向BlockingQueue中放入元素時(shí)宁改,如果該隊(duì)列已滿嚼贡,則該線程被阻塞捉片;當(dāng)消費(fèi)者線程試圖從BlockingQueue中取出元素時(shí)秩霍,如果該隊(duì)列已空齐婴,則該線程被阻塞茄厘。
6.sleep()和wait()的區(qū)別
sleep()是Thread類中的靜態(tài)方法矮冬,而wait()是Object類中的成員方法;
sleep()可以在任何地方使用次哈,而wait()只能在同步方法或同步代碼塊中使用
sleep()不會(huì)釋放鎖胎署,而wait()會(huì)釋放鎖,并需要通過notify()/notifyAll()重新獲取鎖窑滞。
7.synchronized與Lock的區(qū)別
synchronized是Java關(guān)鍵字琼牧,在JVM層面實(shí)現(xiàn)加鎖和解鎖;Lock是一個(gè)接口哀卫,在代碼層面實(shí)現(xiàn)加鎖和解鎖
synchronized可以用在代碼塊上巨坊、方法上;Lock只能寫在代碼里此改。
synchronized在代碼執(zhí)行完或出現(xiàn)異常時(shí)自動(dòng)釋放鎖趾撵;Lock不會(huì)自動(dòng)釋放鎖,需要在finally中顯示釋放鎖共啃。
synchronized會(huì)導(dǎo)致線程拿不到鎖一直等待占调;Lock可以設(shè)置獲取鎖失敗的超時(shí)時(shí)間。
synchronized無法得知是否獲取鎖成功移剪;Lock則可以通過tryLock得知加鎖是否成功究珊。
synchronized鎖可重入、不可中斷挂滓、非公平苦银;Lock鎖可重入啸胧、可中斷、可公平/不公平幔虏,并可以細(xì)分讀寫鎖以提高效率
8.樂觀鎖和悲觀鎖的區(qū)別
9.公平鎖與非公平鎖
非公平鎖: 當(dāng)線程爭(zhēng)奪鎖的過程中纺念,會(huì)先進(jìn)行一次CAS嘗試獲取鎖,若失敗想括,則進(jìn)入acquire(1)函數(shù)陷谱,進(jìn)行一次tryAcquire再次嘗試獲取鎖,若再次失敗瑟蜈,那么就通過addWaiter將當(dāng)前線程封裝成node結(jié)點(diǎn)加入到Sync隊(duì)列烟逊,這時(shí)候該線程只能乖乖等前面的線程執(zhí)行完再輪到自己了
公平鎖: 當(dāng)線程在獲取鎖的時(shí)候,會(huì)先判斷Sync隊(duì)列中是否有在等待獲取資源的線程铺根。若沒有宪躯,則嘗試獲取鎖,若有位迂,那么就那么就通過addWaiter將當(dāng)前線程封裝成node結(jié)點(diǎn)加入到Sync隊(duì)列中
10.volatile
保證可見性访雪,不保證原子性
禁止指令重排
(3)其他
1.面向?qū)ο笕筇匦?br>
封裝:(將數(shù)據(jù)和代碼捆綁在一起,防止外界干擾)把客觀事物封裝成抽象的類掂林,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作臣缀,對(duì)不可信的進(jìn)行信息隱藏
繼承:(讓一個(gè)類型的對(duì)象擁有另一個(gè)類型的對(duì)象的屬性的方法)可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對(duì)這些功能進(jìn)行擴(kuò)展
多態(tài):(就是一個(gè)事物擁有不同形式的能力)父類引用指向子類對(duì)象泻帮,從而具備多種形態(tài)
2.Object類的常用方法
equals()
hashCode()
toString()
getClass()
wait()
notify()
notifyall()
clone()
finalize()
3.string精置、stringBuffer和stringBuilder
string不可變、線程安全
stringBuffer可變锣杂,效率低脂倦,線程安全
stringBuilder可變、效率高元莫,線程不安全
4.抽象類與接口的區(qū)別
抽象類屬于繼承狼讨,只能繼承一個(gè);接口可以實(shí)現(xiàn)多個(gè)
接口里只能包含抽象方法柒竞、靜態(tài)方法政供、默認(rèn)方法和私有方法,不能為普通方法提供方法實(shí)現(xiàn)朽基;抽象類則完全可以包含普通方法布隔。
接口里只能定義靜態(tài)常量,不能定義普通成員變量稼虎;抽象類里則既可以定義普通成員變量衅檀,也可以定義靜態(tài)常量。
接口里不包含構(gòu)造器霎俩;抽象類里可以包含構(gòu)造器哀军,抽象類里的構(gòu)造器并不是用于創(chuàng)建對(duì)象沉眶,而是讓其子類調(diào)用這些構(gòu)造器來完成屬于抽象類的初始化操作。
5.java的基本數(shù)據(jù)類型
byte:1字節(jié)(8位)杉适,數(shù)據(jù)范圍是 -2^7 ~ 2^7-1谎倔。
short:2字節(jié)(16位),數(shù)據(jù)范圍是 -2^15 ~ 2^15-1猿推。
int:4字節(jié)(32位)片习,數(shù)據(jù)范圍是 -2^31 ~ 2^31-1。
long:8字節(jié)(64位)蹬叭,數(shù)據(jù)范圍是 -2^63 ~ 2^63-1藕咏。
float:4字節(jié)(32位),數(shù)據(jù)范圍大約是 -3.410^38 ~ 3.410^38秽五。
double:8字節(jié)(64位)孽查,數(shù)據(jù)范圍大約是 -1.810^308 ~ 1.810^308。
char:2字節(jié)(16位)坦喘,數(shù)據(jù)范圍是 \u0000 ~ \uffff卦碾。
boolean:Java規(guī)范沒有明確的規(guī)定,不同的JVM有不同的實(shí)現(xiàn)機(jī)制起宽。
6.java代碼塊執(zhí)行順序
父類靜態(tài)代碼塊
子類靜態(tài)代碼塊
父類構(gòu)造代碼塊
父類構(gòu)造方法
子類構(gòu)造代碼塊
子類構(gòu)造方法
普通代碼塊
7.static關(guān)鍵字
修飾成員變量:該靜態(tài)變量在內(nèi)存中只有一個(gè)副本。只要靜態(tài)變量所在的類被加載济榨,這個(gè)靜態(tài)變量就會(huì)被分配空間
修飾成員方法:調(diào)用該方法只需類名.方法名坯沪;靜態(tài)方法不依賴于任何對(duì)象就可以進(jìn)行訪問,因此對(duì)于靜態(tài)方法來說擒滑,是沒有this的腐晾。在靜態(tài)方法中不能訪問類的非靜態(tài)成員變量和非靜態(tài)成員方法,因?yàn)榉庆o態(tài)成員方法/變量都必須依賴具體的對(duì)象才能夠被調(diào)用丐一。
修飾代碼塊:在類初次被加載的時(shí)候藻糖,會(huì)按照static塊的順序來依次執(zhí)行每個(gè)static塊,并且只會(huì)執(zhí)行一次库车。
修飾內(nèi)部類:靜態(tài)內(nèi)部類不能直接訪問外部類的非靜態(tài)成員巨柒,但,可以通過new 外部類().成員的方式訪問柠衍;
8.覆蓋(重寫)和重載的區(qū)別
重寫一般是子類重寫父類方法(一對(duì)一)洋满,垂直關(guān)系;重載一般是一個(gè)類中多個(gè)方法重載(多個(gè)之間)珍坊,水平關(guān)系
重寫方法之間參數(shù)相同牺勾;重載方法之間參數(shù)不同
重寫不可以修改返回值類型;重載可以修改返回值類型
9.java四個(gè)訪問修飾符
private:本類中
default:本包中
protected:不同包的子類
public:所有
10.全局變量和局部變量的區(qū)別
成員變量:
成員變量是在類的范圍里定義的變量阵漏;
成員變量有默認(rèn)初始值驻民;
未被static修飾的成員變量也叫實(shí)例變量翻具,它存儲(chǔ)于對(duì)象所在的堆內(nèi)存中,生命周期與對(duì)象相同回还;
被static修飾的成員變量也叫類變量裆泳,它存儲(chǔ)于方法區(qū)中,生命周期與當(dāng)前類相同懦趋。
局部變量:
局部變量是在方法里定義的變量晾虑;
局部變量沒有默認(rèn)初始值;
局部變量存儲(chǔ)于棧內(nèi)存中仅叫,作用的范圍結(jié)束帜篇,變量空間會(huì)自動(dòng)的釋放。
11.hashCode()和equals()的關(guān)系
hashCode求的是對(duì)象的散列碼(一般是對(duì)象的儲(chǔ)存地址)诫咱,equals是根據(jù)地址比較對(duì)象是否相同
如果兩個(gè)對(duì)象相等笙隙,則它們必須有相同的哈希碼
如果兩個(gè)對(duì)象有相同的哈希碼,則它們未必相等
12.為什么要重寫hashCode()和equals()
Object類提供的equals()方法默認(rèn)是用==來進(jìn)行比較的坎缭,也就是說只有兩個(gè)對(duì)象是同一個(gè)對(duì)象時(shí)竟痰,才能返回相等的結(jié)果。而實(shí)際的業(yè)務(wù)中掏呼,我們通常的需求是坏快,若兩個(gè)不同的對(duì)象它們的內(nèi)容是相同的,就認(rèn)為它們相等憎夷。
13.反射
動(dòng)態(tài)獲取類的信息莽鸿,以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能∈案可以理解為動(dòng)態(tài)看透類的能力祥得。
14.cookie和session的區(qū)別
存儲(chǔ)位置不同:cookie存放于客戶端;session存放于服務(wù)端蒋得。
隱私策略不同:cookie對(duì)客戶端是可見的级及,別有用心的人可以分析存放在本地的cookie并進(jìn)行cookie欺騙,所以它是不安全的额衙;session存儲(chǔ)在服務(wù)器上,對(duì)客戶端是透明的窍侧,不存在敏感信息泄露的風(fēng)險(xiǎn)追驴。
生命周期不同:設(shè)置cookie的屬性,達(dá)到cookie長(zhǎng)期有效的效果疏之;session只需關(guān)閉窗口該session就會(huì)失效殿雪,因此session不能長(zhǎng)期有效。
15.get和post請(qǐng)求的區(qū)別
url可見性:get锋爪,參數(shù)url可見丙曙;post爸业,url參數(shù)不可見
數(shù)據(jù)傳輸上:get,通過拼接url進(jìn)行傳遞參數(shù)亏镰;post扯旷,通過body體傳輸參數(shù)
緩存性:get請(qǐng)求是可以緩存的;post請(qǐng)求不可以緩存
后退頁面的反應(yīng):get請(qǐng)求頁面后退時(shí)索抓,不產(chǎn)生影響;post請(qǐng)求頁面后退時(shí)钧忽,會(huì)重新提交請(qǐng)求
安全性:這個(gè)也是最不好分析的,原則上post肯定要比get安全逼肯,畢竟傳輸參數(shù)時(shí)url不可見耸黑。
get一般傳輸數(shù)據(jù)大小不超過2k-4k;post請(qǐng)求傳輸數(shù)據(jù)的大小根據(jù)php.ini 配置文件設(shè)定,也可以無限大篮幢。
16.前后端數(shù)據(jù)交互
form表單
HttpServletRequest/HttpServletResponse
@RequestParam
數(shù)據(jù)在url后 path?id=1
@PathVariable
數(shù)據(jù)在url后 path/{id}
@RequestBody
以json數(shù)據(jù)為例大刊,首先有一個(gè)類
然后前端傳過來數(shù)據(jù)
后端接收
ModelAndView(只向前端傳輸數(shù)據(jù))
配置視圖解析器
創(chuàng)建ModelAndView對(duì)象,添加返回的數(shù)據(jù)和地址
model
jquery實(shí)現(xiàn)的ajax
前端
eg:
數(shù)據(jù)傳輸載體類
前端部分
后臺(tái)部分
17.IO分類
按流方向分:輸入流三椿,輸出流
按數(shù)據(jù)單位分:字節(jié)流缺菌,字符流
按功能分:節(jié)點(diǎn)流,處理流
18.處理哈希沖突的方法
開放定址法(再散列法)
線性探測(cè)再散列
二次探測(cè)再散列
偽隨機(jī)探測(cè)再散列
再哈希法
拉鏈法
二搜锰、JVM
1.JVM包含哪幾部分
類加載器
運(yùn)行時(shí)數(shù)據(jù)區(qū)(堆伴郁、棧、方法區(qū)蛋叼、本地方法棧和程序計(jì)數(shù)器)
方法區(qū):靜態(tài)變量焊傅、常量、類信息和常量池
程序計(jì)數(shù)器:每個(gè)線程都有一個(gè)程序計(jì)數(shù)器鸦列,就像一個(gè)指針,指向方法去中的方法字節(jié)碼(比如每次讀下一條指令的時(shí)候給它+1)
本地方法棧:等級(jí)native方法鹏倘,在執(zhí)行引擎的時(shí)候加載本地庫
棧:生命周期和線程同步薯嗤;不存在垃圾回收問題;存放八大基本類型纤泵、對(duì)象引用變量名骆姐、實(shí)例的方法
堆:類的實(shí)例、常量
新生區(qū):伊甸園區(qū)捏题、幸存0區(qū)玻褪、幸存1區(qū)
養(yǎng)老區(qū)
永久區(qū)
執(zhí)行引擎
本地庫接口
2.雙親委派機(jī)制
類加載器收到類加載的請(qǐng)求
將這個(gè)請(qǐng)求委托給父類加載器去完成,一直向上委托公荧,直到啟動(dòng)類加載器
啟動(dòng)類加載器能執(zhí)行就結(jié)束带射,否則拋出異常,依次向下通知子類進(jìn)行加載
優(yōu)點(diǎn):
從最內(nèi)層開始加載循狰,外層惡意同名類得不到加載從而無法使用
嚴(yán)格通過包來區(qū)分了訪問域窟社,外層惡意的類通過內(nèi)置代碼也無法訪問到內(nèi)層類
3.創(chuàng)建對(duì)象內(nèi)存分析
(案例取自遇見狂神說的java課程視頻)
4.JAVA對(duì)象實(shí)例化過程
類的加載初始化
加載:載入class對(duì)象券勺,不一定是從class文件獲取,可以是jar包灿里,或者動(dòng)態(tài)生成的class
連接
驗(yàn)證:校驗(yàn)class字節(jié)流是否符合當(dāng)前jvm規(guī)范
準(zhǔn)備:為 類變量 分配內(nèi)存并設(shè)置變量的初始值( 默認(rèn)值 )关炼。如果是final修飾的對(duì)象則是賦值聲明值
解析:將常量池的符號(hào)引用替換為直接引用
初始化
使用
卸載
對(duì)象的初始化
5.什么時(shí)候進(jìn)行GC
引用計(jì)數(shù)算法
可達(dá)性分析算法
6.三種基本的GC算法
標(biāo)記-清除算法
內(nèi)存中的對(duì)象構(gòu)成一棵樹,當(dāng)有效的內(nèi)存被耗盡的時(shí)候匣吊,程序就會(huì)停止儒拂,做兩件事,第一:標(biāo)記色鸳,標(biāo)記從樹根可達(dá)的對(duì)象社痛,第二:清除不可達(dá)的對(duì)象。標(biāo)記清除的時(shí)候程序會(huì)停止運(yùn)行
缺點(diǎn):遞歸效率低性能低缕碎;釋放空間不連續(xù)容易導(dǎo)致內(nèi)存碎片褥影;會(huì)停止整個(gè)程序運(yùn)行;
復(fù)制算法
把內(nèi)存分成兩塊區(qū)域:空閑區(qū)域和活動(dòng)區(qū)域咏雌,第一還是標(biāo)記凡怎,標(biāo)記之后把可達(dá)的對(duì)象復(fù)制到空閑區(qū),將空閑區(qū)變成活動(dòng)區(qū)赊抖,同時(shí)把以前活動(dòng)區(qū)對(duì)象清除统倒,變成空閑區(qū)。
缺點(diǎn):速度快但耗費(fèi)空間
標(biāo)記-整理算法
在標(biāo)記清除算法之后不是直接清理可回收對(duì)象氛雪,而是將存活對(duì)象都向一端移動(dòng)房匆,然后清理掉端邊界以外的內(nèi)存。
內(nèi)存效率:復(fù)制算法>標(biāo)記清除算法>標(biāo)記壓縮算法(時(shí)間復(fù)雜度)
內(nèi)存整齊度:復(fù)制算法=標(biāo)記壓縮算法>標(biāo)記清除算法
內(nèi)存利用率:復(fù)制算法<標(biāo)記清除算法=標(biāo)記壓縮算法
三报亩、mysql
1.數(shù)據(jù)庫三大范式
第一范式:強(qiáng)調(diào)的是列的原子性浴鸿,即列不能夠再分成其他幾列。
第二范式:在第一范式基礎(chǔ)上弦追,必須有一個(gè)主鍵其他字段必須完全依賴于主鍵岳链,而不能只依賴于主鍵的一部分。
第三范式:在前兩個(gè)范式基礎(chǔ)上劲件,非主鍵列必須直接依賴于主鍵掸哑,不能存在傳遞依賴。
2.防止sql注入
代碼層防止sql注入攻擊的最佳方案就是sql預(yù)編譯(preparestatement類)
規(guī)定數(shù)據(jù)長(zhǎng)度零远,能在一定程度上防止sql注入
嚴(yán)格限制數(shù)據(jù)庫權(quán)限苗分,能最大程度減少sql注入的危害
3.索引
索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),通俗來講索引就好比書本的目錄牵辣,加快數(shù)據(jù)庫的查詢速度摔癣。
分類
主鍵索引:加速查詢 + 列值唯一(不可以有null)+ 表中只有一個(gè)
唯一索引:加速查詢 + 列值唯一(可以有null)
普通索引:僅加速查詢
組合索引:多列值組成一個(gè)索引,專門用于組合搜索,其效率大于索引合并
全文索引:對(duì)文本的內(nèi)容進(jìn)行分詞供填,進(jìn)行搜索
4.ACID
原子性:要么都發(fā)生拐云,要么都不發(fā)生。
一致性:事務(wù)前后數(shù)據(jù)的完整性必須保持一致近她。
隔離性:一個(gè)事務(wù)不能被其他事務(wù)的操作數(shù)據(jù)所干擾叉瘩,多個(gè)并發(fā)事務(wù)之間要相互隔離。
持久性:一個(gè)事務(wù)一旦被提交粘捎,數(shù)據(jù)不可再恢復(fù)
5.事務(wù)并發(fā)產(chǎn)生的三種問題
臟讀:一個(gè)事務(wù)讀取到了另外一個(gè)事務(wù)沒有提交的數(shù)據(jù)
幻讀:同一事務(wù)中薇缅,用同樣的操作讀取兩次,得到的記錄數(shù)不相同(數(shù)據(jù)條數(shù))
不可重復(fù)讀:在同一事務(wù)中攒磨,兩次讀取同一數(shù)據(jù)泳桦,得到內(nèi)容不同(數(shù)據(jù)內(nèi)容)
6.mysql的事務(wù)隔離級(jí)別
讀未提交 Read uncommitted:一個(gè)事務(wù)還沒有提交時(shí),它做的變更就能被別的事務(wù)看到娩缰。
讀提交 Read committed:一個(gè)事物提交之后灸撰,它做的變更才會(huì)被其他事務(wù)看到。
可重復(fù)讀 Repeatable read:一個(gè)事物執(zhí)行過程中看到的數(shù)據(jù)拼坎,總是跟這個(gè)事務(wù)在啟動(dòng)時(shí)看到的數(shù)據(jù)是一致的浮毯。未提交變更對(duì)其他事務(wù)也是不可見的。
串行化 serializable:對(duì)于同一行記錄泰鸡,寫會(huì)加“寫鎖”债蓝,讀會(huì)加“讀鎖”,當(dāng)出現(xiàn)鎖沖突時(shí)盛龄,后訪問的事務(wù)需要等前一個(gè)事務(wù)執(zhí)行完成饰迹,才能繼續(xù)執(zhí)行。
7.數(shù)據(jù)庫鎖
按粒度分:
行鎖
頁鎖
表鎖
全局鎖
按鎖的級(jí)別
共享(讀)鎖(S)
排他(寫)鎖(X)
意向共享鎖
意向排他鎖
8.Mysql事務(wù)的分類
扁平式事務(wù)
帶有保存點(diǎn)的扁平式事務(wù)
鏈?zhǔn)聞?wù)
嵌套事務(wù)
分布式事務(wù)
9.聯(lián)表查詢
四余舶、計(jì)算機(jī)網(wǎng)絡(luò)
1.OSI七層模型
(物)物理層:為數(shù)據(jù)端設(shè)備提供原始比特流的傳輸?shù)耐?br>
(聯(lián))數(shù)據(jù)鏈路層:在通信的實(shí)體間建立數(shù)據(jù)鏈路連接
(網(wǎng))網(wǎng)絡(luò)層:為數(shù)據(jù)在節(jié)點(diǎn)之間傳輸創(chuàng)建邏輯鏈路啊鸭,并分組轉(zhuǎn)發(fā)數(shù)據(jù)(IP、IPX)
(淑)傳輸層:提供應(yīng)用進(jìn)程之間的邏輯通信(TCP匿值、UDP)
(惠)會(huì)話層:建立端連接并提供訪問驗(yàn)證和會(huì)話管理
(試)表示層:提供數(shù)據(jù)格式轉(zhuǎn)換服務(wù)
(用)應(yīng)用層:訪問網(wǎng)絡(luò)服務(wù)的接口(DNS赠制、HTTP、FTP)
2.三次握手
A將標(biāo)志位SYN置為1千扔,隨機(jī)產(chǎn)生一個(gè)值seq=x憎妙,并將該數(shù)據(jù)包發(fā)送給B库正,A進(jìn)入SYN_SENT狀態(tài)曲楚,等待B確認(rèn)。
B收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道A請(qǐng)求建立連接褥符,B將標(biāo)志位SYN和ACK都置為1龙誊,ack=x+1,隨機(jī)產(chǎn)生一個(gè)值seq=y喷楣,并將該數(shù)據(jù)包發(fā)送給A以確認(rèn)連接請(qǐng)求趟大,B進(jìn)入SYN_RCVD狀態(tài)鹤树。
A收到確認(rèn)后,檢查ack是否為x+1逊朽,ACK是否為1罕伯,如果正確則將標(biāo)志位ACK置為1,ack=y+1叽讳,并將該數(shù)據(jù)包發(fā)送給B追他,B檢查ack是否為y+1,ACK是否為1岛蚤,如果正確則連接建立成功邑狸,A和B進(jìn)入ESTABLISHED狀態(tài),完成三次握手
3.四次揮手
第一次揮手:A發(fā)送一個(gè)FIN涤妒,用來關(guān)閉A到B的數(shù)據(jù)傳送单雾,A進(jìn)入FIN_WAIT_1狀態(tài)。
第二次揮手:B收到FIN后她紫,發(fā)送一個(gè)ACK給A硅堆,確認(rèn)序號(hào)為收到序號(hào)+1(與SYN相同,一個(gè)FIN占用一個(gè)序號(hào))犁苏,B進(jìn)入CLOSE_WAIT狀態(tài)硬萍。此時(shí)TCP鏈接處于半關(guān)閉狀態(tài),即客戶端已經(jīng)沒有要發(fā)送的數(shù)據(jù)了围详,但服務(wù)端若發(fā)送數(shù)據(jù)朴乖,則客戶端仍要接收
第三次揮手:B發(fā)送一個(gè)FIN,用來關(guān)閉B到A的數(shù)據(jù)傳送助赞,B進(jìn)入LAST_ACK狀態(tài)买羞。
第四次揮手:A收到B后,A進(jìn)入TIME_WAIT狀態(tài)雹食,接著發(fā)送一個(gè)ACK給B畜普,確認(rèn)序號(hào)為收到序號(hào)+1,B進(jìn)入CLOSED狀態(tài)群叶,完成四次揮手吃挑。
五、java框架
(1)springboot
1.springboot優(yōu)于spring的地方
內(nèi)嵌 Tomcat , Jetty Undertow 而且不需要部署他們
提供的“starters” poms來簡(jiǎn)化 Maven 配置
起步依賴街立,創(chuàng)建項(xiàng)目時(shí)候就可以勾選所需的依賴
全部采用注解方式舶衬,沒有繁瑣的xml配置
(2)spring
1.IOC
控制反轉(zhuǎn),是一種設(shè)計(jì)思想赎离。將原本在程序中手動(dòng)創(chuàng)建對(duì)象的控制權(quán)逛犹,交由Spring框架的容器來管理,并且需要一種描述讓容器知道要?jiǎng)?chuàng)建的對(duì)象間的關(guān)系。即IOC容器來管理對(duì)象及其依賴關(guān)系虽画。
2.依賴注入的實(shí)現(xiàn)方法
依賴注入(DI)是實(shí)現(xiàn)IOC的一種方法
構(gòu)造器注入
set方法注入
其他方式(接口注入舞蔽、注解注入)
3.AOP
面向切面編程,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)码撰∩粒基于動(dòng)態(tài)代理,oop(面向?qū)ο缶幊蹋┎钡海瓷?br>
4.AOP的術(shù)語
切面:切面泛指交叉業(yè)務(wù)邏輯做祝。比如聲明式事物處理,日志處理就可以理解為切面
通知:就是你想要的功能鸡岗,即切面中的方法
連接點(diǎn):可以使用通知的地方混槐。如每個(gè)方法的前后
切入點(diǎn):切面實(shí)際切入的地方
目標(biāo):要被通知的對(duì)象
5.AOP的實(shí)現(xiàn)方式
使用原生的Spring API接口(實(shí)現(xiàn)前置通知、后置通知轩性、環(huán)繞通知等接口)
自定義類
注解實(shí)現(xiàn)(@Aspect)
6.IOC容器
BeanFactory:提供了最簡(jiǎn)單的容器的功能声登,只提供了實(shí)例化對(duì)象和拿對(duì)象的功能;
ApplacationContext:繼承BeanFactory接口揣苏,它是Spring的一各更高級(jí)的容器悯嗓,提供了更多的有用的功能
國際化
訪問資源,如URL和文件
事件傳遞:通過實(shí)現(xiàn)ApplicationContextAware接口
7.創(chuàng)建ApplacationContext的方法
FileSystemXmlApplicationContext:從文件系統(tǒng)或者url指定的xml配置文件創(chuàng)建卸察,參數(shù)為配置文件名或文件名數(shù)組
ClassPathXmlApplicationContext:從classpath的xml配置文件創(chuàng)建脯厨,可以從jar包中讀取配置文件
WebApplicationContextUtils:從web應(yīng)用的根目錄讀取配置文件,需要先在web.xml中配置坑质,可以配置監(jiān)聽器或者servlet來實(shí)現(xiàn)
8.bean的作用域
singleton:在Spring容器中僅存在一個(gè)實(shí)例合武,即Bean以單例的形式存在。
prototype:為每一個(gè)bean請(qǐng)求提供一個(gè)實(shí)例涡扼。
request :每次HTTP請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的Bean稼跳。
session:同一個(gè)HTTP Session共享一個(gè)Bean,不同的HTTP Session使用不同的Bean吃沪。
globalSession:同一個(gè)全局的Session共享一個(gè)Bean汤善,一般用于Portlet環(huán)境。
9.bean的生命周期
實(shí)例化(通過構(gòu)造方法或者工廠方法)
屬性賦值 (依賴注入)
初始化
銷毀
10.bean的自動(dòng)裝配
@Autowried:通過byType方式實(shí)現(xiàn)票彪,并且要求這個(gè)對(duì)象存在
@Resouce:默認(rèn)通過byName方式實(shí)現(xiàn)红淡,如果name找不到再通過byType實(shí)現(xiàn)
(3)SpringMVC
1.SpringMVC概念
MVC是一種設(shè)計(jì)模式,在這種模式下軟件被分為三層降铸,即Model(模型)在旱、View(視圖)、Controller(控制器)垮耳。
2.Spring MVC的執(zhí)行流程
參考博客
用戶發(fā)送請(qǐng)求到前端控制器DispatcherServlet
DispatcherServlet收到請(qǐng)求調(diào)用處理映射器HandlerMapping
處理映射器根據(jù)請(qǐng)求url找到具體的處理器颈渊,生成處理器執(zhí)行鏈HandlerExecutionChain(包含處理器對(duì)象和處理器攔截器)返回給DispatcherServlet
DispatcherServlet根據(jù)處理器Handler獲取對(duì)應(yīng)的適配器
HandlerAdapter調(diào)用處理器Handler
Handler(Controller)執(zhí)行完成后返回ModelAndView
HandlerAdapter返回ModelAndView
DispatcherServlet統(tǒng)一將返回的ModelAndView派送到ViewResolve(視圖解析器)解析
視圖解析器解析之后返回View
對(duì)View進(jìn)行渲染
響應(yīng)用戶
3.攔截器和過濾器的區(qū)別
實(shí)現(xiàn)原理不一樣:攔截器實(shí)現(xiàn)原理是反射機(jī)制,過濾器是函數(shù)回調(diào)
使用范圍不一樣:過濾器是servelet中定義的终佛,依賴于tomcat等容器俊嗽,只能在web程序中使用;攔截器是spring的一個(gè)組件铃彰,可以單獨(dú)使用绍豁,還可用在web程序跟其他程序
六、Redis
1.持久化RDB和AOF的區(qū)別
RDB持久化是指在指定的時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤牙捉,實(shí)際操作過程是fork一個(gè)子進(jìn)程竹揍,先將數(shù)據(jù)集寫入臨時(shí)文件,寫入成功后邪铲,再替換之前的文件芬位,用二進(jìn)制壓縮存儲(chǔ)。
優(yōu)點(diǎn):
性能最大化带到。對(duì)于Redis的服務(wù)進(jìn)程而言昧碉,在開始持久化時(shí),它唯一需要做的只是fork出子進(jìn)程揽惹,之后再由子進(jìn)程完成這些持久化的工作被饿,這樣就可以極大的避免服務(wù)進(jìn)程執(zhí)行IO操作了。
相比于AOF機(jī)制搪搏,如果數(shù)據(jù)集很大狭握,RDB的啟動(dòng)效率會(huì)更高
對(duì)于災(zāi)難恢復(fù)而言,RDB是非常不錯(cuò)的選擇疯溺。因?yàn)槲覀兛梢苑浅]p松的將一個(gè)單獨(dú)的文件壓縮后再轉(zhuǎn)移到其它存儲(chǔ)介質(zhì)上
缺點(diǎn):
系統(tǒng)一旦在定時(shí)持久化之前出現(xiàn)宕機(jī)現(xiàn)象论颅,此前沒有來得及寫入磁盤的數(shù)據(jù)都將丟失
AOF持久化以日志的形式記錄服務(wù)器所處理的每一個(gè)寫、刪除操作囱嫩,查詢操作不會(huì)記錄嗅辣,以文本的方式記錄,可以打開文件看到詳細(xì)的操作記錄挠说。
優(yōu)點(diǎn):
可以帶來更高的數(shù)據(jù)安全性澡谭,即數(shù)據(jù)持久性。Redis中提供了3中同步策略损俭,即每秒同步蛙奖、每修改同步和不同步。
即使出現(xiàn)宕機(jī)現(xiàn)象杆兵,也不會(huì)破壞日志文件中已經(jīng)存在的內(nèi)容雁仲。如果我們本次操作只寫入了一半數(shù)據(jù)就出現(xiàn)了系統(tǒng)崩潰問題,在Redis下一次啟動(dòng)之前琐脏,通過redis-check-aof工具來解決數(shù)據(jù)一致性的問題攒砖。
缺點(diǎn):
對(duì)于相同數(shù)量的數(shù)據(jù)集而言缸兔,AOF文件通常要大于RDB文件。RDB 在恢復(fù)大數(shù)據(jù)集時(shí)的速度比 AOF 的恢復(fù)速度要快
根據(jù)同步策略的不同吹艇,AOF在運(yùn)行效率上往往會(huì)慢于RDB惰蜜。
2.redis的數(shù)據(jù)類型
五大數(shù)據(jù)類型:String、List受神、Set抛猖、Hash、Zset(增加分?jǐn)?shù)字段用來排序)
三種特殊數(shù)據(jù)類型:Geospatial(地理位置)鼻听、Hyperloglog(基數(shù)統(tǒng)計(jì)财著,應(yīng)用于網(wǎng)站訪問量)、BitMaps(位圖撑碴,應(yīng)用于簽到撑教、狀態(tài)統(tǒng)計(jì))
3.redis高可用
哨兵和集群模式
4.緩存穿透、緩存擊穿醉拓、緩存雪崩
緩存穿透:客戶端查詢根本不存在的數(shù)據(jù)驮履,使得請(qǐng)求直達(dá)存儲(chǔ)層,導(dǎo)致其負(fù)載過大廉嚼,甚至宕機(jī)玫镐。出現(xiàn)這種情況的原因,可能是業(yè)務(wù)層誤將緩存和庫中的數(shù)據(jù)刪除了怠噪,也可能是有人惡意攻擊恐似,專門訪問庫中不存在的數(shù)據(jù)。
解決方案:緩存空對(duì)象傍念;布隆過濾器
緩存擊穿:一份熱點(diǎn)數(shù)據(jù)矫夷,它的訪問量非常大。在其緩存失效的瞬間憋槐,大量請(qǐng)求直達(dá)存儲(chǔ)層双藕,導(dǎo)致服務(wù)崩潰。
解決方案:熱點(diǎn)數(shù)據(jù)永不過期阳仔;加互斥鎖
緩存雪崩
解決方案:設(shè)置過期時(shí)間時(shí)忧陪,附加一個(gè)隨機(jī)數(shù),避免數(shù)據(jù)同時(shí)過期近范;
七嘶摊、Linux常用命令
1.目錄切換
cd /:切換到根目錄
cd …/:切換到上級(jí)目錄
cd ~:切換到home目錄
2.目錄查看
ls:查看當(dāng)前目錄下的所有目錄和文件
ls -a:查看當(dāng)前目錄下的所有目錄和文件(包含隱藏文件)
ls -l:列表查看當(dāng)前目錄下的所有目錄和文件(列表查看,顯示更多信息)
3.目錄操作
創(chuàng)建
mkdir 目錄名
刪除
rm -f: 強(qiáng)行刪除评矩,不詢問
rm -r 目錄名:遞歸刪除目錄
修改
mv 當(dāng)前目錄 新目錄
查找
find 目錄 參數(shù) 文件名稱
示例:find /usr/tem -name ‘a(chǎn)*’ 查找/usr/tmp目錄下的所有以a開頭的目錄或文件
4.文件操作
創(chuàng)建
touch 文件名
刪除
rm -rf
修改
vi或者vim叶堆,分為三種模式
命令行模式
編輯模式
底行模式
查看
cat:看最后一屏
more:百分比顯示
less:翻頁顯示
tail:指定行數(shù)或者動(dòng)態(tài)查看
5.權(quán)限操作
chmod (u g o a) (+ - =) (r w x) (文件名)
u:文件的擁有者
g:與擁有者在同一組
o:其他用戶
a:上面三者皆是
+:增加權(quán)限
-:撤銷權(quán)限
=:設(shè)定權(quán)限
r:讀權(quán)限
w:寫權(quán)限
x:可執(zhí)行(沒有即代表不可cd進(jìn)入這個(gè)目錄)
6.打包和壓縮
打包文件:tar -cvf 打包文件.tar 被打包的文件/路徑…
解包文件:tar -xvf 打包文件.tar
參數(shù)說明
c:生成檔案文件,創(chuàng)建打包文件
x:解開檔案文件
v:顯示過程
f:指定檔案文件名稱
壓縮文件:tar -zcvf 打包文件.tar.gz 被壓縮的文件/路徑…
解壓文件:tar -zxvf 打包文件.tar.gz
7.查找指令
grep:字符串匹配(從一個(gè)文件的內(nèi)容中匹配一個(gè)字符串)
樣例:ps -ef | grep sshd -c 查找指定進(jìn)程ssh個(gè)數(shù)
-c:只輸出匹配行的計(jì)數(shù)斥杜。
-i:不區(qū)分大小寫虱颗。
-h:查詢多文件時(shí)不顯示文件名沥匈。
-l:查詢多文件時(shí)只輸出包含匹配字符的文件名。
-n:顯示匹配行及 行號(hào)忘渔。
-s:不顯示不存在或無匹配文本的錯(cuò)誤信息高帖。
-v:顯示不包含匹配文本的所有行。
find:從指定的目錄下查找文件或目錄辨萍。
用法:find 路徑 參數(shù) 文件名
樣例:find /home/ygt -name test.txt查找自己賬戶下文件名為test.txt的文件
以文件名查找:find 目錄 -name “文件名或者目錄名”
以文件類型查找:find 目錄 -type d(目錄型文件)/f(普通文件)
以文件大小查找:find 目錄 -size +nk(超過nk)/-n(小于nk)
按分鐘查找:find 目錄 -amin/-bmin/-mmin +n(n分鐘之外)/-n(n分鐘之內(nèi))
按天查找:find 目錄 -atime/-ctime/-mtime +n(n天之外)/-n(n天之內(nèi))
locate:更快速的定位文件。(默認(rèn)每天自動(dòng)更新一次返弹,若要查詢最近更改的文件得先updatedb 來更新檢索數(shù)據(jù)庫)
樣例:locate /etc/sh 搜索etc目錄下所有以sh開頭的文件
locate pwd 查找和pwd相關(guān)的所有文件
8.用戶切換
su
sudo(為所有想使用root權(quán)限的普通用戶設(shè)計(jì)的)
9.查看當(dāng)前目錄
pwd
10.查看進(jìn)程
ps -ef
11.結(jié)束進(jìn)程
kill