邪修實戰系列(1)


1、第一階段邪修實戰總覽(9.1-9.30)

把第一階段(基礎夯實期)的學習計劃拆解成極具操作性的每日行動方案。這個計劃充分利用我“在職學習”的特殊優勢,強調“用輸出倒逼輸入”,確保每一分鐘的學習都直接服務于面試和實戰。

  • 核心目標:構建起Java后端開發的知識樹主干,并能通過一個小型項目串聯起所有知識點。
  • 核心策略:每天3小時雷打不動的高效學習(工作日可分散,周末集中攻堅)。

2、周目標(9.1-9.14)

Java核心+Sprig Boot破冰,能獨立使用Spring搭建Web后端并提供RESTful接口。


3、分日目標與邪修技巧

3.1、Day 9.1-9.2: Java基礎(變量、循環、條件分支、字符串操作)

  • 行動:安裝JDK、IDE(IntelliJ IDEA),配置好環境。在菜鳥教程中學Java的變量、循環、條件分支、字符串操作這幾個板塊的內容,并用IDEA寫一個簡單的控制臺程序,我這里做了一個類似的程序叫"Data_Board",這是一個用Java編寫的廣告數據展示程序,采用面向對象設計思想重構,能夠從Excel文件讀取廣告數據,展示廣告花費、線索數量等關鍵指標,并提供多日期數據對比分析功能。程序支持數據自動計算(單個線索成本、私信轉化成本)和趨勢分析,具備良好的可擴展性和維護性。
  • 邪修技巧:可以用TREA寫項目的README,定時更新一下,這樣后期我們面試之前可以仔細看看自己項目的編寫流程。
  • 學習分享:這一階段的下載安裝就先不跟大家分享了,沒有那么多時間寫哈哈哈,如果大家有疑問想了解可以私聊我哈~這幾天的程序我會綜合在day5-day6中分享出來。

3.2、Day 9.3-9.4: Java面向對象(類、對象、繼承、多態、接口)

  • 行動:在菜鳥教程中學Java的類、對象、繼承、多態、接口這幾個板塊的內容,將前兩天的"Data_Board"改造成面向對象風格。定義AdCampaign類,包含名稱、花費、收入等屬性,并封裝計算方法。
  • 邪修技巧:思考為公司寫的那個程序,如果用OOP思想重構,該怎么設計?把這個思考過程寫在代碼注釋里,面試時可以聊。

3.3、Day 9.5-9.6: Java集合框架(List, Map, Set)和IO操作

  • 行動:在菜鳥教程中學Java的List、Map、Set和IO操作這幾個板塊的內容,編寫程序從Excel文件(模擬數據源)讀取廣告數據,存入ArrayList或HashMap,并進行統計計算。
  • 邪修技巧:這是面試重點。每學一個集合類,就去查一下它的底層實現(比如HashMap是數組+鏈表/紅黑樹),記下一兩句源碼分析,面試時拋出來是巨大加分項。

3.3.1、學習分享

  • 根據前幾天所學,制作了一個采用面向對象設計思想重構,能夠從Excel文件讀取廣告數據,展示廣告花費、線索數量等關鍵指標,并提供多日期數據對比分析功能。程序支持數據自動計算(單個線索成本、私信轉化成本)和趨勢分析,具備良好的可擴展性和維護性。我把具體的代碼和README文檔放到了github里,點擊鏈接進入Data_Board-README文檔可以查看、下載并學習。
  • 由于本人也是第一次正式使用Github來管理自己的代碼,以前總是自己存儲,所以現在也是仔細學了一下。給大家推薦幾個博客,大家如果想仔細學一下Github的話可以借鑒一下:
    • Github入門教程,適合新手學習(非常詳細),這個博客的內容比較全面,有對GitHub和Git的介紹以及使用教程,唯一缺點是比較長,適合靜下心來仔細查看。
    • 【2025版】最新GitHub新手用法詳解(適合新手入門)零基礎入門到精通,收藏這篇就夠了_github使用詳解,相較于上一篇博客,針對于Github和Git的講解少一點,但是基礎使用都是有的,趕進度可以試試。
    • 如何解決:ssh: connect to host github.com port 22: Connection refused,這篇文檔解決了本地機器嘗試通過 SSH 協議連接 GitHub 的 22 端口時,連接被拒絕了的問題,如果你看不懂這個問題,你就切記當你碰到ssh: connect to host github.com port 22: Connection refused時,來找這個博客就行啦,別整什么防火墻、服務器之類的,就是個簡單的端口問題,跟著這個博客一步步解決即可。

