1. 程式人生 > >JAVA最全面試題答案整理

JAVA最全面試題答案整理

支付寶或微信支付

如果因為網路原因或其他原因沒有回撥, 怎麼保證支付狀態一致?

token驗證

下面我們從一個例項來看如何運用JWT機制實現認證:

登入

  • 第一次認證:第一次登入,使用者從瀏覽器輸入使用者名稱/密碼,提交後到伺服器的登入處理的Action層(Login Action);
  • Login Action呼叫認證服務進行使用者名稱密碼認證,如果認證通過,Login Action層呼叫使用者資訊服務獲取使用者資訊(包括完整的使用者資訊及對應許可權資訊);
  • 返回使用者資訊後,Login Action從配置檔案中獲取Token簽名生成的祕鑰資訊,進行Token的生成;
  • 生成Token的過程中可以呼叫第三方的JWT Lib生成簽名後的JWT資料;
  • 完成JWT資料簽名後,將其設定到COOKIE物件中,並重定向到首頁,完成登入過程;

請求認證

  • 基於Token的認證機制會在每一次請求中都帶上完成簽名的Token資訊,這個Token資訊可能在COOKIE中,也可能在HTTP的Authorization頭中;
  • 客戶端(APP客戶端或瀏覽器)通過GET或POST請求訪問資源(頁面或呼叫API);
  • 認證服務作為一個Middleware HOOK 對請求進行攔截,首先在cookie中查詢Token資訊,如果沒有找到,則在HTTP Authorization Head中查詢;
  • 如果找到Token資訊,則根據配置檔案中的簽名加密祕鑰,呼叫JWT Lib對Token資訊進行解密和解碼;
  • 完成解碼並驗證簽名通過後,對Token中的exp、nbf、aud等資訊進行驗證;
  • 全部通過後,根據獲取的使用者的角色許可權資訊,進行對請求的資源的許可權邏輯判斷;
  • 如果許可權邏輯判斷通過則通過Response物件返回;否則則返回HTTP 401;

請求的過程(跟框架有關)

Struts2:

  1. 客戶端初始化一個指向Servlet容器(例如Tomcat)的請求
  2. 這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的整合很有幫助,例如:SiteMesh Plugin)
  3. 接著FilterDispatcher(現已過時)被呼叫,FilterDispatcher詢問ActionMapper來決定這個請是否需要呼叫某個Action
  4. 如果ActionMapper決定需要呼叫某個Action,FilterDispatcher把請求的處理交給ActionProxy
  5. ActionProxy通過Configuration Manager詢問框架的配置檔案,找到需要呼叫的Action類
  6. ActionProxy建立一個ActionInvocation的例項。
  7. ActionInvocation例項使用命名模式來呼叫,在呼叫Action的過程前後,涉及到相關攔截器(Intercepter)的呼叫。
  8. 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標籤。在這個過程中需要涉及到ActionMapper

這裡寫圖片描述

SpringMVC:

  1. 使用者傳送請求至前端控制器DispatcherServlet
  2. DispatcherServlet收到請求呼叫HandlerMapping處理器對映器。
  3. 處理器對映器根據請求url找到具體的處理器,生成處理器物件及處理器攔截器(二者組成HandlerExecutionChain),並將其一併返回給DispatcherServlet。
  4. DispatcherServlet通過HandlerAdapter處理器介面卡呼叫處理器
  5. 執行處理器(Controller,也叫後端控制器)。
  6. Controller執行完成返回ModelAndView
  7. HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
  8. DispatcherServlet將ModelAndView傳給ViewReslover檢視解析器
  9. ViewReslover解析後返回具體View
  10. DispatcherServlet對View進行渲染檢視(即將模型資料填充至檢視中)。
  11. DispatcherServlet對使用者進行響應

這裡寫圖片描述

1. JAVA虛擬機器

GC,

2. 垃圾回收機制? 新生代和老年代比例? 回收的方式

jvm 中,程式計數器、虛擬機器棧、本地方法棧都是隨執行緒而生隨執行緒而滅,棧幀隨著方法的進入和退出做入棧和出棧操作,實現了自動的記憶體清理,因此,我們的記憶體垃圾回收主要集中於 java 堆方法區中,在程式執行期間,這部分記憶體的分配和使用都是動態的.

演算法:
1. 標記 -清除演算法
2. 複製演算法
3. 標記-壓縮演算法
4. 分代收集演算法

JVM GC怎麼判斷物件可以被回收了?

· 物件沒有引用
· 作用域發生未捕獲異常
· 程式在作用域正常執行完畢
· 程式執行了System.exit()
· 程式發生意外終止(被殺執行緒等)

預設的新生代(Young generation)、老年代(Old generation)所佔空間比例為 1 : 2 。

3. 一個數據庫連線慢, 有多少種可能原因?

  1. 網路問題
  2. 當前連結數已用完, 需等待其他執行緒釋放才能連結

4. 程序和執行緒的關係

執行緒: 最小處理單元, 共享記憶體
程序: 可以包含多條執行緒, 不共享記憶體

5. 資料庫的索引優化

對於mysql資料庫來說,索引的使用是很巧妙的。它設定的好可以提高速度,設定的不好不光無法提高速度,還會造成浪費記憶體空間。在優化方面,我們首先建立索引,要判斷是否需要建立。其次使用的時候,要儘可能避免索引與or,where。。。。。。(此處有至少10條)一起使用。

6. String s= new String(“abc”)建立了幾個物件, 分別放在哪裡

  1. 兩個的情況: 一個是”abc”, 放在堆中的字串池中, 一個是String物件在堆中, s作為String物件的引用放在棧中

8.java同步的方式

  1. sychronize(方法和同步程式碼塊), jvm自動釋放鎖
  2. reetrantlock, 需要手動釋放, 方法必須放在final裡
  3. 使用特殊域變數(volatile)實現執行緒同步: 它的原理是每次要執行緒要訪問volatile修飾的變數時都是從記憶體中讀取,而不是存快取當中讀取,因此每個執行緒訪問到的變數值都是一樣的。這樣就保證了同步。
  4. 使用重入鎖實現執行緒同步: ReenreantLock

9.排序方式有哪些,講一下

快排,

10.堆排序的原理

11.設計模式在java中的應用

單例模式: 靜態內部類實現執行緒安全
懶漢式保證執行緒安全的方式:
1. 靜態內部類

public class Singleton {    
    private static class LazyHolder {    
       private static final Singleton INSTANCE = new Singleton();    
    }    
    private Singleton (){}    
    public static final Singleton getInstance() {    
       return LazyHolder.INSTANCE;    
    }    
}    
  1. 雙重檢查鎖定
