JAVA面试题-小白
1.什么是IOC
????????把對(duì)象的生命周期交給Spring框架來(lái)管理,它通過(guò)反射機(jī)制,在實(shí)例化一個(gè)類的時(shí)候,它會(huì)通過(guò)反射調(diào)用set方法將事先保存在底層HashMap中的類屬性注入到類中,從而實(shí)現(xiàn)了控制反轉(zhuǎn)?
?2.什么是AOP
????????AOP是基于IOC控制反轉(zhuǎn)與AOP面向?qū)ο缶幊痰难a(bǔ)充和增強(qiáng),它最主要的技術(shù)就是它的橫切技術(shù),就是從封裝對(duì)象的內(nèi)部解剖開來(lái),把那些影響到多個(gè)類的行為封裝到一個(gè)可重用模塊 (Aspect)來(lái)使用,這樣一方面減少了系統(tǒng)當(dāng)中的重復(fù)代碼,并高度解耦,AOP最主要的技術(shù)就是動(dòng)態(tài)代理與靜態(tài)織入。
? ? ? ?1) 什么是動(dòng)態(tài)代理
? ? ? ? ? ? ? ? 它利用消息截取的方式,對(duì)截取到的消息進(jìn)行裝飾,從而替代原有對(duì)象行為的執(zhí)行,它直接的在運(yùn)行時(shí)運(yùn)用反射機(jī)制來(lái)動(dòng)態(tài)的創(chuàng)建代理對(duì)象,動(dòng)態(tài)代理分為JDK動(dòng)態(tài)代理與CGLIB動(dòng)態(tài)代理。????????
? ? ? ? ? ? ? ? (1)JDK動(dòng)態(tài)代理
? ? ? ? ? ? ? ? ? ? ? ? JDK動(dòng)態(tài)代理是默認(rèn)的代理方式,它需要一個(gè)實(shí)現(xiàn)接口,并且它創(chuàng)建對(duì)象的速度遠(yuǎn)大于CGLIB
? ? ? ? ? ? ? ? (2)CGLIB動(dòng)態(tài)代理
? ? ? ? ? ? ? ? ? ? ? ? CGLIB代理它可以在沒(méi)有接口或者有接口時(shí)都可以使用,但是因?yàn)樗鼊?chuàng)建對(duì)象是直接通過(guò)操作字節(jié)碼文件生成的代理類,所以它創(chuàng)建對(duì)象的速度遠(yuǎn)小于JDK代理,其次它的執(zhí)行速度會(huì)略微的比JDK快,更加的適合單例模式,但會(huì)出現(xiàn)一個(gè)問(wèn)題,如果操作過(guò)多,就會(huì)永久堆滿,就會(huì)OutOfMemry異常,所以Spring是默認(rèn)用JDK動(dòng)態(tài)代理,只有沒(méi)有接口的時(shí)候才使用CGLIB代理
? ? ? ? 2)什么是靜態(tài)織入
? ? ? ? ? ? ? ? 它是引入特定的可重用模塊,在編譯期間就織入有關(guān)的可重用代碼,給每個(gè)業(yè)務(wù)增強(qiáng)提供了一個(gè)代理類,它是在程序運(yùn)行前代理類的字節(jié)碼文件(.class后綴)就已經(jīng)存在,再由代理類來(lái)創(chuàng)建對(duì)象。
3.GC垃圾回收機(jī)制
? ? ? ? 1)復(fù)制回收法:
? ? ? ? ? ? ? ? ? 掃描區(qū)域內(nèi)的所有的對(duì)象,將所有的可達(dá)對(duì)象復(fù)制到另一個(gè)區(qū)域保存起來(lái),再將正在使用的區(qū)域內(nèi)存全部清空,方便快捷,只需要遍歷對(duì)象即可,不會(huì)有內(nèi)存化碎片,但是復(fù)制對(duì)象需要成本。
? ? ? ? 2)標(biāo)記清除法:
? ? ? ? ? ? ? ? ? 遍歷區(qū)域內(nèi)的所有對(duì)象,并且對(duì)可達(dá)對(duì)象進(jìn)行了標(biāo)記,再將不可達(dá)對(duì)象清除,但是它就會(huì)產(chǎn)生大量的內(nèi)存化碎片。
? ? ? ? ?3)標(biāo)記整理法:? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ?遍歷區(qū)域內(nèi)所有可達(dá)對(duì)象,并對(duì)可達(dá)對(duì)象進(jìn)行標(biāo)記,整理到一起,最后清除所有不可達(dá)對(duì)象,達(dá)到GC垃圾回收的目的
4.MyBatis如何防止SQL注入攻擊
? ? ? ? 它最主要的是進(jìn)行了預(yù)編譯,首先SQL注入攻擊只能在預(yù)編譯期間的時(shí)候有效,于是Mybatis事先將SQL語(yǔ)句發(fā)送給數(shù)據(jù)庫(kù),進(jìn)行預(yù)編譯生成一個(gè)類似與框架一樣的固定的SQL語(yǔ)句,其中的具體數(shù)據(jù)內(nèi)容它會(huì)先用占位符“?”替代,當(dāng)預(yù)編譯結(jié)束以后才把具體數(shù)據(jù)重新與占位符替換,從而達(dá)到防止了SQL的注入攻擊。
5.Session與Cookie的區(qū)別
? ? ? ? 1.Session是在服務(wù)器端記錄用戶的信息確定用戶的身份
? ? ? ? ? ?Cookie是在客戶端記錄用戶的信息確定用戶的身份
? ? ? ? 2.Session是存在服務(wù)器端它更加的安全
? ? ? ? ? ?Cookie它存放在客戶端,可以分析存放本地的Cookie進(jìn)行Cookie欺騙,所以不安全
? ? ? ? 3.Session是在服務(wù)器端所以它會(huì)占用服務(wù)器的性能
? ? ? ? ? ?Cookie不會(huì)占用服務(wù)器性能
? ? ? ? 4.Session-destory()是直接銷毀會(huì)話
? ? ? ? ? ?Cookie可以通過(guò)設(shè)置它的過(guò)期時(shí)間來(lái)使其過(guò)期
? ? ? ? 5.Session沒(méi)有存儲(chǔ)的數(shù)據(jù)限制,可以保存更為復(fù)雜的數(shù)據(jù)類型
? ? ? ? ? ?Cookie單個(gè)保存的數(shù)據(jù)是不能超過(guò)4k
? ? ? ? 6.Session的生命周期是有間隔性的,當(dāng)Session出現(xiàn)存在的那一刻開始,如果一段時(shí)間沒(méi)有重新訪問(wèn)Session,那么Session就會(huì)消失
? ? ? ? ? ?Cookie它可以預(yù)先設(shè)置它的生存周期,或者永久的保存在本地文件,如果沒(méi)有設(shè)置它的生命周期,那么Cookie就會(huì)在瀏覽器關(guān)閉的時(shí)候就一起消失了。
6.消息隊(duì)列
? ? ? ? 消息隊(duì)列是分布式系統(tǒng)的重要組件,主要用于應(yīng)用的解耦、流量削峰、異步消息等從而實(shí)現(xiàn)高可用、高性能,消息隊(duì)列都有:ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ。
? ? ? ? 應(yīng)用解耦:
????????常規(guī)的一個(gè)訂單訪問(wèn)請(qǐng)求,需要用戶發(fā)送請(qǐng)求,然后去訪問(wèn)庫(kù)存,但是如果庫(kù)存系統(tǒng)出問(wèn)題,那么用戶的訂單請(qǐng)求就會(huì)直接失敗。
????????于是在請(qǐng)求與庫(kù)存中間加入消息隊(duì)列,就是用戶下單后,訂單系統(tǒng)進(jìn)行持久化處理,將消息寫入消息隊(duì)列,消息隊(duì)列就會(huì)給用戶返回下單成功,后續(xù)庫(kù)存系統(tǒng)通過(guò)消息隊(duì)列獲取下單的信息,根據(jù)下單的信息進(jìn)行更新操作,這樣就防止了庫(kù)存出問(wèn)題后直接返回給用戶訂單失敗,而是把請(qǐng)求給消息隊(duì)列直接返回下單成功,實(shí)現(xiàn)了請(qǐng)求和庫(kù)存系統(tǒng)的解耦。
? ? ? ? 流量削峰:
? ? ? ? 常規(guī)的高并發(fā)請(qǐng)求會(huì)導(dǎo)致流量暴增,應(yīng)用就會(huì)宕掉。
? ? ? ? 于是我們就在應(yīng)用前端加入消息隊(duì)列,用戶的請(qǐng)求被服務(wù)器接收后,會(huì)先將信息傳入消息隊(duì)列,然后具體業(yè)務(wù)再通過(guò)消息隊(duì)列的信息進(jìn)行業(yè)務(wù)處理,如果請(qǐng)求數(shù)量高到超過(guò)了消息隊(duì)列的最大長(zhǎng)度,就會(huì)拋棄用戶的請(qǐng)求或者直接跳轉(zhuǎn)頁(yè)面,做后續(xù)處理
? ? ? ? 異步消息:
? ? ? ? 常規(guī)的數(shù)據(jù)的寫入一般都是串行或者并行,假如流程是用戶注冊(cè),寫入信息、郵箱認(rèn)證、短信認(rèn)證,在串行方式下,它就會(huì)按順序的依次執(zhí)行,全部執(zhí)行完畢后返回給用戶。在并行方式下,用戶寫入數(shù)據(jù)后,同時(shí)進(jìn)行后續(xù)的認(rèn)證操作,再返回給用戶信息,速度上會(huì)比串行方式下快點(diǎn),但是這兩種方式都比較耗時(shí)。
? ? ? ? 于是我們就在用戶寫入數(shù)據(jù)之后加入了消息隊(duì)列,在用戶寫入數(shù)據(jù)之后,將信息寫入到消息隊(duì)列后直接返回給用戶成功信息,后續(xù)用戶在進(jìn)行郵件短信的認(rèn)證操作。
7.SpringBoot常用注解
? ? ? ? @SpringBootApplication啟動(dòng)類注解
? ? ? ? @Configuration配置類注解
? ? ? ??@EnableAutoConfiguration自動(dòng)配置
? ? ? ? @ComponentScan自動(dòng)掃描組件
? ? ? ? @Controller將用戶請(qǐng)求轉(zhuǎn)發(fā)到對(duì)應(yīng)服務(wù)接口
? ? ? ? @ResponseBody異步獲取數(shù)據(jù)使用,比如異步獲取Json數(shù)據(jù)會(huì)直接返回Json數(shù)據(jù)
? ? ? ? @RestController是@Controller和@ResponseBody的集合
? ? ? ? @Import導(dǎo)入其他配置類
? ? ? ? @ImportResource加載xml配置文件
? ? ? ? @PathVariable獲取URL參數(shù)Restful風(fēng)格接口
? ? ? ? @Service修飾Service層的組件
? ? ? ? @Bean等價(jià)于xml的Bean,產(chǎn)生一個(gè)Bean交給SPringBoot管理
? ? ? ? @Value注入SpringBoot的配置文件
? ? ? ? @Component組件不好歸類時(shí),進(jìn)行標(biāo)注
? ? ? ? @AutoWired自動(dòng)導(dǎo)入依賴的Bean,IOC
8.Redis
????????首先Redis是單線程的,它通過(guò)隊(duì)列技術(shù)將并發(fā)訪問(wèn)變成了串行訪問(wèn),其次Redis的速度快,因?yàn)閿?shù)據(jù)存在內(nèi)存?? ?當(dāng)中,類似與HashMap,它有豐富的數(shù)據(jù)類型,String字符串,按照添加順序保持有序的字符串列表List集合,無(wú)序?? ?的字符串集合set集合,已排序的集合sorted set,它還支持事物,操作都是原子性,就是對(duì)數(shù)據(jù)的更新要么都成功?? ?要么都失敗,并且支持持久化數(shù)據(jù)和數(shù)據(jù)備份,它持久化分為AOF和RDB,RDB就是給Key加了一個(gè)時(shí)間戳,一段時(shí)間?? ?就會(huì)快照一次,AOF就是它會(huì)記錄每次對(duì)服務(wù)器寫的操作,當(dāng)服務(wù)器重啟時(shí)他就就會(huì)重新執(zhí)行這些命令,支持主從復(fù)?? ?制,主機(jī)會(huì)自動(dòng)將數(shù)據(jù)庫(kù)復(fù)制到從機(jī),可以進(jìn)行讀寫分離。
9.List、Set、Map
? ? ? ? List接口
? ? ? ? ? ? ? ? List是一個(gè)繼承于collection的接口,它是有序的集合,List集合的每一個(gè)元素都有一個(gè)索引,從0開始依次往后,它允許出現(xiàn)重復(fù)的元素,實(shí)現(xiàn)List集合有:ArraysList、LinkedList、Vector、Stack
????????????????ArraysList 它是一個(gè)動(dòng)態(tài)的數(shù)組,它允許任何的元素插入,包括null,每一個(gè)ArraysList都有一個(gè)初始容量,并且隨著容器中的元素不斷增加,容器也隨之增加,每次容器進(jìn)行更新操作都會(huì)進(jìn)行容量檢查,快溢出時(shí)就會(huì)進(jìn)行擴(kuò)容。
? ? ? ? ? ? ? ? LinkedList 它是一個(gè)雙向鏈表,它除了ArraysList的方法外還提供了get(查詢)、remove(移除)、insert(添加)在LinkedList的首尾部。
? ? ? ? Set接口
? ? ? ? ? ? ? ? Set也是繼承自collection的接口,Set集合是不能有重復(fù)數(shù)據(jù),可以有null但切只有一個(gè),實(shí)現(xiàn)Set的接口有:HashSet、TreeSet、LinkedHashSet、EnumSet。
? ? ? ? ? ? ? ? HashSet 它是查詢最快的集合,其內(nèi)部由HashCode來(lái)實(shí)現(xiàn),內(nèi)部的順序由哈希碼值來(lái)決定的,并且它的元素可以有null但切只有一個(gè),所以它不保證Set的迭代順序。
? ? ? ? ? ? ? ? TreeSet 它是二叉樹實(shí)現(xiàn)的,基于TreeMap,生成一個(gè)總是處于排序狀態(tài)的Set,內(nèi)部以TreeMap實(shí)現(xiàn),它不允許放入null值,它是用元素的自然順序?qū)υ剡M(jìn)行排序,或者用Comparator進(jìn)行排序。
? ? ? ? ? ? ? ? LinkedHashSet 它同樣是根據(jù)元素的HashCode值來(lái)決定元素的存儲(chǔ)位置,但是它同時(shí)使用鏈表維護(hù)元素的次序,就是像以插入順序保存的,當(dāng)遍歷時(shí),它將會(huì)以元素的添加順序訪問(wèn)集合的元素,它迭代訪問(wèn)全部元素時(shí)性能比HashSet好,但是插入性能比HashSet遜色。
? ? ? ? Map接口
? ? ? ? ? ? ? ? 它與List和Set不同,它由一系列鍵值對(duì)組成,提供了key和value的映射,一個(gè)key對(duì)應(yīng)一個(gè)value,因此它不能存在相同的key,value可以相同,實(shí)現(xiàn)map的集合有:HashMap、HashTable、TreeMap、WeakHashMap。
? ? ? ? ? ? ? ? HashMap 是以哈希表數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,查找對(duì)象時(shí)通過(guò)哈希函數(shù)計(jì)算位置,為了快速查詢?cè)O(shè)計(jì),內(nèi)部定義了一個(gè)hash表數(shù)組,通過(guò)哈希函數(shù)將元素的地址值轉(zhuǎn)換為數(shù)組中存放的索引,如果有沖突就會(huì)使用散列鏈表將其串起來(lái)。
? ? ? ? ? ? ? ? HashTable 是以哈希表數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,解決沖突與HashMap一樣,因?yàn)樗€是繼承Dictionary類,所以每個(gè)key和value都可以是一個(gè)對(duì)象,并且每個(gè)key最多與一個(gè)value關(guān)聯(lián)。
? ? ? ? ? ? ? ? TreeMap 是有序的散列表,實(shí)現(xiàn)SortedMap接口,底層通過(guò)紅黑樹實(shí)現(xiàn)
????????總結(jié)
? ? ? ? ? ? ? ? 1.List、Set都是繼承自collection接口,而Map不是
? ? ? ? ? ? ? ? 2.List:有序放入元素,元素可以重復(fù),可以有null值,遍歷方式下標(biāo)或者迭代器。查找元素效率高,插入慢,因?yàn)椴迦朐鼐蜁?huì)導(dǎo)致其他元素位置改變。
? ? ? ? ? ? ? ? ? ?Set:無(wú)序放入元素,元素不可以重復(fù),可以有null值但只有一個(gè),但是它的元素位置? 固定由HashCode決定,遍歷方式只能用迭代器,檢索慢,更新快,因?yàn)楦虏僮鞑粫?huì)導(dǎo)致其他元素位置改變
? ? ? ? ? ? ? ? ? ?Map:存儲(chǔ)鍵值對(duì)的數(shù)據(jù)
? ? ? ? ? ? ? ? 3.線程安全考慮:ArrayList、LinkedList、HashSet、HshMap非線程安全
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Vector、HashTable線程安全
總結(jié)
以上是生活随笔為你收集整理的JAVA面试题-小白的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 高至霆个人资料 关于高至霆的介绍
- 下一篇: 常用的依赖