3.3.2、集合類分析思考

ArrayList:
  • 底層實現:基于動態數組(transient Object[] elementData),默認初始容量10,支持自動擴容。
  • 擴容機制:當添加元素導致不足時,通過grow()方法擴容,新容量為oldCapacity + (oldCapacity >>1)(即1.5倍),使用Array.copyof()復制數組元素。
    • oldCapacity + (oldCapacity >>1)是ArrayList擴容時計算“新容量”的核心公式,作用是把當前容量擴大到原來的1.5倍。
    • >> 是 Java 里的 “右移運算符”,簡單說就是 把一個數在二進制里往右挪幾位,效果相當于 “除以 2 的 n 次方”(n 是右移的位數)。這里用的是 oldCapacity >> 1(右移 1 位),效果就等于 oldCapacity ÷ 2(只取整數部分)。
  • 關鍵代碼:
// 添加元素時的擴容判斷
ensureCapacityInternal(size + 1);  // 確保容量足夠:檢查一下,現在的夠不夠再放 1 個新元素
elementData[size++] = e;  // 直接在數組末尾賦值:添加新元素,并記錄現在的大小
// 代碼分析:
// 先確認有地方放新元素(不夠就擴容),然后把元素放到最后一個空位置,再更新已有的元素數量。
// ensureCapacityInternal(...):這是個 “檢查容量” 的工具方法,它會做兩件事:1、看看當前elementData的長度(也就是 “總抽屜數”)夠不夠裝size + 1個元素。2、如果夠(比如總抽屜數 10,要放第 10 個),就啥也不做,直接下一步;如果不夠(比如總抽屜數 10,要放第 11 個),就觸發 “擴容”(把抽屜數變成 15),然后再下一步。
// elementData[size] = e:往 “元素數組” 的第size個位置放新元素。因為size是 “當前已有的數量”,所以第size個位置正好是 “下一個空位置”。比如現在有 3 個元素(size=3),空位置就在索引 3 的位置,直接把新元素放進去。size++:放完之后,“已有的數量” 要加 1(比如原來 3 個,現在變成 4 個)。
LinkedList:
  • 底層實現:基于雙向鏈表,每個節點(Node)包含prev(前驅)、next(后繼)指針和實際元素item。
  • 源碼關鍵分析:插入 / 刪除效率高(無需移動元素),查詢需遍歷。
