天天看點

資格評審

排序

冒泡排序:兩兩對比,每次找到這組最大的,最後得效果得每次排序都把最大的放到後面 O(n^2)

選擇排序:每次找出最小得放到隊列前面 O(n^2)

插入排序:第一次排好前2個,第二次排好前3個,第三次排好前4個   O(n^2)

快速排序:以指定值把隊列分成兩半,然後對每一半進行循環分成兩半  O(nlogn)

希爾排序:分成長度/2組,直到分成1組。O(nlogn)

歸并排序:把隊列分成2份并且有序,然後建立兩個指針,一個一個的把小球放到臨時隊列中O(nlogn)

加密算法

對稱算法:DES,3DES,AES

非對稱算法:RSA,DSA

雜湊演算法:MD5,SHA-1

本地存儲

localStorage   用法:localStorage.setItem(Key,Value);

sessionStorage 用法:sessionStorage.setItem(Key,Value);

浏覽器事件傳播機制

捕獲:事件對象從 window ==》目标對象父級的過程

目标:事件對象派發到目标元素時的階段

冒泡:與是以目标對象父級  ==》到 window 的過程

常見JS的DOM操作

資格評審

浏覽器渲染過程 

建構dom樹 

建構render樹

布局render樹 

繪制render樹

資格評審

跨域問題

document.domain + iframe

location.hash + iframe

window.name + iframe

postMessage

CORS

JSONP

web sockets

動态建立script

浏覽器安全

XSS:跨站點腳本攻擊,注入JS。1.非持久性跨站點腳本攻擊 2.持久的跨站點腳本攻擊  3. 基于dom的跨站點腳本攻擊

CSRF:僞裝Cookie攻擊。

       防禦手段:1.判斷請求頭中的 Referer 2.在請求參數中加入 csrf token 3.新增Http請求頭,将 token 放在請求頭中

SpringMVC流程

資格評審

DispatcherServlet ==> HandlerMapping ==> Handler ==> HandlerAdapter ==> ModelAndView == > ViewResolver

1.使用者發送請求到前端控制器DispatcherServlet。

2.DispatcherServlet收到請求,調用HandlerMapping處理器映射器。

3.處理器映射器HandlerMapping找到具體的處理器,解析請求對應的Handler。

4.解析到對應的 Handler(也就是我們平常說的 Controller 控制器)後,開始由 HandlerAdapter 擴充卡處理。

5.HandlerAdapter 會根據 Handler 來調用真正的處理器開處理請求,并處理相應的業務邏輯。

6.處理器處理完業務後,會傳回一個 ModelAndView 對象,Model 是傳回的資料對象,View 是個邏輯上的 View。

7.ViewResolver 會根據邏輯 View 查找實際的 View。

8.DispaterServlet 把傳回的 Model 傳給 View(視圖渲染)

9.把 View 傳回給請求者(浏覽器)

AOP實作技術

        AOP(這裡的AOP指的是面向切面程式設計思想,而不是Spring AOP)主要的的實作技術主要有Spring AOP和AspectJ。

        AspectJ的底層技術是靜态代理,該代理類增強了業務類,這是在編譯時增強。

        Spring AOP采用的是動态代理,在運作期間對業務方法進行增強,是以不會生成新類,對于動态代理技術,Spring AOP提供了對 JDK動态代理的支援以及CGLib的支援。

       JDK動态代理隻能為接口建立動态代理執行個體,而不能對類建立動态代理。需要獲得被目标類的接口資訊(應用Java的反射技術),生成一個實作了代理接口的動态代理類(位元組碼),再通過反射機制獲得動态代理類的構造函數,利用構造函數生成動态代理類的執行個體對象,在調用具體方法前調用invokeHandler方法來處理。

       CGLib動态代理需要依賴asm包,把被代理對象類的class檔案加載進來,修改其位元組碼生成子類。

建立線程池的四種方式

       newFixedThreadPool 建立一個定長線程池,可控制線程最大并發數,超出的線程會在隊列中等待。以共享的無界隊列方式來運作這些線程。如果某個線程因為執行異常而結束,那麼線程池會補充一個新線程。線程池的大小一旦達到最大值就會保持不變。

       newScheduledThreadPool 建立一個定長的(大小無限制)線程池,支援定時及周期性任務執行。

       newSingleThreadExecutor 建立一個單線程化的線程池,它隻會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。【使用單個線程執行的線程池,特點是先進先出、先進後出、帶優先級】

       newCachedThreadPool建立一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則建立線程。此線程池不會對線程池大小做限制,線程池大小完全依賴于作業系統(或者說JVM)能夠建立的最大線程大小。【注:建立與實際需求相符合的線程池】

