Java中常見面試題一(中等)

CodingDGSun 2022-01-07 22:52:30 阅读数:75

java 中常 中等

Java中常見面試題一(中等)

SQL語句優化有哪些?數據庫的優化怎樣優化?
  • 對查詢進行優化,應盡量避免全錶掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
  • 應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放弃使用索引而進行全錶掃描。
  • 應盡量避免在 where 子句中使用!=或<>操作符,否則引擎將放弃使用索引而進行全錶掃描。
樂觀鎖和悲觀鎖的解釋及其應用場景
  • 悲觀鎖(Pessimistic Lock),顧名思義,就是很悲觀,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關系型數據庫裏邊就用到了很多這種鎖機制,比如行鎖,錶鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
  • 樂觀鎖(Optimistic Lock),顧名思義,就是很樂觀,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣可以提高吞吐量,像數據庫如果提供類似於write_condition機制的其實都是提供的樂觀鎖。
  • 使用場景
    兩種鎖各有優缺點,不可認為一種好於另一種,像樂觀鎖適用於寫比較少的情况下,即沖突真的很少發生的時候,這樣可以省去了鎖的開銷,加大了系統的整個吞吐量。但如果經常產生沖突,上層應用會不斷的進行retry,這樣反倒是降低了性能,所以這種情况下用悲觀鎖就比較合適。
過濾器和攔截器區別和項目中如何應用
  • 過濾器:在目標資源之前進行的操作,過濾所有的內容,比如 action、servlet、jsp、html
  • 攔截器:在目標資源之前進行的操作,不能攔截所有的內容,攔截 action,不能攔截 jsp,不能攔截 html
  • 攔截器和過濾器之間有很多相同之處,但是兩者之間存在根本的差別。其主要區別為以下幾點:
    (1)攔截器是基於 JAVA 反射機制的,而過濾器是基於函數回調的。
    (2)攔截器不依賴於 Servlet 容器,而過濾器依賴於 Servlet 容器。
    (3)攔截器只能對 Action 請求起作用,而過濾器可以對幾乎所有的請求起作用。
    (4)攔截器可以訪問 Action 上下文、值棧裏的對象,而過濾器不能。
    (5)在 Action 的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
GC回收機制的原理
  • 用戶Java程序運行過程中,Java虛擬機提供了另外一個系統級的線程,專門負責回收不再被使用的對象占用的內存,這一過程稱為垃圾回收。
  • 垃圾回收需要對堆內存中的對象進行標記,並對堆內存進行整理。這一過程的某些階段需要暫時終止用戶Java線程,等回收工作完成後再恢複執行。因此,頻繁地觸發虛擬機垃圾回收操作的行為會影響程序的運行效率。
  • 那麼什麼情况下會頻繁地出發垃圾回收操作呢,比如:堆內存設置過小,再比如:程序頻繁地分配大型局部對象數組。
ConcurrentHashMap原理
  • JDK1.7(Segment數組結構和HashEntry數組結構)
  • JDK 1.7 ConcurrentHashMap是由Segment數組結構和HashEntry數組結構組成。 每個Segment都對應一個Hash錶,且都有獨立的鎖,所以這樣就可以每個線程訪問一個Segment,就可以並行訪問了,從而提高了效率。 這就是鎖分段。
    (1)首先將數據分為一段一段的存儲,然後給每一段數據配一把鎖,當一個線程占用鎖訪問其中一個段數據時,其他段的數據也能被其他線程訪問。
    (2)Segment 實現了 ReentrantLock,所以 Segment 是一種可重入鎖,扮演鎖的角色。HashEntry 用於存儲鍵值對數據。
    (3)一個ConcurrentHashMap裏面包含多個Segment數組。 Segment的結構和HashMap類似,是一種數組和鏈錶結構。 一個Segment包含一個HashEntry數組,每個HashEntry是一個鏈錶結構的元素。 每個Segment守護一個HashEntry數組裏的元素,當對HashEntry數組的數據進行修改時,首先獲得對應的Segment的鎖。
    (4)並行度(默認16)
    concurrencyLevel:並行級別、並發數、Segment 數,怎麼翻譯不重要,理解它。 默認是 16,也就是說 ConcurrentHashMap有16個Segments,最多可以同時支持 16 個線程並發寫。
  • JDK1.8(數組+鏈錶+紅黑樹)
    (1)ConcurrentHashMap取消了Segment分段鎖,采用CAS和synchronized來保證並發安全。
    (2)數據結構跟HashMap1。8的結構類似,數組+鏈錶/紅黑樹。
    (3)jdk1.8在鏈錶長度超過一定閥值(8)時,將鏈錶(尋址時間複雜度為O(N))轉換為紅黑樹(尋址時間複雜度為O(log(N)))
    (4)synchronized只鎖定當前鏈錶或紅黑樹的首節點,這樣只要hash不沖突,就不會產生並發,效率又提昇N倍。
版权声明:本文为[CodingDGSun]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201072252295517.html