Java - 程序員面試筆記記錄 實現 - Part2

2.1 輸入輸出流

流可以被看作一組有序的字節集合,即數據在兩個設備間的傳輸。

字節流:以字節作為單位,讀到一個字節就返回一個字節;InputStream & OutputStream。

字符流:使用字節流讀到一個到多個字節先查詢碼表再返回;Reader & Writer。會使用緩存。

Java IO 類設計時采用了 Decorator 模式(裝飾者)

2.1 補充 - 裝飾者模式

裝飾者模式的組成部分:

  1. Component(抽象組件):定義了一個接口,描述了可以動態添加的責任。

  2. ConcreteComponent(具體組件):定義了Component接口的具體實現。

  3. Decorator(抽象裝飾者):抽象類,實現了Component接口,并持有Component接口的一個實例。

  4. ConcreteDecorator(具體裝飾者):具體裝飾者類,實現Decorator的抽象方法,并添加額外的功能。

裝飾者模式的實現步驟:

  1. 定義組件接口(Component),它有一個方法,比如?operation()

  2. 創建具體組件類(ConcreteComponent),實現Component接口。

  3. 創建裝飾者抽象類(Decorator),實現Component接口,并包含一個Component接口的引用。

  4. 實現具體裝飾者類(ConcreteDecorator),繼承Decorator類,并添加額外的功能。

  5. 通過組合,Decorator可以動態地給Component添加功能。

裝飾者模式的好處主要包括:

  1. 動態擴展性:可以在運行時動態地給一個對象添加額外的職責,而不需要修改原有的代碼結構。

  2. 靈活性:裝飾者模式提供了一種靈活的替代方案,用于繼承,可以基于需要向對象添加任意數量的職責。

  3. 低耦合性:裝飾者模式允許系統在對象間保持較低的耦合度,因為對象不需要知道它是由哪些裝飾者組成的。

  4. 可維護性:當需要添加新的功能時,可以簡單地創建新的裝飾者類,而不是修改現有的類,這符合開閉原則(對擴展開放,對修改封閉)。

  5. 責任分離:裝飾者模式有助于將類的不同職責分離開來,使得各個職責可以獨立地變化和擴展。

使用裝飾者模式而不是繼承的理由:

  1. 避免類的爆炸式增長:如果使用繼承來擴展功能,每個類的新組合都會產生一個新的子類,這可能導致類的數量急劇增加。

  2. 減少繼承的缺陷:繼承是一種靜態的、靜態綁定的關系,它限制了靈活性。裝飾者模式使用組合和動態綁定,提供了更大的靈活性。

  3. 繼承是強耦合的:繼承關系使得基類和子類之間存在強耦合,基類的任何變化都可能影響到子類。裝飾者模式通過組合來實現,耦合度較低。

  4. 繼承層次結構可能很復雜:隨著功能的增加,基于繼承的層次結構可能變得復雜且難以管理。裝飾者模式提供了一種更扁平化和靈活的結構。

  5. 多重繼承問題:Java不支持多重類繼承,但可以有多多個接口。如果需要實現多個不相關的功能擴展,繼承可能無法滿足需求,裝飾者模式可以解決這個問題。

總之,裝飾者模式提供了一種更加靈活和動態的方式來擴展對象的功能,同時避免了繼承可能帶來的問題和限制。

2.1 Java Socket \ TCP & UDP

Socket 由IP地址和端口號唯一確定。

面向鏈接的 Socket (TCP)

面向無連接的 Socket (UDP)

TCP(傳輸控制協議)

  1. 連接導向:TCP 需要在數據傳輸之前建立連接,通過三次握手過程。

  2. 可靠的:TCP 提供可靠的數據傳輸服務,確保數據包正確、按順序地到達目的地。

  3. 面向字節流:TCP 沒有消息邊界,它將數據視為字節流。

  4. 錯誤恢復:TCP 有錯誤檢測和重傳機制,如果數據包丟失或損壞,TCP 會重新發送它們。

  5. 擁塞控制:TCP 有擁塞控制機制,可以在網絡擁塞時減慢數據傳輸速度。

  6. 有序傳輸:TCP 保證數據包的順序傳輸,如果出現亂序,接收方會緩存數據直到可以按順序重組。

  7. 帶寬消耗:由于 TCP 的可靠性和控制機制,它可能會消耗更多的帶寬。

