1. 程式人生 > 實用技巧 >面試知識點準備

面試知識點準備

面試知識點準備

容器

常見集合容器底層實現原理

  • interface Collection
    • interface Set
      • interface SortedSet
        • class TreeSet 基於紅黑樹,有序,查詢效率低
      • class HashSet 基於雜湊表,無序,查詢效率高
      • class LinkedHashSet 基於雙向連結串列,有序,查詢效率高
    • interface List
      • class ArrayList 基於動態陣列,支援隨機訪問
      • class Vector 與ArrayList類似,但是執行緒安全
      • class LinkedList 基於雙向連結串列,順序訪問,可快速增刪元素.可用作棧,佇列和雙向佇列
    • interface Queue
      • class LinkedList 可用作雙向佇列
      • class PriorityQueue 基於堆,可以實現優先佇列
  • interface Map
    • interface SortedMap
      • class TreeMap 基於紅黑樹
    • class HashMap 基於雜湊表,JDK8後變為陣列+連結串列+紅黑樹
    • class HashTable 和HashMap類似,但是執行緒安全
    • class LinkedHashMap 基於雙向連結串列

HashMap與HashTable

  1. HashMap是非執行緒安全的,HashTable是執行緒安全的.
  2. HashMap的初始容量為1>>4即16,擴容為2倍,比較耗時.HashTable初始為11,擴容為2倍+1.(超過閾值=容量 * 負載因子時擴容)
  3. HashMap中存放Entry物件
  4. HashMap可以存放null作為key,HashTable不可以.
  5. HashMap存貯結構為陣列+連結串列,在JDK8中變為陣列+連結串列+紅黑樹(連結串列中長度超過8或容量超過64時)

ConcurrentHashMap什麼時候用

因為HashTable在多執行緒下的效率低下(容器全鎖),因此在多執行緒下推薦使用ConcurrentHashMap

併發

synchronized與Lock

  • 都是可重入鎖,預設都是非公平鎖,Lock可通過建構函式建立公平鎖
  • ReentrantLock鎖的粒度和靈活度優於synchronized
  • synchronized是沒有超時不可中斷的,ReentrantLock有超時可中斷
  • ReentrantLock鎖可以繫結多個條件,可用Condition類實現分組喚醒
  • 在資源競爭不激烈的情況下,效能推薦使用synchronized
  • 在資源競爭激烈的情況下,效能會下降幾十倍,推薦使用ReentrantLock

volatile

當一個變數定義為 volatile 之後,將具備兩種特性

  1. 保證此變數的變化能夠被其他執行緒獲取
  2. 禁止指令重排序優化

執行緒池有哪幾種

執行緒池都使用Executors來建立,可以使用execute()和submit()來執行執行緒任務,前者只接收Runnable作為引數,後者還可接收Callable作為引數,並通過Future物件來獲取返回值及儲存的異常資訊,使用get()獲取返回值會阻塞主執行緒,直到該執行緒執行結束得到返回值,因此常用Callable+FutureTask來獲取返回值

  1. newCachedThreadPool - 可快取執行緒池,理論上執行緒數無上限
  2. newFixedThreadPool - 可重用固定個數的執行緒池
  3. newScheduledThreadPool - 可重用固定個數的執行緒池,執行定時及週期性任務
  4. newSingleThreadExecutor - 單執行緒核心的執行緒池
  5. newSingleThreadScheduledExecutor - 單執行緒核心的執行緒池,執行定時及週期性任務
  6. newWorkStealingPool - 具有搶佔式操作的執行緒池

阿里巴巴強制執行緒池不允許使用Executors去建立,而是通過ThreadPoolExecutor建構函式的方式

執行緒池的引數

  1. corePoolSize 執行緒池核心執行緒大小
  2. maximumPoolSize 執行緒池最大執行緒數量
  3. keepAliveTime 空閒執行緒存活時間
  4. unit 空間執行緒存活時間單位
  5. workQueue 工作佇列
  6. threadFactory 執行緒工廠
  7. handler 拒絕策略