阻塞隊列

        BlockingQueue是雙緩沖隊列。BlockingQueue内部使用兩條隊列,允許兩個線程同時向隊列一個存儲,一個取出操作。在保證并發安全的同時,提高了隊列的存取效率。

        我們知道隊列是先進先出的。當放入一個元素的時候,會放在隊列的末尾,取出元素的時候,會從隊頭取。那麼,當隊列為空或者隊列滿的時候怎麼辦呢。這時,阻塞隊列,會自動幫我們處理這種情況。

        當阻塞隊列為空的時候,從隊列中取元素的操作就會被阻塞。當阻塞隊列滿的時候,往隊列中放入元素的操作就會被阻塞。後,一旦空隊列有資料了,或者滿隊列有空餘位置時,被阻塞的線程就會被自動喚醒。

        ArrayBlockingQueue這是一個由數組結構組成的有界阻塞隊列,它沒有實作讀寫分離,也就是說,讀和寫是不能同時進行的。因為,它讀寫時用的是同一把鎖。

資格評審

        LinkedBlockingQueue這是一個由連結清單結構組成的有界阻塞隊列,實作了讀寫分離,可以實作資料的讀和寫互不影響。

資格評審

        SynchronousQueue這是一個沒有緩沖的無界隊列,Size方法總是傳回 0 ,因為它是一個沒有容量的隊列。當執行插入元素的操作時,必須等待一個取出操作。也就是說,put元素的時候,必須等待 take 操作。适用于并發任務不大,而且生産者和消費者的速度相差不多的場景下,直接把生産者和消費者對接,不用經過隊列的入隊出隊這一系列操作。是以,效率上會高一些。Excutors.newCachedThreadPool 方法用的就是這種隊列。

        PriorityBlockingQueue這是一個支援優先級排序的無界隊列。它基于二叉樹最小堆實作的,每當取元素的時候,就會把優先級最高的元素取出來。

        DelayQueue這是一個帶有延遲時間的無界阻塞隊列。隊列中的元素,隻有等延時時間到了,才能取出來。此隊列一般用于過期資料的删除,或任務排程。

線程生命周期

New New狀态是線程執行個體化後還沒有執行start()方法的狀态。new Thread().getState();
RUNNABLE             

線程進入運作的狀态。

即   Thread t1 = new Thread(); t1.start(); 

TIMED_WAITING    

有時間限制的等待。

即線程調用了Thread.sleep(XXX)方法後的狀态。

WAITING

線程執行了  lock.wait() 後的狀态。

永久等待,直到被另外一個線程lock.notify()

BLOCKED 當一個線程在等待同步鎖時,線程狀态為BLOCKED
TERMINATED 當任務執行完畢後的狀态
資格評審

不釋放鎖

        sleep(),yeild()

        調用 sleep() 方法使線程進入等待狀态,等待休眠時間達到,則繼續執行。而調用我們的 yield() 方法,線程會進入就緒狀态,也就是sleep()需要等待設定的時間後才會進行就緒狀态,而yield會立即進入就緒狀态,準備下次競争CPU時間片。

釋放鎖

         wait(),join()

        A線程的任務中出現 B.join(); 那麼A線程需要等待B線程任務執行完畢再繼續執行。線程A調用 otherThread.join()方法,那麼線程A進入 WAITING 狀态,内部使用的是 wait()方法實作,是以會釋放同步鎖。

         notify和notifyAll都會釋放鎖,但是不是立即釋放鎖而是會等到其synchronized内中的代碼全部執行完之後,才會釋放鎖。

分區分表規則

分區

        分區并不是生成新的資料表,而是将表的資料均衡分攤到不同的硬碟或伺服器存儲上,實際上還是一張表。它把一張表的資料分成N個區塊,在邏輯上看最終隻是一張表,但底層是由N個實體區塊組成的

        水準分區:對表的行進行分區。比如十年的發票,按照年份分成十個區。

        垂直分區:使某些特定的列被劃分到特定的分區。比如不常使用的大字段【商品描述】可以劃分到另外一個分區。

分表

         分表就是把一張表按一定的規則分解成N個具有獨立存儲空間的實體表。一旦分表,一個庫中的表會越來越多。

         水準分表:school_001、school_002

         垂直分表:例如把存儲大圖檔、大BLOB對象的列單獨抽出一張表,與原來的表一一對應。

分區和分表的差別與聯系

         分區和分表的目的都是減少資料庫的負擔,提高表的增删改查效率。

         分區隻是一張表中的資料的存儲位置發生改變,分表是将一張表分成多張表。

         當通路量大,且表資料比較大時,兩種方式可以互相配合使用。

         當通路量不大,但表資料比較多時,可以隻進行分區。

分表的規則政策

  1. Range(範圍)
  2. Hash(哈希)
  3. 按照時間拆分
  4. Hash之後按照分表個數取模
  5. 在認證庫中儲存資料庫配置,就是建立一個DB,這個DB單獨儲存user_id到DB的映射關系

Java基礎

面向對象最小的程式單元是:類

繼續閱讀