public class Singleton {  
 2      private static Singleton instance;  
 3      private Singleton (){
 4      }   
 5      public static Singleton getInstance(){    //對獲取例項的方法進行同步
 6        if (instance == null){
 7            synchronized(Singleton.class){
 8                if (instance == null)
 9                    instance = new Singleton(); 
10            }
11        }
12        return instance;
13      }
14      
15  }

12.socket

網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。

13. http

14. mysql資料庫引擎

mysql資料庫中,常見的引擎有三種,例如,innoDB,myISAM,memory。其中INNODB的特點是可以用於事務,mvcc的行級鎖。特點是ACID,使用的索引通常是B+樹,B+樹作為索引的特點是有序,連線

15. tcp/ip

1,分為三次握手,四次揮手。(詳細點,過程,每一次連線的引數,引數表示的意義)。2,在四次揮手中,其實有兩次可以合二為一,就形成了三次揮手。3,第四次揮手的意義有兩種,一個是避免無效資料,一個是防止傳送異常。4,在第四次揮手中用到了定時器,tcp/ip中一共有四種定時器,分別是重傳定時器

  1. 第一次握手:192.168.1.116傳送位碼syn=1,隨機產生seq number=3626544836的資料包到192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立聯機;

  2. 第二次握手:192.168.1.123收到請求後要確認聯機資訊,向192.168.1.116傳送ack number=3626544837,syn=1,ack=1,隨機產生seq=1739326486的包;

  3. 第三次握手:192.168.1.116收到後檢查ack number是否正確,即第一次傳送的seq number+1,以及位碼ack是否為1,若正確,192.168.1.116會再發送ack number=1739326487,ack=1,192.168.1.123收到後確認seq=seq+1,ack=1則連線建立成功。

四次揮手:
1. 客戶端A傳送一個FIN,用來關閉客戶A到伺服器B的資料傳送(報文段4)。
2. 伺服器B收到這個FIN,它發回一個ACK,確認序號為收到的序號加1(報文段5)。和SYN一樣,一個FIN將佔用一個序號。
3. 伺服器B關閉與客戶端A的連線,傳送一個FIN給客戶端A(報文段6)。
4. 客戶端A發回ACK報文確認,並將確認序號設定為收到序號加1(報文段7)。

16.從下往上說一下OSI七個分層?

OSI七層模型與TCP/IP五層模型
TCP/IP五層模型: 應用層, 傳輸層, 網路層, 資料鏈路層, 物理層
OSI定義了網路互連的七層框架(物理層、資料鏈路層、網路層、傳輸層、會話層、表示層、應用層),即ISO開放互連繫統參考模型。

17.TCP、UDP屬於哪個層?有什麼區別?

傳輸層.

TCP與UDP區別總結:
1、TCP面向連線(如打電話要先撥號建立連線);UDP是無連線的,即傳送資料之前不需要建立連線
2、TCP提供可靠的服務。也就是說,通過TCP連線傳送的資料,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付
3、TCP面向位元組流,實際上是TCP把資料看成一連串無結構的位元組流;UDP是面向報文的
UDP沒有擁塞控制,因此網路出現擁塞不會使源主機的傳送速率降低(對實時應用很有用,如IP電話,實時視訊會議等)
4、每一條TCP連線只能是點到點的;UDP支援一對一,一對多,多對一和多對多的互動通訊
5、TCP首部開銷20位元組;UDP的首部開銷小,只有8個位元組
6、TCP的邏輯通訊通道是全雙工的可靠通道,UDP則是不可靠通道

18.FTP在哪個層?

應用層

19. 說說SQL中連線(join)?

inner join, left join

20. 說說資料庫事務?

用一個常用的“A賬戶向B賬號匯錢”的例子來說明如何通過資料庫事務保證資料的準確性和完整性。熟悉關係型資料庫事務的都知道從帳號A到帳號B需要6個操作:

1、從A賬號中把餘額讀出來(500)。
2、對A賬號做減法操作(500-100)。
3、把結果寫回A賬號中(400)。
4、從B賬號中把餘額讀出來(500)。
5、對B賬號做加法操作(500+100)。
6、把結果寫回B賬號中(600)。

原子性:
保證1-6所有過程要麼都執行,要麼都不執行。一旦在執行某一步驟的過程中發生問題,就需要執行回滾操作。 假如執行到第五步的時候,B賬戶突然不可用(比如被登出),那麼之前的所有操作都應該回滾到執行事務之前的狀態。

一致性
在轉賬之前,A和B的賬戶中共有500+500=1000元錢。在轉賬之後,A和B的賬戶中共有400+600=1000元。也就是說,資料的狀態在執行該事務操作之後從一個狀態改變到了另外一個狀態。同時一致性還能保證賬戶餘額不會變成負數等。

隔離性
在A向B轉賬的整個過程中,只要事務還沒有提交(commit),查詢A賬戶和B賬戶的時候,兩個賬戶裡面的錢的數量都不會有變化。
如果在A給B轉賬的同時,有另外一個事務執行了C給B轉賬的操作,那麼當兩個事務都結束的時候,B賬戶裡面的錢應該是A轉給B的錢加上C轉給B的錢再加上自己原有的錢。

永續性
一旦轉賬成功(事務提交),兩個賬戶的裡面的錢就會真的發生變化(會把資料寫入資料庫做持久化儲存)!

21. 瞭解資料結構嗎?單向連結串列概念及特點?頭部和尾部有什麼特點?

連結串列就是帶著指標的結構體,含資料域和指向下一個節點的地址。

頭部沒有前驅節點,尾部指向NULL
增刪快於陣列,遍歷慢於陣列

22. 方法區裡存放什麼?

已經被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等等

這裡寫圖片描述

23. 怎樣判斷是否需要收集?

  1. 什麼樣的物件是垃圾?一般來說,所有指向物件的引用都已失效,不可能再有程式能呼叫到這個物件,那麼這個物件就成了垃圾,應該被回收。
    1.2 然而引用計數有一個致命問題不好解決,就是迴圈引用的問題。比如說一個迴圈連結串列,他們迴圈引用者,引用計數永遠不會為零,但是實際上程式已經不能訪問他們了,他們應該被回收。
    1.3 所以Java實際上是使用基於GC Roots的可達性分析,什麼是GC Roots?所有類的靜態變數,每個執行緒呼叫棧上的本地變數。(實際上我們程式設計時也是要從這些地方開始訪問資料),所有這些物件,以及被這些物件所指向的物件,都是活的物件。活的物件所指向的物件也是活的物件。
    1.4 所以只要在GC的時刻,讓程式暫停執行,然後從GC Roots開始分析,最後沒有被標記為活物件的物件就是垃圾了。