前五個是必須的

MySQL

SQL執行速度慢

  1. 在伺服器上確認伺服器狀態資訊,是否磁碟滿或資源佔用高
  2. 查詢語句寫的不合理
  3. 建立的索引失效
  4. 關聯查詢太多join
  5. 伺服器調優及各個引數設定

儲存引擎InnoDB、MyISAM

  1. InnoDB支援事務,支援四種隔離級別.MyISAM不支援事務.
  2. InnoDB支援行級鎖及外來鍵約束,可支援寫併發.MyISAM支援表級鎖.
  3. 不儲存總行數.MyISAM有一個變數儲存總行數.
  4. Innodb不支援全文索引.MyISAM支援全文索引.
  5. Innodb必須有唯一索引如主鍵,如果沒有會自己找或生產一個.MyISAM可以沒有
  6. InnoDB支援外來鍵,而MyISAM不支援

InnoDB支援事務,行級鎖,外來鍵必須有唯一索引,不支援全文索引,不存貯總行數
MyISAM不支援事務和外來鍵,只支援表級鎖,有一個變數儲存總行數,可以沒有主鍵,支援全文索引

事務的四大特性

  1. 原子性A
  2. 一致性C
  3. 隔離性I
  4. 永續性D

索引

索引是MySQL高速獲取資料的資料結構,可以提高查詢效率,簡單的說是排好序的快速查詢資料結構

索引型別: 單值索引 / 唯一索引 / 複合索引 / 全文索引

語法:

CREATE [UNIQUE] INDEX indexName ON tableName(columnName(length));
ALTER TABLE tableName ADD INDEX indexName (columnName);

索引失效的情況
- 有or必全有索引
- 複合索引未用左列欄位
- like以%開頭
- 需要型別轉換
- where中索引列有運算
- where中索引列使用了函式
- 如果mysql覺得全表掃描更快時(資料少)

隔離級別

Isolation Level 隔離級別 髒讀 不可重複讀 幻讀 預設 解釋
READ-UNCOMMITTED 讀取未提交 1 1 1 最低的隔離級別,允許讀取尚未提交的資料變更
READ-COMMITTED 讀取已提交 0 1 1 允許讀取併發事務已經提交的資料
REPEATABLE-READ 可重複讀 0 0 1 預設 對同一欄位的多次讀取結果都是一致的
SERIALIZABLE 可序列化 0 0 0 最高的隔離級別,完全服從ACID的隔離級別

資料庫表優化

  1. 限定資料範圍
  2. 書寫分離 主庫負責寫,從庫負責讀
  3. 垂直拆分 拆分成多張表,欄位不同
  4. 水平拆分 最好分庫

NoSQL

Redis相比memcache的優勢在哪裡

兩者都是基於記憶體的資料庫,就是NoSQL,效能都很高,都常作快取使用,都有國企策略

  1. mem只支援KV形式的資料,即hash型別;Redis除此之外,還支援string/list/set/sorted set資料結構
  2. Redis支援資料的持久化,因此具有災難恢復機制,mem只能儲存在記憶體中
  3. mem是多執行緒的,早期的Redis是單執行緒的,更容易開發維護,後期加入了多執行緒的支援

Redis如何判斷資料是否過期

Redis有一個過期字典來儲存資料過期的時間.

Redis的持久化機制有哪些

  1. RDB快照(snapshotting) 預設
  2. AOF只追加檔案(append-only file) 實時性更好,主流

Redis可能回出現的問題

快取穿透: 快取和資料庫中都沒有的資料,而使用者不斷髮起請求,如發起為id為“-1”的資料或id為特別大不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。

  1. 介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id<=0的直接攔截
  2. 從快取取不到的資料,在資料庫中也沒有取到,這時也可以將key-value對寫為key-null,快取有效時間可以設定短點,如30秒(設定太長會導致正常情況也沒法使用)。這樣可以防止攻擊使用者反覆用同一個id暴力攻擊

