OSI網絡模型
TCP和UDP對比
HTTP和HTTPS對比
B+樹
HTTP常見狀態碼
線程和進程的區別
goroutine的調度模型GMP
常見的排序了解哪些
快速排序
func quickSort(data []int) {if len(data) <= 1 {return}base := data[0]l, r := 0, len(data)-1for i := 1; i <= r; {if data[i] > base {data[i], data[r] = data[r], data[i]r--} else {data[i], data[l] = data[l], data[i]l++i++}}quickSort(data[:l])quickSort(data[l+1:])
}func main() {s := make([]int, 0, 16)for i := 0; i < 16; i++ {s = append(s, rand.Intn(100))}fmt.Println(s)quickSort(s)fmt.Println(s)
}
歸并排序
func mergeSort(data []int) []int {length := len(data)if length <= 1 {return data}num := length / 2left := mergeSort(data[:num])right := mergeSort(data[num:])return merge(left, right)
}func merge(left, right []int) (result []int) {l, r := 0, 0for l < len(left) && r < len(right) {if left[l] < right[r] {result = append(result, left[l])l++} else {result = append(result, right[r])r++}}result = append(result, left[l:]...)result = append(result, right[r:]...)return
}func main() {s := make([]int, 0, 16)for i := 0; i < 16; i++ {s = append(s, rand.Intn(100))}fmt.Println(s)s = mergeSort(s)fmt.Println(s)
}
堆排序
func heapSort(array []int) {m := len(array)s := m / 2for i := s; i > -1; i-- {heap(array, i, m-1)}for i := m - 1; i > 0; i-- {array[i], array[0] = array[0], array[i]heap(array, 0, i-1)}
}
func heap(array []int, i, end int) {l := 2*i + 1if l > end {return}n := lr := 2*i + 2if r <= end && array[r] > array[l] {n = r}if array[i] > array[n] {return}array[n], array[i] = array[i], array[n]heap(array, n, end)
}
func main() {s := make([]int, 0, 16)for i := 0; i < 16; i++ {s = append(s, rand.Intn(100))}fmt.Println(s)heapSort(s)fmt.Println(s)
}
用過什么設計模式,單例模式,工廠模式
設計模式是解決軟件設計中常見問題的可復用方案。單例模式和工廠模式是兩種最常用的設計模式,以下是它們的核心原理、實現方式及實際應用場景:
一、單例模式 (Singleton Pattern)
核心思想
確保一個類只有一個實例,并提供全局訪問點。
應用場景
- 日志記錄器(全局唯一日志對象)
- 數據庫連接池(避免重復創建連接)
- 配置管理(統一讀取配置文件)
- 緩存管理器(如 Redis 客戶端實例)
關鍵實現方式
-
餓漢式(線程安全,但可能浪費資源)
public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {} // 私有構造方法public static Singleton getInstance() {return instance;} }
-
懶漢式(延遲加載,需處理線程安全)
public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;} }
- 雙重檢查鎖定(Double-Checked Locking):解決同步性能問題。
volatile
關鍵字:禁止指令重排序,避免未初始化完成的對象被訪問。
-
靜態內部類(推薦方式,線程安全且延遲加載)
public class Singleton {private Singleton() {}private static class Holder {private static final Singleton instance = new Singleton();}public static Singleton getInstance() {return Holder.instance;} }
注意事項
- 反射攻擊:通過反射調用私有構造方法可破壞單例,需在構造方法中增加防御邏輯。
- 序列化問題:反序列化可能生成新對象,需實現
readResolve()
方法返回單例實例。
二、工廠模式 (Factory Pattern)
核心思想
將對象的創建與使用分離,通過工廠類統一管理對象的實例化過程。
三種變體及區別
類型 | 特點 | 適用場景 |
---|---|---|
簡單工廠 | 一個工廠類生產多種產品,通過參數區分 | 產品類型少且邏輯簡單 |
工廠方法 | 每個產品對應一個工廠類,通過子類實現擴展 | 需要擴展新類型,避免修改已有代碼 |
抽象工廠 | 生產一組相關或依賴的產品(產品族) | 需要創建多個關聯對象(如UI主題) |
1. 簡單工廠(Simple Factory)
public class ShapeFactory {public Shape createShape(String type) {if ("circle".equals(type)) {return new Circle();} else if ("square".equals(type)) {return new Square();}throw new IllegalArgumentException("Unknown shape type");}
}
- 缺點:新增類型需修改工廠類,違反開閉原則。
2. 工廠方法(Factory Method)
// 抽象工廠接口
public interface ShapeFactory {Shape createShape();
}// 具體工廠類
public class CircleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}public class SquareFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Square();}
}
- 優點:新增產品時只需添加新工廠類,無需修改已有代碼。
3. 抽象工廠(Abstract Factory)
// 抽象工廠接口(生產一組關聯產品)
public interface GUIFactory {Button createButton();Checkbox createCheckbox();
}// 具體工廠:Windows風格組件
public class WindowsFactory implements GUIFactory {@Overridepublic Button createButton() {return new WindowsButton();}@Overridepublic Checkbox createCheckbox() {return new WindowsCheckbox();}
}// 具體工廠:MacOS風格組件
public class MacOSFactory implements GUIFactory {@Overridepublic Button createButton() {return new MacOSButton();}@Overridepublic Checkbox createCheckbox() {return new MacOSCheckbox();}
}
- 應用場景:跨平臺UI組件、數據庫驅動(如MySQL/Oracle連接器)。
三、實際項目中的應用示例
單例模式案例
- 日志工具類:
public class Logger {private static Logger instance;private Logger() {} // 禁止外部實例化public static synchronized Logger getInstance() {if (instance == null) {instance = new Logger();}return instance;}public void log(String message) {// 寫入日志文件} }
工廠模式案例
- 數據庫連接池:
public interface ConnectionFactory {Connection createConnection(); }public class MySQLConnectionFactory implements ConnectionFactory {@Overridepublic Connection createConnection() {return DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb");} }public class PostgreSQLConnectionFactory implements ConnectionFactory {@Overridepublic Connection createConnection() {return DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydb");} }
四、設計模式的選擇原則
-
單例模式:
- 需嚴格控制全局唯一實例時使用。
- 避免濫用,可能導致資源無法釋放或單元測試困難(如Mock對象替換問題)。
-
工廠模式:
- 對象創建邏輯復雜或需要解耦時優先使用。
- 簡單場景可直接用
new
,復雜場景(如依賴注入)可結合Spring等框架。
五、常見誤區
- 單例模式的線程安全問題:未正確使用雙重檢查鎖定或靜態內部類可能導致多實例。
- 工廠模式的過度設計:若對象創建邏輯簡單,直接實例化更清晰。
- 忽略開閉原則:通過工廠方法或抽象工廠擴展,而非修改已有代碼。
六、其他常用設計模式
- 觀察者模式:事件驅動系統(如消息訂閱)。
- 策略模式:算法族封裝,動態切換(如支付方式選擇)。
- 裝飾器模式:動態擴展對象功能(如Java I/O流)。
根據具體需求選擇合適的設計模式,避免為了模式而模式。
這表有三個字段,第一個呢是學生的ID,第二個呢是科目的ID,第三個是分數,怎么獲取每個學生的所有科目的總分
select SID, SUM(score) AS total_score FROM student_score GROUP BY SID
如果要獲取總分在300以上的呢?
select SID, SUM(score) AS total_score FROM student_score GROUP BY SID HAVING total_score > 300
having與where的區別:
having是在分組后對數據進行過濾
where是在分組前對數據進行過濾
having后面可以使用聚合函數
where后面不可以使用聚合
SQL優化怎么做
們需要明確SQL查詢的性能瓶頸在哪里。這通常可以通過查看查詢的執行計劃來實現。數據庫管理系統(如MySQL、PostgreSQL等)提供了EXPLAIN命令,可以幫助我們了解查詢是如何被執行的,包括使用的索引、掃描的行數等信息。
- 索引優化:確保在查詢條件中使用的列上有適當的索引。例如,如果經常按某個字段進行過濾或排序,可以考慮為該字段創建索引。
- 查詢重寫:簡化復雜的子查詢,盡量避免使用SELECT *,只選擇需要的列以減少數據傳輸量。
- 減少計算:避免在WHERE子句中對列進行函數操作或類型轉換,因為這可能會導致索引失效。
要優化 SQL 查詢以獲取每個學生的所有科目的總分,可以考慮以下幾點:
1. 使用索引
確保在 student_id
和 score
字段上創建索引,這樣可以加快查詢速度。創建索引的 SQL 語句如下:
CREATE INDEX idx_student_id ON scores(student_id);
2. 合理選擇字段
如果只需要學生 ID 和總分,確保只選擇這兩個字段,可以減少數據傳輸量。
3. 查詢優化
使用如下查詢來獲取每個學生的總分:
SELECT student_id, SUM(score) AS total_score
FROM scores
GROUP BY student_id;
4. 數據分區
如果表非常大,可以考慮對數據進行分區(例如按學期或年份分區),這樣在查詢時可以更快地定位相關數據。
5. 確保表的設計合理
確保表的設計規范,避免冗余數據。例如,確保沒有重復的記錄。
6. 使用物化視圖
如果這個查詢非常頻繁并且數據更新不太頻繁,可以考慮創建一個物化視圖,定期更新:
CREATE MATERIALIZED VIEW student_total_scores AS
SELECT student_id, SUM(score) AS total_score
FROM scores
GROUP BY student_id;
7. 監測和調試
使用數據庫的執行計劃功能來分析查詢的性能,識別瓶頸并進行針對性的優化。
總結
通過創建索引、合理選擇字段、數據分區、物化視圖等方法,可以顯著提升 SQL 查詢的性能。
explain type最好和最壞情況
參考:https://blog.csdn.net/why15732625998/article/details/80388236
- EXPLAIN簡介
使用EXPLAIN關鍵字可以模擬優化器執行SQL查詢語句,從而知道MySQL是如何處理你的SQL語句的。分析你的查詢語句或是表結構的性能瓶頸。
? 通過EXPLAIN,我們可以分析出以下結果:
表的讀取順序
數據讀取操作的操作類型
哪些索引可以使用
哪些索引被實際使用
表之間的引用
每張表有多少行被優化器查詢
? 使用方式如下:
EXPLAIN +SQL語句
分別用來表示查詢的類型,主要是用于區別普通查詢、聯合查詢、子查詢等的復雜查詢。
SIMPLE 簡單的select查詢,查詢中不包含子查詢或者UNION
PRIMARY 查詢中若包含任何復雜的子部分,最外層查詢則被標記為PRIMARY
SUBQUERY 在SELECT或WHERE列表中包含了子查詢
DERIVED 在FROM列表中包含的子查詢被標記為DERIVED(衍生),MySQL會遞歸執行這些子查詢,把結果放在臨時表中
UNION 若第二個SELECT出現在UNION之后,則被標記為UNION:若UNION包含在FROM子句的子查詢中,外層SELECT將被標記為:DERIVED
UNION RESULT 從UNION表獲取結果的SELECT
type所顯示的是查詢使用了哪種類型,type包含的類型包括如下圖所示的幾種:
從最好到最差依次是:
system > const > eq_ref > ref > range > index > all
一般來說,得保證查詢至少達到range級別,最好能達到ref。
- system 表只有一行記錄(等于系統表),這是const類型的特列,平時不會出現,這個也可以忽略不計
- const 表示通過索引一次就找到了,const用于比較primary key 或者unique索引。因為只匹配一行數據,所以很快。如將主鍵置于where列表中,MySQL就能將該查詢轉換為一個常量。
- eq_ref 唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配。常見于主鍵或唯一索引掃描
- ref 非唯一性索引掃描,返回匹配某個單獨值的所有行,本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而,它可能會找到多個符合條件的行,所以他應該屬于查找和掃描的混合體。
- range 只檢索給定范圍的行,使用一個索引來選擇行,key列顯示使用了哪個索引,一般就是在你的where語句中出現between、< 、>、in等的查詢,這種范圍掃描索引比全表掃描要好,因為它只需要開始于索引的某一點,而結束于另一點,不用掃描全部索引。
- index Full Index Scan,Index與All區別為index類型只遍歷索引樹。這通常比ALL快,因為索引文件通常比數據文件小。(也就是說雖然all和Index都是讀全表,但index是從索引中讀取的,而all是從硬盤讀取的)
- all Full Table Scan 將遍歷全表以找到匹配的行
常用linux命令
chmod 設置只讀,只讀+寫怎么設置
chmod
是一個用于改變文件和目錄權限的命令。它允許用戶設置誰可以讀取、寫入或執行文件。以下是 chmod
的基本用法和示例。
基本語法
chmod [options] mode file
權限模式
mode
可以用符號或數字表示:
-
符號表示法:
r
:讀權限 (read)w
:寫權限 (write)x
:執行權限 (execute)u
:文件所有者 (user)g
:文件所在組 (group)o
:其他用戶 (others)a
:所有用戶 (all)
示例:
chmod u+x file.txt
:給文件所有者添加執行權限。chmod go-w file.txt
:去掉組和其他用戶的寫權限。chmod a+r file.txt
:給所有用戶添加讀權限。
-
數字表示法:
- 權限用三位數字表示,每位數字的值為:
- 4:讀權限
- 2:寫權限
- 1:執行權限
- 這三位數字的組合表示不同的權限。
示例:
chmod 755 file.txt
:設置所有者有讀、寫、執行權限(7),組和其他用戶有讀和執行權限(5)。chmod 644 file.txt
:設置所有者有讀和寫權限(6),組和其他用戶只有讀權限(4)。
- 權限用三位數字表示,每位數字的值為:
常用選項
-
-R
:遞歸改變目錄及其子目錄下的文件權限。示例:
chmod -R 755 /path/to/directory
示例
-
給文件添加執行權限:
chmod +x script.sh
-
撤銷寫權限:
chmod -w document.txt
-
設置多個權限:
chmod u+x,g-w,o+r file.txt
通過這些基本用法,您可以有效管理文件和目錄的權限。
快排
package mainimport ("fmt""math/rand"
)func fast_sort(num []int) {if len(num)<=1{return}base := num[0]l, r := 0, len(num)-1for l < r {for l < r && num[r] > base {r--}if num[r] <= base {num[l] = num[r]}for l < r && num[l] <= base {l++}if num[l] > base {num[r] = num[l]}}num[l] = basefast_sort(num[:l])fast_sort(num[l+1:])
}func main() {s := make([]int, 16)for i := 0; i < 16; i++ {s[i] = rand.Intn(100)}fmt.Println(s)fast_sort(s)fmt.Println(s)
}
無重復字符的最長子串
https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/
func lengthOfLongestSubstring(s string) int {ans := 0book := map[byte]int{}for l,r := 0,0;r<len(s);r++{book[s[r]]++for book[s[r]]>1{book[s[l]]--l++}if r-l+1>ans{ans = r-l+1}}return ans
}