24. 什麼可作為GCRoot的物件?

虛擬機器棧中引用的物件。
方法區中類靜態屬性實體引用的物件。
方法區中常量引用的物件。
本地方法棧中JNI引用的物件。

25. 說說紅黑樹這個資料結構?

BST存在的主要問題是,數在插入的時候會導致樹傾斜,不同的插入順序會導致樹的高度不一樣,而樹的高度直接的影響了樹的查詢效率。理想的高度是logN,最壞的情況是所有的節點都在一條斜線上,這樣的樹的高度為N。
基於BST存在的問題,一種新的樹——平衡二叉查詢樹(Balanced BST)產生了。平衡樹在插入和刪除的時候,會通過旋轉操作將高度保持在logN。其中兩款具有代表性的平衡樹分別為AVL樹和紅黑樹。AVL樹由於實現比較複雜,而且插入和刪除效能差,在實際環境下的應用不如紅黑樹。

26. 瞭解JDK原始碼嗎?說說ArrayList和HashMap?

ArrayList實現List介面,底層是由陣列實現,隨機查詢速度快0(1),插入和刪除因為要移動陣列元素所以效率慢。

HashMap實現Map介面。底層是陣列加連結串列實現,執行緒不安全,允許儲存Null鍵值對。裝載因子0.75.

27. Hibernate和Mybatis如何比較?

  1. SQL優化方面:
    Hibernate的查詢會將表中的所有欄位查詢出來,這一點會有效能消耗。
    Mybatis的SQL是手動編寫的,所以可以按需求指定查詢的欄位。
  2. 移植性:
    Hibernate與具體資料庫的關聯只需在XML檔案中配置即可,所有的HQL語句與具體使用的資料庫無關,移植性很好。
    MyBatis專案中所有的SQL語句都是依賴所用的資料庫的,所以不同資料庫型別的支援不好。
  3. JDBC:
    Hibernate是在JDBC上進行了一次封裝。
    Mybatis是基於原生的JDBC的。Mybatis有執行速度上的優勢。
  4. 動態SQL
    Mybatis mapper xml 支援動態SQL
    Hibernate不支援
  5. 開發工作量
    Hibernate和MyBatis都有相應的程式碼生成工具。可以生成簡單基本的DAO層方法。針對高階查詢,Mybatis需要手動編寫SQL語句,以及ResultMap。而Hibernate有良好的對映機制,開發者無需關心SQL的生成與結果對映,可以更專注於業務流程。

28.說說Spring AOP?

好處: 方法增強
面向切面程式設計:如宣告式事務、日誌等功能
AOP原理: 動態代理 1.cglib 2.jdk
區別: jdk實現動態代理的前提必須要有介面, 而cglib不需要介面
如果目標物件沒有實現介面, 則預設用cglib

29.IOC呢?注入方式都有哪些?

好處: 分層解耦
解釋依賴注入。

之前程式設計師可通過new建立新例項物件,但是Spring可向容器索取使用註解:@Autowired…

30. 演算法題:一個無序陣列,其中一個數字出現的次數大於其他數字之和,求這個數字

31. 說一說hashmap,高併發出現的問題,如何改進

如果HashMap到達臨界容量需要擴容,兩個執行緒同時進行resize操作,同時開闢兩塊空間,執行緒掛起時機不當時,rehash會產生環路。
當然,還會發生,一個執行緒迭代時,另一個執行緒做插入刪除操作,造成迭代的fast-fail。
根本原因是沒有鎖機制,一個執行緒的修改會影響另一個執行緒的操作。

改用concurrentHashMap

32. 提到concurrenthashmap,細說說原理

HashTable容器在競爭激烈的併發環境下表現出效率低下的原因,是因為所有訪問HashTable的執行緒都必須競爭同一把鎖,那假如容器裡有多把鎖,每一把鎖用於鎖容器其中一部分資料,那麼當多執行緒訪問容器裡不同資料段的資料時,執行緒間就不會存在鎖競爭,從而可以有效的提高併發訪問效率,這就是ConcurrentHashMap所使用的鎖分段技術,首先將資料分成一段一段的儲存,然後給每一段資料配一把鎖,當一個執行緒佔用鎖訪問其中一個段資料的時候,其他段的資料也能被其他執行緒訪問。有些方法需要跨段,比如size()和containsValue(),它們可能需要鎖定整個表而而不僅僅是某個段,這需要按順序鎖定所有段,操作完畢後,又按順序釋放所有段的鎖。這裡“按順序”是很重要的,否則極有可能出現死鎖,在ConcurrentHashMap內部,段陣列是final的,並且其成員變數實際上也是final的,但是,僅僅是將陣列宣告為final的並不保證陣列成員也是final的,這需要實現上的保證。這可以確保不會出現死鎖,因為獲得鎖的順序是固定的。

ConcurrentHashMap是由Segment陣列結構和HashEntry陣列結構組成。Segment是一種可重入鎖ReentrantLock,在ConcurrentHashMap裡扮演鎖的角色,HashEntry則用於儲存鍵值對資料。一個ConcurrentHashMap裡包含一個Segment陣列,Segment的結構和HashMap類似,是一種陣列和連結串列結構, 一個Segment裡包含一個HashEntry陣列,每個HashEntry是一個連結串列結構的元素, 每個Segment守護者一個HashEntry數組裡的元素,當對HashEntry陣列的資料進行修改時,必須首先獲得它對應的Segment鎖。

這裡寫圖片描述

33. 鎖分段和CAS演算法

CAS: concurrent包的一種樂觀鎖

CAS的語義是“我認為V的值應該為A,如果是,那麼將V的值更新為B,否則不修改並告訴V的值實際為多少”,CAS是項樂觀鎖技術,當多個執行緒嘗試使用CAS同時更新同一個變數時,只有其中一個執行緒能更新變數的值,而其它執行緒都失敗,失敗的執行緒並不會被掛起,而是被告知這次競爭中失敗,並可以再次嘗試。CAS有3個運算元,記憶體值V,舊的預期值A,要修改的新值B。當且僅當預期值A和記憶體值V相同時,將記憶體值V修改為B,否則什麼都不做

34. 說說快排,時間複雜度推算一下

35. MySQL有哪些型別? int佔多少位?

4個位元組 32位

36.為什麼索引能提升效率?

DB在執行一條Sql語句的時候,預設的方式是根據搜尋條件進行全表掃描,遇到匹配條件的就加入搜尋結果集合。如果我們對某一欄位增加索引,查詢時就會先去索引列表中一次定位到特定值的行數,大大減少遍歷匹配的行數,所以能明顯增加查詢的速度。

