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