快取擊穿: 快取中沒有但資料庫中有的資料(一般是快取時間到期),這時由於併發使用者特別多,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力。

  1. 設定熱點資料永遠不過期
  2. 加互斥鎖

快取雪崩: 快取中資料大批量到過期時間,而查詢資料量巨大,引起資料庫壓力過大甚至down機。

  1. 快取資料的過期時間設定隨機,防止同一時間大量資料過期現象發生。
  2. 如果快取資料庫是分散式部署,將熱點資料均勻分佈在不同搞得快取資料庫中。
  3. 設定熱點資料永遠不過期。

和快取擊穿不同的是,快取擊穿指併發查同一條資料,快取雪崩是不同資料都過期了,很多資料都查不到從而查資料庫。

框架

Spring

Spring Boot

Spring Cloud

  • 服務註冊中心 Eureka -> Nacos
  • 服務呼叫1 Ribbon -> LoadBalancer
  • 服務呼叫2 Feign -> OpenFeign
  • 服務降級 Hystrix -> Alibaba Sentinel
  • 服務閘道器 Zuul -> Gateway
  • 服務配置 Config -> Nacos
  • 服務匯流排 Bus -> Nacos
  1. 服務註冊中心
    1. Eureka 自帶,已停更
    2. Zookeeper 老專案常用
    3. Consul 不建議
    4. Nacos 完美替換Eureka
  2. 服務呼叫1
    1. Ribbon 慢慢被淘汰
    2. LoadBalancer 正在發展
  3. 服務呼叫2
    1. Feign 已停更
    2. OpenFeign 替換方案
  4. 服務降級
    1. Hystrix 已停更,但仍大量使用
    2. resilience4j 國外使用較多
    3. Alibaba Sentinel 推薦使用
  5. 服務閘道器
    1. Zuul 已停更
    2. Gateway 目前的主流
  6. 服務配置
    1. Config 已不推薦
    2. Nacos 推薦
  7. 服務匯流排
    1. Bus 已不推薦
    2. Nacos 推薦

中介軟體

訊息中介軟體MQ

核心目標: 解耦、非同步、削峰

  1. ActiveMQ 時間早,社群不活躍
  2. RabbitMQ erlang語言
  3. RocketMQ 阿里出品,吞吐量大
  4. Kafka scala語言,大資料首選,吞吐量大

生產者 - 消費者(主題,訂閱)

演算法與資料結構

演算法

  • 遞推法
  • 遞迴法
  • 窮舉法
  • 貪心演算法
  • 分治法
  • 動態規劃法
  • 迭代法
  • 分支界限法

資料結構

  1. 陣列(Array)
  2. 棧(Stack)
    • push() 新增元素
    • pop() 彈出棧頂元素
    • peek() 獲取棧頂元素
    • empty() 判斷棧是否為空
  3. 佇列(Queue)
    • add() 新增元素,可能只丟擲異常新增失敗
    • offer() 新增元素,推薦使用
    • remove() 移除頭部元素並返回,空佇列拋異常
    • element() 返回頭部元素不移除,空佇列拋異常
    • poll() 移除頭部元素並返回,空佇列返回null
    • peek() 返回頭部元素不移除,空佇列返回null
  4. 連結串列(Linked List)
  5. 樹(Tree)
  6. 圖(Graph)
  7. 堆(Heap)
  8. 散列表(Hash)

未整理

Lock鎖的原理(ReentrantLock)

Condition實現原理

CAS原理(自旋鎖)及使用場景

鎖升級概念

ThreadLocal

垃圾回收機制

CMS流程的優缺點

類載入機制

JVM記憶體模型,記憶體劃分,體系結構

記憶體溢位的分析,常見原因及解決方案

JVM中物件被回收的判斷依據

JVM調優

MySQL的分庫分表,讀寫分離

Zookeeper的原理和使用場景

微服務框架(Dubbo, Spring Cloud)