37. 什麼情況下索引失效?為什麼失效?

a索引 b索引, 只用到了a索引

1.如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什麼儘量少用or的原因)要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引

2.對於多列索引,不是使用的第一部分,則不會使用索引
where a=3 and c=5… 這種情況下b就是斷點,a發揮了效果,c沒有效果

3.like查詢以%開頭

4.如果列型別是字串,那一定要在條件中將資料使用引號引用起來,否則不使用索引

5.如果mysql估計使用全表掃描要比使用索引快,則不使用索引

38. like%..%為什麼會掃描全表?遵循什麼原則?

因為這樣是全模糊查詢, 無法使用索引, 所以會掃描全表
索引的最左原則, 因為索引沒生效

39. 執行緒池知道嗎?(執行緒池思想、分類、引數)

分類:
newFixedThreadPool: 建立一個指定工作執行緒數量的執行緒池。
newCachedThreadPool: 建立一個可快取的執行緒池。
newSingleThreadExecutor: 建立一個單執行緒化的Executor,即只建立唯一的工作者執行緒來執行任務,如果這個執行緒異常結束,會有另一個取代它,保證順序執行
newScheduleThreadPool: 建立一個定長的執行緒池,而且支援定時的以及週期性的任務執行
引數:
corePoolSize: 核心執行緒數
maxPoolSize: 最大執行緒數
keepAliveTime: 非核心執行緒閒置時的超時時長
allowCoreThreadTimeout: 設定該時長同樣會作用於核心執行緒
queueCapacity: 佇列容量

40.Set如何保證不重複?

hashset的底層是hashmap實現的
底層實際將將該元素作為key放入HashMap。
HashSet中的Value是一個固定值PRESENT。 所以修改不修改無所謂。

41. synchronized實現原理、範圍、如何用?

原理:
從上面可以看出,同步程式碼塊是使用monitorenter和monitorexit指令實現的,同步方法(在這看不出來需要看JVM底層實現)依靠的是方法修飾符上的ACC_SYNCHRONIZED實現。
同步程式碼塊:monitorenter指令插入到同步程式碼塊的開始位置,monitorexit指令插入到同步程式碼塊的結束位置,JVM需要保證每一個monitorenter都有一個monitorexit與之相對應。任何物件都有一個monitor與之相關聯,當且一個monitor被持有之後,他將處於鎖定狀態。執行緒執行到monitorenter指令時,將會嘗試獲取物件所對應的monitor所有權,即嘗試獲取物件的鎖;
同步方法:synchronized方法則會被翻譯成普通的方法呼叫和返回指令如:invokevirtual、areturn指令,在VM位元組碼層面並沒有任何特別的指令來實現被synchronized修飾的方法,而是在Class檔案的方法表中將該方法的access_flags欄位中的synchronized標誌位置1,表示該方法是同步方法並使用呼叫該方法的物件或該方法所屬的Class在JVM的內部物件表示Klass做為鎖物件。

synchronized是Java中的關鍵字,是一種同步鎖。它修飾的物件有以下幾種:
1. 修飾一個程式碼塊,被修飾的程式碼塊稱為同步語句塊,其作用的範圍是大括號{}括起來的程式碼,作用的物件是呼叫這個程式碼塊的物件;
2. 修飾一個方法,被修飾的方法稱為同步方法,其作用的範圍是整個方法,作用的物件是呼叫這個方法的物件;
3. 修改一個靜態的方法,其作用的範圍是整個靜態方法,作用的物件是這個類的所有物件;
4. 修改一個類,其作用的範圍是synchronized後面括號括起來的部分,作用主的物件是這個類的所有物件。

42. hibernate主鍵生成策略

  1. increment: 不依賴於底層的資料庫, 不適用於叢集、同一時段大量使用者併發訪問的系統…由hibernate管理主鍵,自動以遞增的方式生成識別符號
  2. UUID: 所以使用於所有資料庫。 佔用空間
  3. sequence:
  4. identity: 使用較為方便,但由於依賴於資料庫,所以不便於在不同的資料庫之間移植程式。由底層資料庫生成識別符號。identity是由資料庫自己生成的
  5. native: 靈活性高,便於程式移植,專案中如果用到多個數據庫時,可以使用這種方式。

44. 快速排序思想,給一組數,排一遍

採用了分治的策略

44. 什麼叫執行緒安全? 如何保證執行緒安全

執行緒安全:
就是多執行緒訪問時,採用了加鎖機制,當一個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。

執行緒不安全:
就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料是髒資料

45. 1000個餅乾,一個有毒,老鼠吃完一週內會死,使用最少的老鼠在一週內找到有毒餅乾

根據2^10=1024,所以10個老鼠可以確定1000個瓶子具體哪個瓶子有毒。具體實現跟3個老鼠確定8個瓶子原理一樣。
000=0
001=1
010=2
011=3
100=4
101=5
110=6
111=7
一位表示一個老鼠,0-7表示8個瓶子。也就是分別將1、3、5、7號瓶子的藥混起來給老鼠1吃,2、3、6、7號瓶子的藥混起來給老鼠2吃,4、5、6、7號瓶子的藥混起來給老鼠3吃,哪個老鼠死了,相應的位標為1。如老鼠1死了、老鼠2沒死、老鼠3死了,那麼就是101=5號瓶子有毒。同樣道理10個老鼠可以確定1000個瓶子

46. 100個蘿蔔,一個兔子每次抱50根,從相距50米的起點搬到終點,每走一米吃一根,最多剩多少根?

解答: 因為 它最多搬50根胡蘿蔔,而每走1米就要吃掉一根蘿蔔。
那麼它第一次搬50根胡蘿蔔到49米處,然後返回50米處將剩下的50根胡蘿蔔搬到49米處,這中間去->回->去,一共會吃掉3根胡蘿蔔;由於一次它最多搬50根胡蘿蔔,所以只有當剩下的胡蘿蔔數量小於等於50時,它才不用回去,直接搬到家中。那麼我們可以假設 搬了x米後,它不用回返:100-3x <=50 (x為正整數) 解得 x=17所以就可以得到 結果了 100 - 3*17 -(50-17)=16(根)小兔子最多能把16根胡蘿蔔搬到家裡。

47. Java中多型是怎麼實現的

在Java中有兩種形式可以實現多型。繼承和介面。

48. Java中的幾種鎖