// 節點結構定義
private static class Node<E> {E item;Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}
}
// 添加到尾部:直接修改尾節點的next指針
void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null) first = newNode;else l.next = newNode;size++;
}
HashMap
  • 底層實現:基于數組 + 鏈表 + 紅黑樹,數組(Node<K,V>[] table)是主體,鏈表用于解決哈希沖突,當鏈表長度 > 8 且數組容量≥64 時轉為紅黑樹。
    • 數組+鏈表+紅黑樹的底層核心結構可以想象成一個帶編號的多層貨架:
    • 第一層:數組(哈希表,Node<K,V>[] table)。這是最基礎的“大格子”,每個格子有唯一編號(索引),默認初始容量是16(必須是2的冪次,比如16、32、64…)。每個格子里可以放“鏈條”或“小數”。
    • 第二層:鏈表(解決哈希沖突)。當多個“商品”(key-value)計算后落到同一個“大格子”里時,會像串珠子一樣練成鏈表(每個節點Node有next指針,指向后一個節點)。
    • 第三層:紅黑樹(優化長鏈表查詢)。當一個格子里的鏈表太長(默認超過8個節點),且整個貨架的大格子數量>=64時,鏈表會自動轉成紅黑樹(一種平衡二叉樹)。樹的查詢效率比長鏈表高很多(從O(n)降到O(logn))。
  • 哈希計算:通過(key.hashCode() ^ (key.hashCode() >>> 16))擾動哈希值,再用(n-1) & hash計算數組索引(n 為數組容量)。
  • 哈希沖突:也叫哈希碰撞,是哈希表(如 HashMap)在存儲數據時必然可能遇到的問題。根本原因是哈希函數的 “輸出范圍”(數組索引的數量)是有限的,但 “輸入范圍”(可能的 key 數量)是無限的。比如數組長度只有 16(索引 0~15),但可能的 key 可以是 “蘋果”“橙子”“西瓜”…… 無數個,有限的索引必然會被無限的 key “重復占用”,沖突無法完全避免,只能盡量減少。
  • 擴容機制:容量為 2 的冪次,擴容時通過resize()方法將元素重新哈希分配,紅黑樹可能拆分為鏈表。
  • 關鍵代碼:
// 計算哈希值(減少碰撞)
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
// 樹化判斷(JDK 1.8新增)
if (binCount >= TREEIFY_THRESHOLD - 1) // TREEIFY_THRESHOLD = 8treeifyBin(tab, hash);
HashSet
  • 底層實現:基于HashMap,元素存儲在HashMap的key中,value固定為一個靜態常量(PRESENT = new object()).
  • 特點:無序、不可重復,依賴HashMap的key去重(通過hashCode()和equals()判斷)。
    • 無序:元素的存儲順序不固定,因為HashMap的key是無序的;
    • 去重:依賴HashMap的key不重復(靠hashCode()和equals()判斷);
    • 線程不安全:和HashMap一樣,多線程操作可能出問題;
    • 查詢/增刪效率高:平均時間復雜度是O(1),因為HashMap的核心操作效率高。
  • HashSet里,不同元素可能算出相同哈希值(比如“蘋果”和“橙子”哈希值都是123),這是必須要再用equals()確認“到底是不是真的相同”,避免把“不同元素誤判為重復”。必須同時滿足兩個條件:
    • a.hashCode() == b.hashCode():兩個元素的哈希值相等(哈希值是元素的“數字身份證”,由hashCode()方法計算);
    • a.equals(b) == true:兩個元素通過equals()方法比較,結果為“相等”。
  • 關鍵代碼:
// 添加元素實際調用HashMap的put()
public boolean add(E e) {return map.put(e, PRESENT) == null;  // 若key不存在則添加,返回true
}
// HashMap 的 put 方法有個規則:如果 key 不存在,就新增 key-value,返回 null;如果 key 已存在,就覆蓋 value,返回 “舊的 value”;
//所以 HashSet 的 add 方法:如果返回 true,說明 “元素是新的,添加成功”;如果返回 false,說明 “元素已存在,添加失敗”—— 這就實現了 “去重”。

總結

  • ArrayList 添加元素時,會先通過 ensureCapacityInternal 檢查容量夠不夠,不夠就擴容;夠的話直接把元素放到數組的末尾(elementData [size] 的位置),然后把元素數量 size 加 1。
  • LinkedList 底層是雙向鏈表,每個節點存前后指針和元素。增刪快(改指針即可,不用挪元素),查詢慢(得從頭 / 尾遍歷)。適合頻繁增刪、少查詢的場景,和 ArrayList(數組,查快增刪慢)互補。
  • HashMap 靠 “數組 + 鏈表 + 紅黑樹” 的結構,結合哈希計算和動態擴容,實現了高效的鍵值對存儲。核心特點是:查詢、增刪效率高(平均 O (1)),key 不重復(依賴hashCode()和equals()),線程不安全,適合頻繁查詢和修改的場景。
  • HashSet底層基于 HashMap 實現,把要存的元素作為 HashMap 的 key,用一個固定對象當 value,借 HashMap 的 key 去重特性實現自己的功能,特點是無序、不重復、效率高。

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

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