UDP(用戶數據報協議)

  1. 無連接:UDP 是無連接的,它在數據傳輸前不需要建立連接。

  2. 不可靠的:UDP 不保證數據包的到達、順序或完整性,它只是盡可能快地發送數據。

  3. 面向消息:UDP 面向消息,發送的數據被分割成數據報,每個數據報都是獨立的。

  4. 錯誤檢測有限:UDP 只提供了最基本的錯誤檢測,不負責重傳丟失的數據包。

  5. 無擁塞控制:UDP 沒有擁塞控制,即使網絡擁堵,它也會繼續以全速發送數據。

  6. 有序性不保證:UDP 不保證數據包的順序,如果數據包亂序到達,接收方需要自己處理。

  7. 帶寬消耗較少:UDP 由于其簡單性,通常消耗較少的帶寬。

TCP(傳輸控制協議)的三次握手是建立一個可靠的連接所必須的過程。這個過程確保了兩個端點(客戶端和服務器)都能夠接收和發送數據。以下是三次握手的步驟:

  1. SYN(同步序列編號)

    • 客戶端選擇一個初始序列號(ISN,Initial Sequence Number)并發送一個帶有 SYN 標志位設置為 1 的數據包給服務器,以請求建立連接。這表示客戶端準備好發送數據了。
  2. SYN-ACK(同步-確認)

    • 服務器接收到客戶端的 SYN 數據包后,會用自己的初始序列號響應一個 SYN-ACK 數據包。這個響應中 SYN 標志位和 ACK(確認)標志位都被設置為 1。服務器的序列號是它選擇的 ISN,而 ACK 值是客戶端的 ISN 加 1。
  3. ACK(確認)

    • 客戶端接收到服務器的 SYN-ACK 數據包后,會發送一個帶有 ACK 標志位設置為 1 的數據包給服務器,以完成連接建立。客戶端的 ACK 值是服務器的 ISN 加 1。此時,連接建立完成,客戶端和服務器都可以開始發送數據。
2.1 Java 序列化

- 序列化:實現序列化的類需要實現Serializable 接口(標記接口),調用方法為:使用一個輸出流構造一個 ObjectOutputStream 對象,使用其 writeObject 方法來寫出對象。被聲明為 static 和 transient 的數據成員不可以被序列化。

  • 對于 static 數據成員

    • 由于static字段是類級別的,通常不需要序列化。如果你需要保存類的狀態,可以考慮將static字段的值存儲在某個地方,然后在對象反序列化后恢復它們。
    • 例如,你可以使用一個靜態方法來獲取和設置static字段的值,然后在序列化和反序列化過程中手動調用這個方法。
  • 對于 transient 數據成員

    • 如果你需要在反序列化后恢復transient字段的狀態,你可以在反序列化過程中顯式地重新賦值。
    • 一種常見的做法是在類的構造函數或一個單獨的初始化方法中重新設置transient字段的值。

- 外部序列化:自定義讀寫接口

2.2 同步 \ 異步 \ 阻塞 \ 非阻塞

多線程語境下:

- 同步 & 異步:關注任務是否可以被多個線程同時調用,同步是僅可以被一個線程訪問。

- 阻塞 & 非阻塞:關注線程的狀態,阻塞代表線程掛起。

IO語境下:

- 同步 & 異步:關注消息發起和接受的機制,同步是發起一個IO操作后得到返回才進行后續操作,異步是指發起IO操作后不等待返回。通過輪詢、回調等方式等待結果。

- 阻塞 & 非阻塞:關注等待結果的狀態:阻塞指需要等待IO操作結束。

并發 & 并行:并發在同一時刻只有一條指令執行;并行同一時刻多條指令同時執行。

2.3 BIO \ NIO \ AIO

BIO :阻塞式IO;

NIO:基于Selector 的異步網絡 IO( Selector 輪詢所有被注冊的 channel ,一旦發現 Channel 上被注冊的事件發生就可以進行處理)