公平鎖/非公平鎖
可重入鎖: 可重入鎖又名遞迴鎖,是指在同一個執行緒在外層方法獲取鎖的時候,在進入內層方法會自動獲取鎖。
獨享鎖/共享鎖
互斥鎖/讀寫鎖
樂觀鎖/悲觀鎖: 悲觀鎖適合寫操作非常多的場景,樂觀鎖適合讀操作非常多的場景,不加鎖會帶來大量的效能提升。
分段鎖
偏向鎖/輕量級鎖/重量級鎖
自旋鎖

49. 資料庫隔離級別 髒讀 幻讀 ACID mysql的隔離級別

Read uncommitted
Read committed
Repeatable read
Serializable 序列化

原子性:
是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾

一致性:
是指事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。

隔離性:
是當多個使用者併發訪問資料庫時,比如操作同一張表時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。

永續性:
是指一個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。

髒讀:
是指在一個事務處理過程裡讀取了另一個未提交的事務中的資料

不可重複讀:
是指在對於資料庫中的某個資料,一個事務範圍內多次查詢卻返回了不同的資料值,這是由於在查詢間隔,被另一個事務修改並提交了。

幻讀:
是事務非獨立執行時發生的一種現象。例如事務T1對一個表中所有的行的某個資料項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行資料項,而這個資料項的數值還是為“1”並且提交給資料庫。而操作事務T1的使用者如果再檢視剛剛修改的資料,會發現還有一行沒有修改,其實這行是從事務T2中新增的,就好像產生幻覺一樣,這就是發生了幻讀。

50. Linux檢視網路 記憶體 日誌命令

來配置並檢視網路介面的配置情況: ifconfig
檢視程序: ps-ef|grep
所有監聽埠及對應的程序: netstat -anp
top: 相當於工作管理員
free: 檢視記憶體
tail cat head: 檢視日誌

51. spring中有哪些模組

Spring框架的七大模組

  1. Spring Core:
    Core封裝包是框架的最基礎部分,提供IOC和依賴注入特性。這裡的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程式性單例模式的需要,並真正地允許你從程式邏輯中分離出依賴關係和配置。
  2. Spring Context:
    構建於Core封裝包基礎上的 Context封裝包,提供了一種框架式的物件訪問方法,有些象JNDI註冊器。Context封裝包的特性得自於Beans封裝包,並添加了對國際化(I18N)的支援(例如資源繫結),事件傳播,資源裝載的方式和Context的透明建立,比如說通過Servlet容器。

  3. Spring DAO:
    DAO (Data Access Object)提供了JDBC的抽象層,它可消除冗長的JDBC編碼和解析資料庫廠商特有的錯誤程式碼。 並且,JDBC封裝包還提供了一種比程式設計性更好的宣告性事務管理方法,不僅僅是實現了特定介面,而且對所有的POJOs(plain old Java objects)都適用。

  4. Spring ORM:
    ORM 封裝包提供了常用的“物件/關係”對映APIs的整合層。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封裝包,可以混合使用所有Spring提供的特性進行“物件/關係”對映,如前邊提到的簡單宣告性事務管理。

  5. Spring AOP:
    Spring的 AOP 封裝包提供了符合AOP Alliance規範的面向方面的程式設計實現,讓你可以定義,例如方法攔截器(method-interceptors)和切點(pointcuts),從邏輯上講,從而減弱程式碼的功能耦合,清晰的被分離開。而且,利用source-level的元資料功能,還可以將各種行為資訊合併到你的程式碼中。

  6. Spring Web:
    Spring中的 Web 包提供了基礎的針對Web開發的整合特性,例如多方檔案上傳,利用Servlet listeners進行IOC容器初始化和針對Web的ApplicationContext。當與WebWork或Struts一起使用Spring時,這個包使Spring可與其他框架結合。

  7. Spring Web MVC:
    Spring中的MVC封裝包提供了Web應用的Model-View-Controller(MVC)實現。Spring的MVC框架並不是僅僅提供一種傳統的實現,它提供了一種清晰的分離模型,在領域模型程式碼和Web Form之間。並且,還可以藉助Spring框架的其他特性。

52. equals和hashcode的關係

兩個obj,如果equals()相等,hashCode()一定相等。
兩個obj,如果hashCode()相等,equals()不一定相等(Hash雜湊值有衝突的情況,雖然概率很低)。

53. 瀏覽器中輸入URL之後的過程 包括負載均衡 快取等

  1. DNS域名解析
  2. 建立TCP連線
  3. 發起HTTP請求
  4. 接受響應結果
  5. 瀏覽器解析html
  6. 瀏覽器佈局渲染

但是,對於大型網站存在多個主機站點,往往不會直接返回請求頁面,而是重定向。返回的狀態碼就不是200 OK,而是301,302以3開頭的重定向碼,瀏覽器在獲取了重定向響應後,在響應報文中Location項找到重定向地址,瀏覽器重新第一步訪問即可。

補充一點的就是,重定向是為了負載均衡或者匯入流量,提高SEO排名。利用一個前端伺服器接受請求,然後負載到不同的主機上,可以大大提高站點的業務併發處理能力;重定向也可將多個域名的訪問,集中到一個站點;由於baidu.com,www.baidu.com會被搜尋引擎認為是兩個網站,照成每個的連結數都會減少從而降低排名,永久重定向會將兩個地址關聯起來,搜尋引擎會認為是同一個網站,從而提高排名。

54. 加密解密瞭解麼?幾種演算法,講一下你瞭解的

常用的摘要演算法有MD5,SHA1。摘要演算法是一個不可逆過程,就是無論多大資料,經過演算法運算後都是生成固定長度的資料,一般結果使用16進位制進行顯示。
MD5和SHA1的區別:MD5結果是128位摘要,SHa1是160位摘要。那麼MD5的速度更快,而SHA1的強度更高。

常用的對稱加密演算法有:AES和DES.
非對稱加密(RSA)

55. Mysql的資料庫引擎,區別特點

兩者最大的差別就是是否支援事務

MyISAM:如果執行大量的SELECT,MyISAM是更好的選擇。(因為沒有支援行級鎖),在增刪的時候需要鎖定整個表格,效率會低一些。相關的是innodb支援行級鎖,刪除插入的時候只需要鎖定改行就行,效率較高
InnoDB:如果你的資料執行大量的INSERT或UPDATE,出於效能方面的考慮,應該使用InnoDB表。DELETE 從效能上InnoDB更優,但DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除,在innodb上如果要清空儲存有大量資料的表,最好使用truncate table這個命令。

56. 對高負載, 高併發有了解麼

  1. 單臺伺服器
  2. 一臺演變為兩臺伺服器, 一臺web一臺db
  3. 增加memcached服務
  4. 增加Web伺服器並做MySQL主從
  5. 增加MySQL讀寫分離
  6. 避免單點引入負載均衡環境
  7. 繼續擴充服務規模
  8. 引入NoSQL環境: Redis

