文章目錄
- 1 前言
- 2 自我介紹
- 3 Java SE
- 3.1 Java訪問控制修飾符
- 3.2 Java中抽象類與介面有何區別?
- 3.3 Java中super關鍵字與final關鍵字
- 3.4 final修飾的物件,有幾種初始化方式
- 3.5 Java中方法的多載(Overload)與方法的覆寫(Override)
- 3.6 Java基礎知識總結,干貨來啦
- 3.7 Java基礎面試題干貨系列(一)
- 3.8 Java中的String是不可變的,Why?
- 3.9 Java反射基礎入門,一篇就夠啦
- 3.10 面向物件與面向程序
- 3.11 Java基礎面試題干貨系列(二)
- 3.12 理解Java中的多型機制,一篇就夠啦
- 3.13 Java中引數傳遞(值傳遞還是參考傳遞)
- 3.14 Java編程思想之高內聚低耦合
- 3.15 Java基礎面試題干貨系列(三)
- 3.16 Java中的例外(Exception)
- 3.17 Java中設計模式的七大基本原則
- 3.18 Java中File類,你知道有哪些api方法嗎?
- 3.19 計算機中位元組、字、位、bai位元等單位之間的換算關系
- 3.20 HTTP請求狀態碼對照表
- 3.21 集合
- 3.21.1 集合頂層的介面類有哪些?集合常見的有哪幾種?都有啥區別?
- 3.21.2 集合頂層的介面類有哪些?
- 3.21.3 集合常見的有哪幾種?
- 3.21.4 請說明Collection和Collections的區別
- 3.21.5 ArrayList和Vector以及LinkedList三者有啥區別?
- 3.21.6 HashMap和HashTable有何區別?
- 3.21.7 HashTable和ConcurrentHashMap有何區別?
- 3.21.8 ConcurrentHashMap底層實作原理
- 3.21.9 ThreadLocal底層是如何實作的
- 4 Java EE
- 4.1 UML類和類之間的關系詳解
- 4.2 UML圖使用詳解
- 5 設計模式
- 6 MySQL總結
- 6.1 Java JDBC編程
- 6.2 MySQL使用總結以及MySQL性能優化
- 6.3 MySQL四大特性是什么(MySQL事務的基本要素(ACID)有哪些)?
- 6.4 MySQL隔離級別有幾種,有什么區別?
- 6.4.1 MySQL四種隔離級別
- 6.4.2 MySQL事務的并發問題
- 6.5 MySQL索引,主鍵索引與普通索引區別?
- 6.6 B+Tree索引結構底層實作原理?
- 6.7 MySQL如何進行性能優化?
- 6.8 MySQL什么情況下索引會失效?
- 7 JDK和JVM總結
- 8 多執行緒總結
- 9 分布式技術總結
- 9.1 Redis快取穿透 && 快取擊穿 && 快取雪崩
- 9.1.1 快取處理流程
- 9.1.2 Redis快取穿透
- 9.1.3 Redis快取擊穿
- 9.1.4 Redis快取雪崩
- 9.2 Redis系列-Java面試題干貨系列(四)
- 9.3 分布式保證系統資料一致性,如何使用的分布式鎖?有哪幾種方式?
- 10 微服務總結
- 11 專案問題總結
- 11.1 Git使用總結
- 12 資料結構和演算法
- 13 Linux常用命令有哪些
- 14 前端問題
- 15 有什么想要問的嗎?
1 前言
作業久了就會發現,基礎知識忘得差不多了,為了復習下基礎的知識,同時為以后找作業做準備,這里簡單總結一些常見的可能會被問到的問題,
2 自我介紹
自己根據實際情況發揮就行
3 Java SE
3.1 Java訪問控制修飾符
Java訪問控制修飾符
3.2 Java中抽象類與介面有何區別?
Java中抽象類與介面
3.3 Java中super關鍵字與final關鍵字
Java中super關鍵字與final關鍵字
3.4 final修飾的物件,有幾種初始化方式
final修飾的物件,有幾種初始化方式
3.5 Java中方法的多載(Overload)與方法的覆寫(Override)
Java中方法的多載與方法的覆寫
3.6 Java基礎知識總結,干貨來啦
Java基礎知識總結,干貨來啦
3.7 Java基礎面試題干貨系列(一)
Java基礎面試題干貨系列(一)
3.8 Java中的String是不可變的,Why?
Java中的String是不可變的,Why?
3.9 Java反射基礎入門,一篇就夠啦
Java反射基礎入門,一篇就夠啦
3.10 面向物件與面向程序
面向物件與面向程序
3.11 Java基礎面試題干貨系列(二)
Java基礎面試題干貨系列(二)
3.12 理解Java中的多型機制,一篇就夠啦
理解Java中的多型機制,一篇就夠啦
3.13 Java中引數傳遞(值傳遞還是參考傳遞)
Java中引數傳遞(值傳遞還是參考傳遞)
3.14 Java編程思想之高內聚低耦合
Java編程思想之高內聚低耦合
3.15 Java基礎面試題干貨系列(三)
Java基礎面試題干貨系列(三)
3.16 Java中的例外(Exception)
Java中的例外(Exception)
3.17 Java中設計模式的七大基本原則
Java中設計模式的七大基本原則
3.18 Java中File類,你知道有哪些api方法嗎?
Java中File類,你知道有哪些api方法嗎?
3.19 計算機中位元組、字、位、bai位元等單位之間的換算關系
計算機中位元組、字、位、bai位元等單位之間的換算關系
3.20 HTTP請求狀態碼對照表
HTTP請求狀態碼對照表
3.21 集合
3.21.1 集合頂層的介面類有哪些?集合常見的有哪幾種?都有啥區別?
集合類圖:

- Collection介面

- Map介面

3.21.2 集合頂層的介面類有哪些?
集合的頂層介面,常見的主要有: Collection介面、Map介面
3.21.3 集合常見的有哪幾種?
和Collection相關的介面主要有: Collection、List和Set介面
-
Collection介面
Collection是一個抽象出來的介面,定義如下:public interface Collection<E> extends Iterable<E> {}其中包括了集合的基本操作,包括:
洗掉、添加、遍歷、大小等 -
List介面
List介面繼承自Collection,List中的元素的有序且允許重復的,定義如下:public interface List<E> extends Collection<E> {} -
Set介面
Set介面繼承自Collection,Set是數學中定義的集合,元素無需不允許重復,定義如下:
public interface Set extends Collection {}
Map介面,也是頂層介面,Map保存的是鍵值對映射,映射關系可以是一對一或者一對多,
參考資料: https://blog.csdn.net/weixin_34176694/article/details/88708182
3.21.4 請說明Collection和Collections的區別
Collection是集合類的頂級介面,繼承與他的介面主要有List和Set,而Collections是針對集合類的一個工具類,它提供了一系列的靜態方法實作對各種集合的搜索、排序、執行緒安全化等操作,
3.21.5 ArrayList和Vector以及LinkedList三者有啥區別?
-
ArrayList 和Vector底層都是使用陣列方式存盤資料,此陣列元素數大于實際存盤的資料以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及陣列元素移動等記憶體操作,所以索引資料快而插入資料慢,Vector由于使用了synchronized方法(執行緒安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實作存盤,按序號索引資料需要進行前向或后向遍歷,但是插入資料時只需要記錄本項的前后項即可,所以插入速度較快, -
請說明ArrayList和LinkedList的區別?
ArrayList和LinkedList都實作了List介面,ArrayList是基于索引的資料介面,它的底層是陣列,它可以以O(1)時間復雜度對元素進行隨機訪問,而LinkedList是以元素串列的形式存盤它的資料,每一個元素都和它的前一個和后一個元素鏈接在一起,在這種情況下,查找某個元素的時間復雜度是O(n),LinkedList的插入,添加,洗掉操作比ArrayList速度更快,因為當元素被添加到集合任意位置的時候,不需要像陣列那樣重新計算大小或者是更新索引,LinkedList比ArrayList更占記憶體,因為LinkedList為每一個節點存盤了兩個參考,一個指向前一個元素,一個指向下一個元素,
3.21.6 HashMap和HashTable有何區別?
-
HashTable
底層陣列+鏈表實作,無論key還是value都不能為null,執行緒安全,適合于多執行緒環境,實作執行緒安全的方式是在修改資料時鎖住整個HashTable,效率低,ConcurrentHashMap做了相關優化初始size為11,擴容:newsize = olesize*2+1
計算index的方法:index = (hash & 0x7FFFFFFF) % tab.length
-
HashMap
底層陣列+鏈表實作,可以存盤null鍵和null值,執行緒不安全,更適合于單執行緒環境初始size為16,擴容:newsize = oldsize*2,size一定為2的n次冪
擴容針對整個Map,每次擴容時,原來陣列中的元素依次重新計算存放位置,并重新插入
插入元素后才判斷該不該擴容,有可能無效擴容(插入后如果擴容,如果沒有再次插入,就會產生無效擴容)當Map中元素總數超過Entry陣列的75%,觸發擴容操作,為了減少鏈表長度,元素分配更均勻
計算index方法:index = hash & (tab.length – 1)
更詳細的介紹,可參考我的另一篇博客: HashMap、Hashtable、ConcurrentHashMap的區別和原理淺析
3.21.7 HashTable和ConcurrentHashMap有何區別?
-
相同點
Hashtable和HashMap都實作了Map介面,兩者都是執行緒安全的 -
不同點
Java5提供了ConcurrentHashMap,它是HashTable的替代,ConcurrentHashMap比HashTable的擴展性更好,性能也大大提升了 -
為什么說ConcurrentHashMap性能大大提高了?
簡單來說,ConcurrentHashMap底層有分段鎖,類似于mysql中的行級鎖,而Hashtable是鎖整個hash表,類似于mysql中的表級鎖
ConcurrentHashMap提供了與Hashtable和SynchronizedMap不同的鎖機制,Hashtable中采用的鎖機制是一次鎖住整個hash表,從而在同一時刻只能由一個執行緒對其進行操作,而ConcurrentHashMap是使用了
鎖分段技術來保證執行緒安全的,是一次鎖住一個桶,ConcurrentHashMap默認將hash表分為16個桶,諸如get、put、remove等常用操作只鎖住當前需要用到的桶,這樣,原來只能一個執行緒進入,現在卻能同時有16個寫執行緒執行,并發性能的提升是顯而易見的,
鎖分段技術:
首先將資料分成一段一段的存盤,然后給每一段資料配一把鎖,當一個執行緒占用鎖訪問其中一個段資料的時候,其他段的資料也能被其他執行緒訪問,
3.21.8 ConcurrentHashMap底層實作原理
-
底層采用分段的陣列+鏈表實作,是執行緒安全的
-
通過把整個Map分為N個Segment,可以提供相同的執行緒安全,但是效率提升N倍,默認提升16倍,(讀操作不加鎖,由于HashEntry的value變數是 volatile的,也能保證讀取到最新的值,)
-
Hashtable的synchronized是針對整張Hash表的,即每次鎖住整張表讓執行緒獨占,ConcurrentHashMap允許多個修改操作并發進行,其關鍵在于使用了鎖分離技術
-
有些方法需要跨段,比如size()和containsValue(),它們可能需要鎖定整個表而而不僅僅是某個段,這需要按順序鎖定所有段,操作完畢后,又按順序釋放所有段的鎖
-
擴容:段內擴容(段內元素超過該段對應Entry陣列長度的75%觸發擴容,不會對整個Map進行擴容),插入前檢測需不需要擴容,有效避免無效擴容
3.21.9 ThreadLocal底層是如何實作的
4 Java EE
4.1 UML類和類之間的關系詳解
UML類和類之間的關系詳解
4.2 UML圖使用詳解
UML圖使用詳解
Spring Boot和Spring Cloud有什么區別?
10、Spring MVC執行流程?
11、對Spring Ioc和Aop理解?
12、Spring 事務傳播行為有哪些?有什么區別?
13、說一下動態代理和靜態代理有何區別?動態代理有JDK動態代理和Cglib動態代理,這兩個代理如何實作的,有何區別?
5 設計模式
14、專案中用到了那些設計模式?哪些好的框架里面有使用過這些設計模式?
6 MySQL總結
6.1 Java JDBC編程
Java JDBC編程
6.2 MySQL使用總結以及MySQL性能優化
MySQL使用總結以及MySQL性能優化
6.3 MySQL四大特性是什么(MySQL事務的基本要素(ACID)有哪些)?
-
原子性(Atomicity)
事務開始后所有操作,要么全部做完(要么都成功),要么全部不做(要么都失敗),不可能停滯在中間環節,事務執行程序中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣,也就是說事務是一個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位, -
一致性(Consistency)
事務開始前和結束后,資料庫的完整性約束沒有被破壞 ,比如A向B轉賬,不可能A扣了錢,B卻沒收到, -
隔離性(Isolation)
同一時間,只允許一個事務請求同一資料,不同的事務之間彼此沒有任何干擾,比如A正在從一張銀行卡中取錢,在A取錢的程序中,B不能向這張卡轉賬, -
持久性(Durability)
事務完成后,事務對資料庫的所有更新將被保存到資料庫,不能回滾,
6.4 MySQL隔離級別有幾種,有什么區別?
6.4.1 MySQL四種隔離級別
MySQL默認的隔離級別是可重復讀(repeatable-read),MySQL事務隔離級別有以下四種:
| 事務隔離級別 | 臟讀 | 不可重復讀 | 幻讀 |
|---|---|---|---|
| 讀未提交(read-uncommitted) | 是 | 是 | 是 |
| 讀已提交(read-committed) | 否 | 是 | 是 |
| 可重復讀(repeatable-read) | 否 | 否 | 是 |
| 串行化(serializable) | 否 | 否 | 否 |
6.4.2 MySQL事務的并發問題
-
臟讀:事務A讀取了事務B更新的資料,然后B回滾操作,那么A讀取到的資料是臟資料
-
不可重復讀:事務 A 多次讀取同一資料,事務 B 在事務A多次讀取的程序中,對資料作了更新并提交,導致事務A多次讀取同一資料時,結果 不一致,
-
幻讀:系統管理員A將資料庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束后發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀,
-
小結:不可重復讀的和幻讀很容易混淆,不可重復讀側重于修改,幻讀側重于新增或洗掉,解決不可重復讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
具體示例,可以參考我另一篇博客: https://blog.csdn.net/smilehappiness/article/details/119656138
6.5 MySQL索引,主鍵索引與普通索引區別?
6.6 B+Tree索引結構底層實作原理?
6.7 MySQL如何進行性能優化?
6.8 MySQL什么情況下索引會失效?
7 JDK和JVM總結
8、Java8新特性有哪些?
Stream api,函式作為引數傳遞
26、Jvm垃圾回收、老年代、新生代、雙親委派模型等,以及JVM引數優化
27、如何阻止gc垃圾回收?
8 多執行緒總結
9、單Spring boot應用執行緒有幾種同步方式?
synchronized,CountDownLatch
33、多執行緒如何使用的?
自定義執行緒池、Executors工具類四種執行緒池區別?
9 分布式技術總結
9.1 Redis快取穿透 && 快取擊穿 && 快取雪崩
9.1.1 快取處理流程
前臺請求,后臺先從快取中取資料,取到直接回傳結果,取不到時從資料庫中取,資料庫取到更新快取,并回傳結果,資料庫也沒取到,那直接回傳空結果,
9.1.2 Redis快取穿透
快取穿透是指大量不存在的key請求,由于快取沒有,便開始查詢資料庫,但資料庫也沒有查到資料,比如一些惡意攻擊、爬蟲等造成大量空命中,即:快取穿透是指快取和資料庫中都沒有的資料,而用戶不斷發起請求,會導致資料庫壓力過大,甚至宕機,
解決方案:
-
方案一: 快取空結果,對資料庫查詢不存在的資料仍然記錄在快取中快取一條資料,比如快取一條空值 unknow,快取有效時間可以設定短點,如30秒(設定太長會導致正常情況也沒法使用),這樣可以防止攻擊用戶反復用不存在的key暴力攻擊,這樣能有效的減少查詢資料庫的次數,(
無論如何,要保證資料庫的可用性) -
方案二: 使用布隆過濾器
9.1.3 Redis快取擊穿
快取擊穿是指快取中沒有但資料庫中有的資料(一般是快取時間到期),這時由于并發用戶特別多,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力導致資料庫不可用的現象,
高并發條件下,對于熱點資料(一般地,80%的情況下都是訪問某些熱點資料,也就是訪問某些熱點key,其他key訪問會比較少),當資料快取失效的一瞬間,或者剛開始時快取中還沒有對熱點資料進行快取,所有請求都被發送到資料庫去查詢,導致資料庫被壓垮,
解決方案:
-
方案一: 使用全域互斥鎖,就是在訪問資料庫之前都先請求全域鎖,獲得鎖的那個才有資格去訪問資料庫,其他執行緒必須等待,由于現在的業務都是分布式的,本地鎖沒法控制其他服務器也等待,所以要用到全域鎖,比如分布式鎖,
-
方案二: 對即將過期的資料主動重繪,比如起一個后臺定時任務輪詢,主動更新快取資料,保證快取不會全部失效,
-
方案三: 設定熱點資料永遠不過期
9.1.4 Redis快取雪崩
快取雪崩是指:比如我們給所有的資料設定了同樣的過期時間,然后在某一個歷史性時刻,整個快取的資料全部過期了,然后瞬間所有的請求都落到資料庫,資料庫被壓垮,或者是快取發生故障,導致所有的請求都落入到資料庫,資料庫被壓垮,
簡單來說就是,快取雪崩是指快取中資料大批量到過期時間,而查詢資料量巨大,引起資料庫壓力過大甚至宕機,和快取擊穿不同的是,快取擊穿指并發查同一條資料,快取雪崩是不同資料都過期了,很多資料都查不到從而查資料庫,快取雪崩更加的嚴重,
快取雪崩的核心就是你的快取不能用了,不能用了包含兩種情況:
突然有一個高并發請求:
- 我要查的資料都沒有快取,那么都查詢資料庫,資料庫可能被查詢宕機
- 快取本身就不能用了,比如快取宕機了,那么也導致所有請求都查詢資料庫,資料庫宕機
解決方案:
事前:
- redis要高可用(搭建集群或者主從哨兵),避免redis不可用
- 快取資料的過期時間設定隨機,防止同一時間大量資料過期現象發生
- 如果快取資料庫是分布式部署,將熱點資料均勻分布在不同的快取資料庫中
事中:
- 本地ehcache快取(mybatis二級快取)+限流&降級(比如回傳:系統繁忙,請稍后再試或者網路開小差了等等),避免資料庫被壓垮
- 也可以使用極端的處理,把熱點資料設定為-1,即永遠不過期
事后: redis持久化,快速恢復快取資料

9.2 Redis系列-Java面試題干貨系列(四)
Redis系列問題總結
9.3 分布式保證系統資料一致性,如何使用的分布式鎖?有哪幾種方式?
基于Redis實作分布式鎖
基于Zookeeper實作分布式鎖
16、redis有哪些資料型別?專案中使用了那些場景?
18、分布式事務怎么實作的?
18、使用了消費組件有哪些?有哪些組件類?延遲佇列有使用過嗎?訊息丟失怎么處理?
rabbitmq,
20、nginx如何實作不同資源的轉發訪問?
21、nginx如何實作負載均衡,有哪幾種方式?
24、Elasticsearch底層實作原理?
倒排索引
10 微服務總結
19、Spring Cloud使用了那些組件?負載均衡如何實作的?如何鑒權?
nacos、zuul、gateway網關、ribbon、feign、hystrix,基于ribbon實作動態負載均衡,基于nginx實作靜態負載均衡
22、nacos服務注冊如何實作的?
23、nacos服務配置動態重繪如何實作?底層如何實作的?
@RefreshScope,注解底層是使用cglib動態代理來實作,而cglib是創建動態子類繼承來完成功能的增強
如何使用Hystrix進行熔斷降級?
如果A服務呼叫B服務、然后呼叫C服務,假設C服務故障無法回應
如何抗住高并發?
單應用服務A,可以進行業務細粒度的拆分,比如說crm系統,可以拆分為客戶服務、訂單服務、附件服務等,每個細粒度的應用服務,又可以進行多實體集群,這樣就可以提高系統的吞吐量
高并發海量資料,如何處理?
分庫分表(橫向拆分:按省份,每個省份一個庫,每個庫再分多個訂單表,比如0_order、1-order等,當然了,也可以對6556進行取余,余數作為庫名,比如0_order、1_order,庫劃分好了,再分多個表,進行讀寫分離)
11 專案問題總結
11.1 Git使用總結
Git使用詳解
15、專案中遇到問題,如何排查?
25、解決線上bug問題,舉一個印象最深刻的例子?
多次提交,重復資料問題,基于token做冪等校驗
線上問題不能及時反饋,添加釘釘預警及時觸達
12 資料結構和演算法
13 Linux常用命令有哪些
Linux crontab 命令
Linux怎樣使用top命令查看系統狀態
14 前端問題
34、Vue生命周期函式有哪些?React生命周期函式有哪些?
15 有什么想要問的嗎?
1、如果有幸加入的話,主要負責的專案是什么?
2、咱們專案用到了什么技術、架構?
寫博客是為了記住自己容易忘記的東西,另外也是對自己作業的總結,希望盡自己的努力,做到更好,大家一起努力進步!
如果有什么問題,歡迎大家一起探討,代碼如有問題,歡迎各位大神指正!
給自己的夢想添加一雙翅膀,讓它可以在天空中自由自在的飛翔!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293530.html
標籤:其他