相關文章

XR數字融合工作站打造智能制造專業學習新范式

智能制造是工業4.0的核心發展方向&#xff0c;涵蓋數字化設計、智能生產、工業機器人、數字孿生、物聯網等關鍵技術。然而&#xff0c;傳統教學模式在設備成本高、實訓風險大、抽象概念難理解等方面存在諸多挑戰。XR數字融合工作站,利用VR/AR/MR等技術&#xff0c;通過虛擬仿真…

基于FPGA實現數字QAM調制系統

基于FPGA實現數字QAM調制系統題目要求一、代碼設計1.頂層2.分頻3.m序列4.串轉并5.映射6.正弦波余弦波生成ROM和7.ask二、仿真波形總結題目要求 FPGA實現數字QAM調制系統要求根據正交振幅調制原理&#xff0c;利用正弦載波信號發生器&#xff0c;實現調制信號。調制原理會利用到…

DAY 22 復習日

浙大疏錦行復習日 仔細回顧一下之前21天的內容&#xff0c;沒跟上進度的同學補一下進度。 作業&#xff1a; 自行學習參考如何使用kaggle平臺&#xff0c;寫下使用注意點&#xff0c;并對下述比賽提交代碼 導入需要的庫 import pandas as pd # 用于數據處理和分析&#xff0c;…

biocmanager安裝 庫 老是提示網絡連接錯誤 才嘗試各種辦法

您好&#xff0c;遇到 BioManager &#xff08;通常是 BiocManager&#xff09;安裝R包時提示網絡連接錯誤確實非常令人頭疼。這通常與R/RStudio的配置、網絡環境&#xff08;尤其是國內用戶&#xff09;或SSL證書問題有關。 請不要著急&#xff0c;我們可以按照從易到難的順序…

【開題答辯全過程】以 智能商品數據分析系統為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

解構復雜財務逆向業務:如何優雅地生成與管理負數單?

文章目錄一 核心復雜性二 關鍵設計模式&#xff1a;三 棘手場景與解決方案&#xff1a;1.分批合并處理&#xff1a;負數單需能智能拆分&#xff0c;精準沖銷多批次的正向單據。2.優先級問題&#xff1a;3.超額處理&#xff1a;系統應堅決攔截而非處理&#xff0c;防止資金損失和…

Android集成OpenCV4實例

Android集成OpenCV4分以下幾步驟&#xff1a; 使用Android Studio Giraffe | 2022.3.1創建一個Empty Views Activity空項目&#xff0c;包名為&#xff1a;com.example.andopencvdemo00 &#xff0c; 創建成功后&#xff0c;進行以下相關設置&#xff1a; 第一步&#xff1a;在…

npy可視化方法

npviewer 是一個應用程序&#xff0c;它允許您以熱圖的形式可視化 numpy 的 npy 文件中的數據。該應用程序根據不同的模式自動選擇適當的維度進行顯示。 根據不同的模式自動選擇適當的維度進行顯示支持不同格式的 numpy 數據的可視化&#xff0c;如 RGB 和灰度用戶友好的界面使…

【Cesium】介紹及基礎使用

文章目錄一、Cesium 介紹二、 使用1、引入 cesium2、Viewer 配置選項1. 基礎控件配置2. 場景與渲染配置3. 地形配置4. 天空與大氣效果3、坐標系系統3.1 地理坐標系3.2 笛卡爾空間直角坐標系3.3 屏幕坐標系4、Entity 實體4.1 簡介4.2 Entity 常見圖形類型Point 點Polyline 線Pol…

基于SpringBoot的運動服裝銷售系統【2026最新】

作者&#xff1a;計算機學姐 開發技術&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源碼”。 專欄推薦&#xff1a;前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄&#xff1a;…

【嵌入式DIY實例-ESP32篇】-傾斜彈跳球游戲