57. Hashmap為什麼大小是2的冪次

h&(length-1)取模得出的index分佈均勻並且碰撞機率低
所以說,當陣列長度為2的n次冪的時候,不同的key算得得index相同的機率較小,那麼資料在陣列上分佈就比較均勻,也就是說碰撞的機率小,相對的,查詢的時候就不用遍歷某個位置上的連結串列,這樣查詢效率也就較高了。

58. 堆排序的原理

59. 抽象工廠和工廠方法模式的區別

  1. 抽象工程關鍵在於產品之間的抽象關係,所以至少要兩個產品;工廠方法在於生成產品,不關注產品間的關係,所以可以只生成一個產品。
  2. 抽象工廠中客戶端把產品的抽象關係理清楚,在最終使用的時候,一般使用客戶端(和其介面),產品之間的關係是被封裝固定的;而工廠方法是在最終使用的時候,使用產品本身(和其介面)。
  3. 抽象工廠的工廠是類;工廠方法的工廠是方法。

60. 執行緒池的使用時的注意事項

  1. 死鎖
  2. 系統資源不足: 如果執行緒池中的執行緒數目非常多,這些執行緒會消耗包括記憶體和其他系統資源在內的大量資源,從而嚴重影響系統性能。
  3. 併發錯誤: 執行緒池的工作佇列依靠wait()和notify()方法來使工作執行緒及時取得任務,但這兩個方法難以使用。如果程式碼錯誤,可能會丟失通知,導致工作執行緒一直保持空閒的狀態,無視工作佇列中需要處理的任務。因為最好使用一些比較成熟的執行緒池。
  4. 執行緒洩漏: 異常或錯誤沒有被捕獲,那麼這個工作執行緒就異常終止,使執行緒池永久丟失了一個執行緒
  5. 任務過載: 當工作執行緒佇列中有大量排隊等待執行的任務時,這些任務本身可能會消耗太多的系統資源和引起資源缺乏。

61. Spring中autowire和resourse關鍵字的區別

  1. @Resource預設是按照名稱來裝配注入的,只有當找不到與名稱匹配的bean才會按照型別來裝配注入;

  2. @Autowired預設是按照型別裝配注入的,如果想按照名稱來轉配注入,則需要結合@Qualifier一起使用;

  3. @Resource註解是又J2EE提供,而@Autowired是由Spring提供,故減少系統對spring的依賴建議使用

62. 訊息隊列了解麼

目的是為了非同步處理, 能夠實現非同步解耦
例子: app的訊息推送, 將資訊放到mq中, 執行緒去拿; 註冊郵件通知

使用場景的話,舉個例子:
假設使用者在你的軟體中註冊,服務端收到使用者的註冊請求後,它會做這些操作:
校驗使用者名稱等資訊,如果沒問題會在資料庫中新增一個使用者記錄
如果是用郵箱註冊會給你傳送一封註冊成功的郵件,手機註冊則會發送一條簡訊
分析使用者的個人資訊,以便將來向他推薦一些志同道合的人,或向那些人推薦他
傳送給使用者一個包含操作指南的系統通知
等等……
但是對於使用者來說,註冊功能實際只需要第一步,只要服務端將他的賬戶資訊存到資料庫中他便可以登入上去做他想做的事情了。至於其他的事情,非要在這一次請求中全部完成麼?值得使用者浪費時間等你處理這些對他來說無關緊要的事情麼?所以實際當第一步做完後,服務端就可以把其他的操作放入對應的訊息佇列中然後馬上返回使用者結果,由訊息佇列非同步的進行這些操作。

63. 分散式瞭解麼

64. 介紹redis和mysql的區別

我們知道,mysql是持久化儲存,存放在磁盤裡面,檢索的話,會涉及到一定的IO,為了解決這個瓶頸,於是出現了快取,比如現在用的最多的 memcached(簡稱mc)。首先,使用者訪問mc,如果未命中,就去訪問mysql,之後像記憶體和硬碟一樣,把資料複製到mc一部分。

  redis和mc都是快取,並且都是駐留在記憶體中執行的,這大大提升了高資料量web訪問的訪問速度。然而mc只是提供了簡單的資料結構,比如 string儲存;redis卻提供了大量的資料結構,比如string、list、set、hashset、sorted set這些,這使得使用者方便了好多,畢竟封裝了一層實用的功能,同時實現了同樣的效果,當然用redis而慢慢捨棄mc。

  記憶體和硬碟的關係,硬碟放置主體資料用於持久化儲存,而記憶體則是當前執行的那部分資料,CPU訪問記憶體而不是磁碟,這大大提升了執行的速度,當然這是基於程式的區域性化訪問原理。

  推理到redis+mysql,它是記憶體+磁碟關係的一個對映,mysql放在磁碟,redis放在記憶體,這樣的話,web應用每次只訪問redis,如果沒有找到的資料,才去訪問Mysql。

65. Redis的應用場景

快取服務, 處理高併發場景; 減少對資料庫的訪問

  1. 在主頁中顯示最新的專案列表。
  2. 排行榜及相關問題。
  3. 計數。

66. Hashmap中jdk1.8之後做了哪些優化

加入紅黑樹

比方說惡意的程式,如果它知道我們用的是雜湊演算法,它可能會發送大量的請求,導致產生嚴重的雜湊碰撞。然後不停的訪問這些 key就能顯著的影響伺服器的效能,這樣就形成了一次拒絕服務攻擊(DoS)。JDK 8中從O(n)到O(logn)的飛躍,可以有效地防止類似的攻擊,同時也讓HashMap效能的可預測性稍微增強了一些。

67. 支付寶轉賬,是如何實現,幾個小時通知轉賬成功的(面試官想讓回答長連線,答主一直沒get到點)

長連線: 長連線的話,那麼這麼多次HTTP請求(這些請求包括請求網頁內容,CSS檔案,JS檔案,圖片等等),其實使用的都是一個TCP連線,很顯然是可以節省很多消耗的。

長短輪詢: 對於客戶端來說,不管是長輪詢還是短輪詢,客戶端的動作都是一樣的,就是不停的去請求,不同的是服務端,短輪詢情況下服務端每次請求不管有沒有變化都會立即返回結果,而長輪詢情況下,如果有變化才會立即返回結果,而沒有變化的話,則不會再立即給客戶端返回結果,直到超時為止。

