什么是代理?為什么要用動態代理?
代理模式大概意思是:為其他對象提供一個代理項或者是占位符,以控制對這個對象的訪問
代理模式核心思想:創建一個代理對象,在客戶端和目標對象之間的一個中介,主要作用就是保護目標對象以及增強目標對象
靜態代理:相當于是這個代理對象我們需要手動去創建,而且一個代理對象只能服務于一種業務類型對象,那么當我們有n個業務目標對象的時候,就需要n個靜態代理對象,這樣的話就不利于我們業務的擴展
舉例:有一個程序員張三,他平時加班比較多,并且加上公司的異性同事又比較少,然后又不善于與其溝通,那自己又缺少人脈和資源,所以一直沒有找對象,這時張三的父親張老三就比較著急了,他就利用自己的人脈然后經常給張三安排相親,那張老三就是張三的代理的相親對象,那么問題來了,一般情況下,張老三是不會給李四去安排相親的,因為張老三是不會關心李四有沒有對象這個事情,李四有沒有對象只有李老四才會關心,那么這個時候呢,就出現了一個新的職業叫媒婆,媒婆就會關心張三李四王五趙六等這些有沒有對象,媒婆就成了所有相親需求的代理對象,那么這樣的代理對象就可以服務于所有相關業務對象,這就相當于動態代理對象
減少代理對象的個數,從而去降低程序的復雜度,易于復雜業務的動態擴展
jdk proxy的基本實現原理
- 拿到目標對象的引用,并且通過反射去獲取目標對象所有的接口
- 要重新去生成一個新的代理類,實現目標類所有的接口方法
- 把增強的邏輯代碼加入到新生成的代理類的源代碼中
- 動態去編譯代理類的源代碼并且生成字節碼即class文件,這個部分是內存中完成的
- 去加載并執行新生成的代理對象
CGLib和JDK動態代理的對比
- JDK動態代理是實現目標對象的接口,而CGLib是繼承目標對象
- JDK和CGLib都是在運行期生成字節碼
- JDK通過反射來調用目標方法,而CGLib是通過FastClass機制調用目標方法
目標對象即被代理對象?
為什么不用UUID來做主鍵?
- 無序不是趨勢遞增,而是會導致樹的分裂與合并,樹的問題雖然查詢快,但是修改比鏈表慢,增加數據的時候會很慢 聯想hashmap1.8以后他加了一個紅黑樹,他在鏈表和紅黑樹之間轉來轉去,如果數據小于6了,就把它轉為鏈表了
- 內存?頁放的數據越少,同樣的數據我需要的頁數越多 層級可能越高 磁盤io次數越多(int -> String)?
SpringBoot和傳統的Spring有什么區別
首先,springboot采用了約定大于配置這樣一個理念,大大簡化了spring應用的初期搭建以及后期的維護工作,它提供大量的自動配置,開發者不需要進行繁瑣的XML配置就可以專注于核心業務的開發
其次,springboot內置了Tomcat等應用服務器,讓項目的部署也變得更加方便,同時springboot還提供了許多starters組件,方便集成各種常用的框架和中間件,比如Redis,JPA,MQ等,相比之下,傳統的Spring配置更加靈活,可以適應各種復雜項目的需求,但是相應的配置更加復雜,對于我個人而言,我更加傾向于使用SpringBoot,因為它能讓我更加專注與業務代碼的編寫,而不需要花費大量的時間在配置和環境搭建上,以上就是我對這個問題的理解
項目舉例描述
比如說我先拿到這個文件,然后去遍歷這個文件里面的詞組,然后我給他建立一個正排的索引和一個倒排的索引,通過一個ID,也就是集合的下標,他們建立關系,然后查詢的話就是用倒排獲得這種ID,再通過正牌去拿到文章的內容,然后再展示出來,然后這邊就會涉及到權重的問題和排序的問題?
反射
反射是指在運行時檢查和操作類、接口、字段、方法等程序結構的能力。通過反射,可以在運行時獲取類的信息,創建類的實例,調用類的方法,訪問和修改類的字段等。通過反射可以提高程序的靈活性和可擴展性,可以實現更多的功能。但在使用反射時需要考慮性能問題以及安全等問題。
克隆
線程安全
如何查看端口80有沒有被占用
netstat -anp | grep 80