AIO:基于 Proactor 實現基于事件和回調機制的 I/O 操作方式,允許應用程序在執行 I/O 操作時不被阻塞,從而可以處理其他任務。

1. 每個 socket 鏈接在事件分離器注冊IO完成事件和回調處理;

2. 應用程序需要進行IO時,向分離器發出IO請求,分離器通知系統處理;

3. 系統嘗試IO操作,完成后通知分離器;

4. 分離器檢測到IO完成事件后,激活回調。

2.3 補充 Channel?

在 Java NIO(New Input/Output)庫中,"Channel" 是指可以用于執行 I/O 操作的通道。Java NIO 中的通道類似于傳統的"流",但有一些重要的區別:

  • 通道可以非阻塞,允許單線程處理多個輸入/輸出通道。
  • 通道總是基于緩沖區的,數據從通道讀取到緩沖區,或從緩沖區寫入到通道。

3.1 Collections

Java 中的容器可以分為兩類

Collection:存儲獨立的元素,包括

- List:按插入順序保存元素;eg:LinkedList & ArrayList & Vector;

- Set:不可有重復元素,通過equals 方法來保證唯一;eg:HashSet & TreeSet;

- Queue: 隊列

- Stack:堆棧

Map:存儲鍵值對;eg: HashMap、TreeMap、LinkedHashMap;

3.2?LinkedList & ArrayList & Vector

ArrayList: 數組實現。讀取快,擴容慢。

LinkedList:雙向鏈表;非線程安全。注意:Java標準庫并沒有直接提供一個現成的線程安全的雙向鏈表實現。

Vector:與 ArrayList 相比是線程安全的。

3.3 Map

HashMap: 鍵值與下標的關系由 hashcode 決定,即 hash 桶。僅當 hashcode 和 equals 相同才被認為是一個對象。

Java 8 之前的實現是數組加鏈表

Java 8 之后:采用了數組+樹+鏈表的結構,當鏈表達到最大深度時,重構為紅黑樹。

TreeMap:完全由紅黑樹實現,元素有序。

LinkedHashMap:?

Java 8 之前:為每個數據節點的引用多維護了一份鏈表。

Java 8 中

HashTable : hashtable 為線程安全的,不可存儲 null 值;

WeakHashTable: key值如果沒有外部強引用,垃圾回收時,對應內容也會被移除掉。

ConcurrentHashMap: HashMap 中支持高并發、高吞吐的線程安全版本。包含一個 Segment 數組,結構和 HashMap類似,每個Segment 守護著一個 HashEntry 里的元素,對 HashEntry 數組進行修改時需要先獲得 Segment 鎖。注意,在某些情況下還是存在線程不安全的可能,例如?map.pub 方法不是一個原子操作。所以在進行操作時最好在線程里對操作加鎖。

3.4 Set

HashSet:HashSet 內部通過 HashMap 實現,所有的值使用相同的 value。同樣,其不是線程安全的。

LinkedHashSet:可維護插入數據的順序。底層是 LinedHashMap。

TreeSet:底層使用 TreeMap 來存儲數據

3.5 BlockingQueue

生產者線程在倉庫裝滿之后會被阻塞,消費者線程則實在倉庫清空后阻塞。

ArrayBlockingQueue:基于數組實現的有界 BlockingQueue,陷入先出。線程安全。

LinkedBlockingQueue:使用了雙鎖隊列算法。線程安全。

PriorityBlockingQueue:隊頭元素是隊列的最小元素。使用的最小堆結構。

ConcurrentLinkedQueue: 非阻塞的線程安全隊列。采用的CAS 方式保證。

DelayQueue:阻塞的優先隊列,管理的對象必須要實現util.concurrent.delayed接口,其線程安全由重入鎖實現。

3.5 - 補充 CAS 算法

CAS(Compare-And-Swap,比較并交換)算法是一種用于并發控制的技術,主要用于多處理器系統中實現原子操作。CAS操作通常由三個參數組成:內存位置(V),預期值(A)和新值(B)。基本思想是,如果內存位置的當前值與預期值相匹配,那么將內存位置的值更新為新值。如果不相匹配,操作則不執行任何操作或回滾。

3.7?迭代器