第一個區別是決定的方式,一個TCP連線是否為長連線,是通過設定HTTP的Connection Header來決定的,而且是需要兩邊都設定才有效。而一種輪詢方式是否為長輪詢,是根據服務端的處理方式來決定的,與客戶端沒有關係。

第二個區別就是實現的方式,連線的長短是通過協議來規定和實現的。而輪詢的長短,是伺服器通過程式設計的方式手動掛起請求來實現的。

68. 對Java的面向物件的理解

java是一門純粹的面向物件的語言。面向物件這種程式設計模式它將現實世界中的一切事物都看作是物件,例如,一個人是一個物件,汽車、飛機、小鳥等等,都是物件;它強調從物件出發,以物件為中心用人類的思維方式來認識和思考問題。每個物件都具有各自的狀態特徵(也可以稱為屬性)及行為特徵(方法),java就是通過物件之間行為的互動來解決問題的。

   類是面向物件中一個重要的概念。類是具有相同屬性和行為特徵的物件的抽象,類是物件的概念模型,物件是類的一個例項,通過類來建立物件,同一類的所有物件具有相同的屬性和行為特徵。類具有三個基本特徵:封裝、繼承、多型。

   封裝就是將物件的屬性和行為特徵包裝到一個程式單元(即類)中,把實現細節隱藏起來,通過公用的方法來展現類對外提供的功能,提高了類的內聚性,降低了物件之間的耦合性。

   繼承是對原有類的拓展,舉例說明:我現在有一個Person類,但是我想要一個學生物件,他擁有Person類的所有屬性和方法,此外他還有學號屬性,及上課、寫作業等一些方法,我可以建立一個Student類,但是我不想重複寫Person類中已經有了的屬性和方法,那麼,此時我就可以用Student類繼承Person類,Student類就擁有了Person類裡的屬性和方法了,我只需要在Student類裡新增另外的新的屬性和方法就可以了。Person類就成為父類,Student類就稱為子類。父類和子類之間是一般和特殊的關係,子類是一種特殊的父類。此外,子類還可以通過重寫來改變父類中的方法,重寫可以改變方法的返回型別和訪問許可權,不能改變方法名稱。

 多型是建立在繼承的基礎上的,是指子類型別的物件可以賦值給父類型別的引用變數,但執行時仍表現子類的行為特徵。也就是說,同一種類型的物件執行同一個方法時可以表現出不同的行為特徵。

69. Java的finalize,finally,final三個關鍵字的區別和應用場景

final

當這個關鍵字修飾一個類時,意味著他不能派生出新的子類,也就是說不能被繼承,因此一個類不能被同時宣告為abstract和final。當final修飾變數或者方法時,可以保證他們在使用中不會被改變。被宣告為final的變數必須在初始化時給定初值,以後在使用時只能被引用而不能被修改。同樣,當final修飾一個方法時,這個方法不能被過載。

finally

異常處理時提供finally來執行任何清楚操作。如果丟擲一個異常,那麼相匹配的catch子句就會被執行,然後控制就會轉入finally塊。

finalize

方法名。finalize方法在垃圾回收器執行記憶體物件清理時會呼叫finalize()方法進行前期的清理工作。這個方法是由垃圾收集器在確定這個物件沒有被引用時對這個物件呼叫的。它是在 Object 類中定義的,因此所有的類都繼承了它。

70. 千萬使用者搶購,如何處理高併發,並且有一個連結,指向前一天搶購成功的使用者,如何設計這個系統和資料庫

71. 怎麼解決session一致性快取的問題

將session放在redis快取中, 這樣請求過來ngix中, 會先去redis中找session請求

72. 講一下穩定的排序演算法和不穩定的排序演算法

通俗地講就是能保證排序前2個相等的數其在序列的前後位置順序和排序後它們兩個的前後位置順序相同。在簡單形式化一下,如果Ai = Aj, Ai原來在位置前,排序後Ai還是要在Aj位置前。

其次,說一下穩定性的好處。排序演算法如果是穩定的,那麼從一個鍵上排序,然後再從另一個鍵上排序,第一個鍵排序的結果可以為第二個鍵排序所用。

72. 動態代理的實現方式和區別

73. 死鎖是什麼呢? 怎麼解決死鎖

74. 為什麼負載均衡? 怎麼實現負載均衡

ngix

如果你發現你的Web站點負載量非常大時,應當考慮使用負載均衡技術來將負載平均分攤到多個內部伺服器上。
負載均衡可以將工作任務分攤到多個處理單元,從而提高併發處理能力。
將大量的併發請求分擔到多個處理節點。由於單個處理節點的故障不影響整個服務,負載均衡叢集同時也實現了高可用性。

75. 資料庫掛了怎麼辦?除了熱備份還有什麼方法

資料庫掛的原因? 場景分析: 高併發原因的話重啟也沒用.

76. 演算法:找出兩個陣列相等的數,不能用其他資料結構

後來發現有一個 O(n)演算法。因為兩個陣列都是排好序的。所以只要一次遍歷就行了。首先設兩個下標,分別初始化為兩個陣列的起始地址,依次向前推進 。推進的規則是比較兩個陣列中的數字,小的那個陣列的下標向前推進一步,直到任何一個數組的下標到達陣列末尾時,如果這時還沒碰到相同的數字,說明陣列中沒有相同的數字。

77. 演算法:給定一個數字,一個數組,找出陣列中相加等於這兩個數的和,不能用資料結構

首先也是要對陣列進行排序(時間複雜度為O(n*log(n))),然後再已排序的陣列中,令i=0,j=n-1,判斷arr[i]+arr[j]是否等於target,等於則結束,如果小於target,則i=i+1;如果大於target,則j=j-1,這樣查詢符合條件的兩個元素的過程只需要遍歷陣列一次,因此查詢的時間複雜度降低到O(n),總的時間複雜度還是O(n*log(n))。

78. 介紹分散式事務

簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分佈在不同的伺服器上,且屬於不同的應用,分散式事務需要保證這些小操作要麼全部成功,要麼全部失敗。本質上來說,分散式事務就是為了保證不同資料庫的資料一致性。

解決方案:
1. 基於XA協議的兩階段提交
2. 訊息事務+最終一致性
3. TCC程式設計模式

79. notify方法為什麼喚醒的是等待佇列中的任意一個?如何實現的

原始碼實現的…

80. Synchronized和ReentrantLock的區別

Synchronized關鍵詞屬於內建特性: 不需要手動釋放鎖
ReentrantLock是實現類: 需要手動釋放鎖, 可能導致死鎖

如果多個執行緒都只是進行讀操作,所以當一個執行緒在進行讀操作時,其他執行緒只能等待無法進行讀操作。
因此就需要一種機制來使得多個執行緒都只是進行讀操作時,執行緒之間不會發生衝突,通過Lock就可以辦到。