傾斜彈跳球游戲 文章目錄 傾斜彈跳球游戲 1、MPU6050介紹 2、硬件準備與接線 3、代碼實現 在這個交互式 ESP32 Arduino 項目中,我們模擬了一個綠色球體在全彩 ST7789 170320 LCD 屏幕上彈跳,完全由 MPU6050 陀螺儀的運動控制。當你傾斜傳感器時,球體會呈現出逼真的物理運動,…

從spring MVC角度理解HTTP協議及Request-Response模式

什么是HTTP協議&#xff1f;HTTP協議&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;是一種通信規則&#xff0c;它定義了客戶端&#xff08;如瀏覽器、手機APP&#xff09; 和服務器 之間如何交換信息&#xff0c;是用于在萬維網&#xff08;…

江協科技STM32學習筆記補充之003 :STM32復位電路的詳細分析

電路作用與每個器件R1&#xff08;10 kΩ&#xff0c;上拉到 3V3&#xff09;讓 NRST 在無外力時保持高電平&#xff1d;不復位&#xff1b;同時與電容形成 RC&#xff0c;決定上電復位延時。阻值不能太小&#xff08;否則調試器或芯片復位驅動下拉電流太大&#xff09;&#x…

Spring Boot HTTP狀態碼詳解

Spring Boot HTTP狀態碼完全指南&#xff1a;從入門到精通 前言 在RESTful API開發中&#xff0c;HTTP狀態碼是與客戶端通信的重要橋梁。Spring Boot通過HttpStatus枚舉提供了完整的HTTP狀態碼支持。本文將深入解析這些狀態碼的含義、使用場景以及在Spring Boot中的最佳實踐。 …

怎樣讓外網計算機訪問局域網計算機?通過公網地址訪問不同內網服務的設置方法

局域網服務器提供公網訪問&#xff0c;或指定某些端口應用資源給外地訪問&#xff0c;都是常見跨網通信需求。在一些場景下&#xff0c;內部網絡中的服務器需要通過公網地址進行訪問&#xff0c;尤其是在沒有固定公網IP或需要在外部訪問時。為了解決這一問題&#xff0c;可以使…

Spring Boot啟動失敗從循環依賴到懶加載配置的深度排查指南

&#x1f49d;&#x1f49d;&#x1f49d;歡迎蒞臨我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 持續學習&#xff0c;不斷…

從零開始學大模型之大語言模型

大語言模型 4.1 什么是 LLM 在前三章&#xff0c;我們從 NLP 的定義與主要任務出發&#xff0c;介紹了引發 NLP 領域重大變革的核心思想——注意力機制與 Transformer 架構。隨著 Transformer 架構的橫空出世&#xff0c;NLP 領域逐步進入預訓練-微調范式&#xff0c;以 Tran…

如何將視頻從 iPhone 轉移到 Mac

將視頻從 iPhone 轉移到 Mac 是許多用戶常見的需求。無論你是想備份重要的視頻&#xff0c;還是希望在更大的屏幕上觀看&#xff0c;以下方法都能幫助你輕松完成。方法一&#xff1a;使用 iReaShare iPhone ManageriReaShare iPhone Manager 是一款功能強大的工具&#xff0c;可…

五、Docker 核心技術:容器數據持久化之數據卷

Docker 容器本身是無狀態且生命周期短暫的。當一個容器被刪除時&#xff0c;它在可寫層產生的所有數據都會隨之消失。這對于需要持久化存儲數據的應用 (如數據庫、日志系統、用戶上傳內容) 來說是不可接受的。為了解決這個問題&#xff0c;Docker 提供了多種數據持久化方案&…

前端視覺交互設計全解析:從懸停高亮到多維交互體系(含代碼 + 圖表)

在前端用戶體驗領域&#xff0c;視覺交互是連接用戶與產品的 “隱形橋梁”—— 它通過可視化信號傳遞操作意圖、反饋系統狀態&#xff0c;直接決定用戶對產品的感知。很多開發者對視覺交互的認知停留在 “鼠標懸停高亮”&#xff0c;但實際上&#xff0c;視覺交互是一個覆蓋 “…