使用 Iterator 遍歷容器時,如果對容器增加或者刪除操作操作就會改變容器數量,導致拋出異常。解決方法:使用線程安全的容器來做迭代器。eg: ConcurrentHashMap 等。

3.8 并行數組操作

例如 parallexXXX 方法,使用多線程進行操作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38667.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38667.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38667.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Invalid mapping pattern】SpringMVC路徑匹配

報錯: Description:Invalid mapping pattern detected: /**/{[path:[^.]] ^ No more pattern data allowed after {...} or ** pattern elementAction:Fix this pattern in your application or switch to the legacy parser implementation with spring.mvc.pathm…

VLC for Unity播放RTSP延遲高的解決辦法

VLC for Unity播放RTSP延遲高的解決辦法&#xff1a; 設置網絡緩存時長network-caching100 public void Open(){Log("VLCPlayerExample Open");if (mediaPlayer.Media ! null)mediaPlayer.Media.Dispose();List<string> options new List<string>();o…

Eureka在微服務架構中的服務降級策略解析

引言 微服務架構因其靈活性和可擴展性而受到現代軟件開發的青睞。然而&#xff0c;隨著服務數量的增加&#xff0c;系統的復雜性也隨之上升&#xff0c;服務間的依賴關系可能導致單點故障&#xff0c;影響整個系統的穩定性。服務降級是一種常見的應對策略&#xff0c;用于在服…

基于RabbitMQ的異步消息傳遞:發送與消費

引言 RabbitMQ是一個流行的開源消息代理&#xff0c;用于在分布式系統中實現異步消息傳遞。它基于Erlang語言編寫&#xff0c;具有高可用性和可伸縮性。在本文中&#xff0c;我們將探討如何在Python中使用RabbitMQ進行消息發送和消費。 安裝RabbitMQ 在 Ubuntu 上安裝 Rabbi…

提升寫作效率:探索AI在現代辦公自動化中的應用

工欲善其事&#xff0c;必先利其器。 隨著AI技術與各個行業或細分場景的深度融合&#xff0c;日常工作可使用的AI工具呈現出井噴式發展的趨勢&#xff0c;AI工具的類別也從最初的AI文本生成、AI繪畫工具&#xff0c;逐漸擴展到AI思維導圖工具、AI流程圖工具、AI生成PPT工具、AI…

精通SQL Server端口管理:添加與刪除監聽端口的指南

引言 SQL Server的端口管理是數據庫管理員(DBA)必須掌握的關鍵技能之一。端口配置不僅關系到數據庫的網絡通信能力&#xff0c;還直接影響到數據庫的安全性和性能。本文將詳細介紹如何在SQL Server中添加和刪除監聽端口&#xff0c;以及相關的配置策略和最佳實踐。 SQL Serve…

ubuntu 系統中 使用docker 制作 Windows 系統,從此告別 vmware虛擬機

我的系統是 ubuntu 24 前期準備工作&#xff1a; 安裝dockerdocker pull 或者 手動制作鏡像 docker build 的話 必須要 科學上網&#xff0c; 好像阿里鏡像都下不下來。需要 知道 docker 和docker compose 命令的使用方式 我是給docker 掛了 http代理 如果你能pull下來鏡像 …

springboot健身房管理系統-計算機畢業設計源碼031807

摘 要 大數據時代下&#xff0c;數據呈爆炸式地增長。為了迎合信息化時代的潮流和信息化安全的要求&#xff0c;利用互聯網服務于其他行業&#xff0c;促進生產&#xff0c;已經是成為一種勢不可擋的趨勢。在健身房管理的要求下&#xff0c;開發一款整體式結構的健身房管理系統…

Windows環境使用SpringBoot整合Minio平替OSS

目錄 配置Minio環境 一、下載minio.exe mc.exe 二、設置用戶名和密碼 用管理員模式打開cmd 三、啟動Minio服務器 四、訪問WebUI給的地址 SpringBoot整合Minio 一、配置依賴&#xff0c;application.yml 二、代碼部分 FileVO MinioConfig MinioUploadService MinioController 三…

使用Python繪制太陽系圖

使用Python繪制太陽系圖 太陽系圖太陽系圖的優點使用場景 效果代碼 太陽系圖 太陽系圖&#xff08;Sunburst Chart&#xff09;是一種層次結構圖表&#xff0c;用于表示數據的分層結構。它使用同心圓表示各個層級&#xff0c;中心圓代表最高層級&#xff0c;向外的圓環代表逐級…

CCT技術

概念介紹 多個功能核心的集成可以通過片上系統(SOC)或封裝中系統(SIP)設備的開發來實現。SOC器件將核心集成到單個集成電路中。SIP集成是將多個集成電路組合到單個封裝中。核心數量 的增加可能導致必要的測試人員資源和/或測試時間的增加。這直接影響了與測試這些設備相關的…

CesiumJS【Basic】- #031 繪制虛線(Entity方式)

文章目錄 繪制虛線(Entity方式)1 目標2 代碼2.1 main.ts繪制虛線(Entity方式) 1 目標 使用Entity方式繪制虛線 2 代碼 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer(

SAP實現特別總賬的憑證預制

SAP實現特別總賬的憑證預制 仔細理解只有”其他”的特殊總帳標識才可預制憑證這句話. F-29/f-48不可預制。F-29/f-48預制時出現錯誤消息號 FP 030&#xff0c;提示特殊總帳標志類型“匯票和”預付定金“的特別總帳標志的過帳代碼不能預制&#xff0c;這是系統寫死的&#xff…

現在電氣真的比不過計算機嗎 ?

電氣工程和計算機科學在今天的科技和工業領域中各有其重要性和發展空間&#xff0c;并不存在簡單的比較誰“比不過”誰的情況。我收集制作一份plc學習包&#xff0c;對于新手而言簡直不要太棒&#xff0c;里面包括了新手各個時期的學習方向&#xff0c;包括了編程教學&#xff…

Pycharm的終端(Terminal)中切換到當前項目所在的虛擬環境

1.在Pycharm最下端點擊終端/Terminal, 2.點擊終端窗口最上端最右邊的∨&#xff0c; 3.點擊Command Prompt&#xff0c;切換環境&#xff0c; 可以看到現在環境已經由默認的PS(Window PowerShell)切換為項目所使用的虛擬環境。 4.更近一步&#xff0c;如果想讓Pycharm默認顯示…

Linux常用工具使用方式

目錄 常用工具&#xff1a; 安裝包管理工具&#xff1a; 查找含有關鍵字的軟件包 安裝軟件 安裝文件傳輸工具 安裝編輯器 C語言編譯器 C編譯器 安裝調試器 安裝項目版本管理工具 cmake 卸載軟件 安裝jsoncpp 安裝boost庫 安裝mariadb 安裝tree&#xff08;讓目錄…

基于Java的區塊鏈數字身份認證

基于Java的區塊鏈數字身份認證 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討基于Java的區塊鏈數字身份認證&#xff0c;這是區塊鏈技術在安全領…

潛水耳機哪個牌子好?用戶精選,這四款潛水耳機質量上乘!

在這個快節奏的時代&#xff0c;人們越來越渴望在運動中也能享受到音樂的陪伴。潛水&#xff0c;作為一種獨特的水下運動&#xff0c;自然也不例外。然而&#xff0c;并非所有的耳機都能承受水下的壓力和環境&#xff0c;這就要求我們對潛水耳機有著更高的要求。作為一名資深的…

數據庫鎖之間有哪些區別?

寫在前面: 此博客內容已經同步到我的博客網站,如需要獲得更優的閱讀體驗請前往https://mainjaylai.github.io/Blog/blog/database/lock 以下是數據庫中常用的幾種鎖類型: 1. 共享鎖(Shared Lock,S Lock) 共享鎖允許多個事務同時讀取同一資源,但不能修改該資源。其他事…

Kubernetes的發展歷程:從Google內部項目到云原生計算的基石

目錄 一、起源與背景 1.1 Google的內部項目 1.2 Omega的出現 二、Kubernetes的誕生 2.1 開源的決策 2.2 初期發布 三、Kubernetes的發展歷程 3.1 社區的成長 3.2 生態系統的壯大 3.3 重大版本和功能 3.4 多云和混合云的支持 四、Kubernetes的核心概念 4.1 Pod 4.…