81. 可重入鎖的含義?Synchronized是可重入鎖嗎?如果不是,將產生哪些危害?

Synchronized和ReentrantLock都是可重入鎖
如果不是, 可能會產生死鎖

82. HTTP1.0,2.0區別,常用的狀態碼的含義(1XX,2XX,3XX)?

  1. 長連線: HTTP 1.0需要使用keep-alive引數來告知伺服器端要建立一個長連線,而HTTP1.1預設支援長連線。
  2. 節約頻寬: HTTP 1.1支援只發送header資訊(不帶任何body資訊),如果伺服器認為客戶端有許可權請求伺服器,則返回100,否則返回401。客戶端如果接受到100,才開始把請求body傳送到伺服器。
  3. host域: 現在可以web server例如tomat,設定虛擬站點是非常常見的,也即是說,web server上的多個虛擬站點可以共享同一個ip和埠。HTTP1.0是沒有host域的,HTTP1.1才支援這個引數。
  4. 多路複用: HTTP2.0使用了多路複用的技術,做到同一個連線併發處理多個請求,而且併發請求的數量比HTTP1.1大了好幾個數量級。
  5. 資料壓縮: HTTP1.1不支援header資料的壓縮,HTTP2.0使用HPACK演算法對header的資料進行壓縮,這樣資料體積小了,在網路上傳輸就會更快。

200 OK
301 永久重定向
302 臨時重定向
400 Bad Request
403 Forbidden
404 Not Found
500 Internal Server Error
501 未實現
502 網關出錯

83. HTTP協議的理解(短連線、長連線)?如何理解訪問淘寶網站時計算機網路發生的操作?

84. 將n個無序數字,拼接成一個最大的數字(字串表示即可),要求時間複雜度O(N),空間複雜度O(1)舉例:123,54,10,9—->95412310

85. MVC模式理解?優缺點?

MVC的優點
1. 低耦合性: 檢視層和業務層分離,這樣就允許更改檢視層程式碼而不用重新編譯模型和控制器程式碼
2. 高重用性和可適用性
3. 可維護性

缺點
不適合小型,中等規模的應用程式

86. 如何理解Struts框架以及Struts2框架?

struts1的缺陷:
(1).只支援JSP作為表現層技術,不能與Velocity,FreeMarker等技術整合
(2).與Servlet API嚴重耦合,難於測試
一個exute有四個引數ActionMapping、ActionForm、HttpServletRequest和HttpServletResponse,初始化困難.
(3).侵入式設計,嚴重依賴於Struts1API,如如ActionMapping、ActionForm和ActionForward類.一旦系統需要重構時,這些類完全沒有利用價值,導致較低的程式碼複用.

Struts2是一種基於MVC的Web應用框架
控制器——FilterDispatcher
動作——Action
檢視——Result

87. mysql中常見的資料型別,各自的範圍,int(11)中的11的含義

88.ArrayList如何快速排序

使用Collections.sort()傳入ArrayList,會採用預設的方式進行排序(字典序)
使用Collections.sort()傳入ArrayList和自己實現Commparator介面的類的物件,實現自定義排序
使用List.sort()傳入自己實現Commparator介面的類的物件,實現自定義排序
Comparator返回值在jdk1.7、jdk1.8裡必須是一對相反數,如1和-1,不能是1和0.因為1.7的排序演算法採用timsort,對返回值有嚴格要求

89. 對稱加密和非對稱加密區別

90. HTTP 301 302區別 501 502區別

91. threadlocal底層實現

hashmap
首先,在每個執行緒Thread內部有一個ThreadLocal.ThreadLocalMap型別的成員變數threadLocals,這個threadLocals就是用來儲存實際的變數副本的,鍵值為當前ThreadLocal變數,value為變數副本(即T型別的變數)。

最常見的ThreadLocal使用場景為 用來解決 資料庫連線、Session管理等。

92. 兩個事務同時操作 如何保證資料一致性

93. 手寫演算法 求兩個字串的最長公共子串

94. 什麼會影響程序的記憶體

95. 資料庫事務特性

96. 如何java實現一個連結串列

97. 一個很長的字串(不能放入記憶體)如何找出重複字元

98. SQL注入,如何防範,預編譯原理

SQL語句在程式執行前已經進行了預編譯,在程式執行時第一次操作資料庫之前,SQL語句已經被資料庫分析,編譯和優化,對應的執行計劃也會快取下來並允許資料庫已引數化的形式進行查詢,當執行時動態地把引數傳給PreprareStatement時,即使引數裡有敏感字元如 or ‘1=1’也資料庫會作為一個引數一個欄位的屬性值來處理而不會作為一個SQL指令。

PreparedStatement可以儘可能的提高訪問資料庫的效能,我們都知道資料庫在處理SQL語句時都有一個預編譯的過程,而預編譯物件就是把一些格式固定的SQL編譯後,存放在記憶體池中即資料庫緩衝池,當我們再次執行相同的SQL語句時就不需要預編譯的過程了,只需DBMS執行SQL語句。

所以當你需要執行Statement物件多次的時候,PreparedStatement物件將會大大降低執行時間,特別是的大型的資料庫中,它可以有效的也加快了訪問資料庫的速度。

99. Spring事務如何實現,底層做了什麼

Spring的事務管理機制實現的原理,就是通過這樣一個動態代理對所有需要事務管理的Bean進行載入,並根據配置在invoke方法中對當前呼叫的 方法名進行判定,並在method.invoke方法前後為其加上合適的事務管理程式碼,這樣就實現了Spring式的事務管理。Spring中的AOP實 現更為複雜和靈活,不過基本原理是一致的。

100. MySQL是如何解決幻讀問題的

Repeatable Read (RR)
快照讀忽略,本文不考慮。
針對當前讀,RR隔離級別保證對讀取到的記錄加鎖 (記錄鎖),同時保證對讀取的範圍加鎖,新的滿足查詢條件的記錄不能夠插入 (間隙鎖),不存在幻讀現象。

間隙鎖主要用來防止幻讀,用在repeatable-read隔離級別下,指的是當對資料進行條件,範圍檢索時,對其範圍內也許並存在的值進行加鎖!當查詢的索引含有唯一屬性(唯一索引,主鍵索引)時,Innodb儲存引擎會對next-key lock進行優化,將其降為record lock,即僅鎖住索引本身,而不是範圍!若是普通輔助索引,則會使用傳統的next-key lock進行範圍鎖定!

101. 樂觀鎖和悲觀鎖的區別和應用場景

102. cglib如何實現動態