java小結(一)

java(上)

模塊一

1.JDK,JRE,JVM

知識點

核心內容

易混淆點

JDK定義

Java Development Kit(Java開發工具包),包含開發所需全部工具

JDK包含JRE的關系容易混淆

JRE定義

Java Runtime Environment(Java運行環境),包含JVM和核心類庫

JRE與JDK的包含關系

JVM作用

Java虛擬機,實現跨平臺運行的核心組件

JVM在JRE中的位置

開發工具

包含javac(編譯)、java(運行)、jdb(調試)、jhat(內存分析)等工具

各工具的具體用途區分

版本變化

JDK 9開始取消獨立JRE目錄,采用模塊化技術優化運行時環境

新舊版本目錄結構差異

模塊化優勢

允許創建最小運行時環境,提高運行效率,減少資源占用

與傳統JRE部署方式的對比

安裝建議

只需安裝JDK即可獲得完整開發環境(包含JRE和JVM)

JDK版本選擇注意事項

2.API文檔注釋

知識點

核心內容

重點

文檔注釋的作用

通過Javadoc生成API文檔,幫助他人快速理解代碼功能、類用途及方法說明

需區分普通注釋與文檔注釋的語法差異(/?**? */ vs //或/* */)

Javadoc命令語法

javadoc -d [文件夾名] -author -version [文件名.java]

參數順序易錯(如-d必須在前),忽略警告可能影響文檔完整性

API文檔結構

包含類描述、作者、版本、方法功能說明(如main為程序入口)

方法注釋需標注參數(@param),否則生成警告

文檔注釋內容規范

類注釋需說明整體功能,方法注釋需明確用途(如main是虛擬機執行入口)

注解(@author、@version)需與注釋內容分離

3.print與println區別

知識點

核心內容

重點

print與println的區別

print和println都是輸出語句

區分print和println的輸出效果

println輸出后自帶換行效果

println輸出后會自動換到下一行

print輸出后不帶換行效果

print輸出后會繼續在同一行顯示后續內容

JAVA操作小技巧

復制當前行:ctrl+d

快捷鍵使用,提高編碼效率

一次操作多行:預留空間,按住ALT鍵不放,鼠標往下拉

適用于需要同時編輯多行代碼的情況

模塊二

4.常量

知識點

核心內容

重點

常量定義

在代碼運行過程中,其值不會發生改變的數據

區分常量與變量的關鍵:值是否可變

整數常量

包含所有正負整數(如 -1, 0, 100)

無特殊易錯點

小數常量

帶小數點的數值(如 2.5, 2.0)

易混淆點:2.0 是小數常量而非整數

字符常量

單引號包裹的單個內容(如 'A', ' ', '\t')

必須且只能有一個字符: - '11' 無效(兩個字符); - ' ' 有效(空格算一個字符)

字符串常量

雙引號包裹的任意內容(如 "Hello", "")

空字符串 "" 是有效數據,與 null 不同

布爾常量

僅 true/false(不加引號)

易錯點:"true" 是字符串而非布爾值

空常量(null)

表示數據不存在(如 null)

與空字符串區別: - null:數據不存在; - "":數據存在但內容為空

5.常量使用

知識點

核心內容

重點

常量使用

常量定義與分類

常量在程序中的不變性

整數常量

輸出整數常量示例(-1)

整數常量的正負性

小數常量

輸出小數常量示例(1.5,1.0)

小數點后即使為零也算小數常量

字符常量

單引號中必須有且只能有一個內容

單引號中多個字符會報錯

- 空格作為字符常量

空格也算一個字符內容

與多個空格區分(不算字符常量)

- Tab鍵作為字符常量

Tab鍵算一個字符內容

與四個空格的區分

字符串常量

雙引號中可以包含任意字符

空字符串也是合法的

布爾常量

true和false為布爾常量

布爾常量與字符串的區別

空常量

空常量代表數據不存在

空常量不能直接輸出使用

6.變量定義與使用

知識點

核心內容

重點

byte類型

byte num1 = 100; 取值范圍限制(-128~127)

超出范圍會編譯報錯,如byte num1 = 1000;

short類型

short num2 = 1000; 可重新賦值num2 = 1001;

變量值可動態修改,體現"變量"特性

int類型

int num3 = 10000; 默認整數類型(±21億范圍)

直接輸出變量名即可顯示存儲的值

long類型

long num4 = 10L; 需加后綴L/l

必須加L/l后綴,涉及數據類型轉換原理

float類型

float num5 = 2.5f; 需加后綴F/f

必須加F/f后綴,與double區別

double類型

double num6 = 2.5; 默認小數類型

無需后綴,直接賦值小數

char類型

char num7 = 'a'; 單引號單字符

必須單引號且只能一個字符

boolean類型

boolean num8 = true; 可重新賦值num8 = num9;

變量值傳遞機制(引用關系)

String類型

String name = "金蓮"; 雙引號字符串

屬于引用類型但定義格式類似基本類型

7.轉義字符

知識點

核心內容

重點

轉義字符定義

反斜杠在定義變量時代表轉義字符,可轉換字符含義

區分普通字符與轉義字符的語法差異

轉義字符功能

1. 將普通字符轉為特殊含義字符; 2. 將特殊字符轉為普通字符

反斜杠n與println的換行效果對比

常見轉義符示例

- \n換行符; - \t制表符(Tab鍵效果)

記憶\n與\t的具體應用場景

路徑表示問題

單反斜杠引發非法轉義符錯誤,需用\\表示真實反斜杠

雙反斜杠的轉義原理理解

8.標識符

知識點

核心內容

重點

標識符定義

給類、方法、變量取的名字

區分標識符與關鍵字

硬性規定

1. 可包含:英文字母、數字、$、_; 2. 不能以數字開頭; 3. 不能是關鍵字(如static、public)

數字開頭的錯誤示例:int 1I

軟性建議

1. 類名:大駝峰式(每個單詞首字母大寫); 2. 方法/變量名:小駝峰式(首單詞小寫,后續單詞首字母大寫); 3. 見名知意,禁用中文

類名示例:Demo08; 變量名示例:publicStatic

關鍵字沖突

避免使用Java預定義關鍵字(如static、public)

組合非關鍵字可用(如publicStatic)

9.強轉注意事項

知識點

核心內容

重點

byte/short類型自動轉換

當使用整數常量賦值且不超出范圍時,JVM會自動強轉

常量賦值無需手動強轉 vs 變量參與需手動強轉

類型提升規則

byte/short運算時自動提升為int型

b=b+1會報錯需強制轉換

char類型運算特性

參與運算時自動提升為int型

會查詢ASCII/Unicode碼表轉換

ASCII碼表應用

英文字符對應整數值查詢表

字符'0'=48/'A'=65/'a'=97的規律

Unicode碼表擴展

處理ASCII范圍外的字符(如中文)

漢字"中"=20013的編碼原理

強制轉換語法

(byte)(b+1)的括號使用技巧

整體表達式轉換 vs 局部變量轉換

模塊三

10.idea常用快捷鍵

知識點

核心內容

重點

常用快捷鍵

Alt+回車:導入包及自動修正代碼

快捷鍵的使用和自動修正功能

自動修正代碼示例

int I = 2.5報錯,Alt+回車選擇cast to int修復

強制類型轉換的自動修復

變量重名問題

在同一作用域內不能定義重名變量

變量命名規則和錯誤處理

無變量接收值問題

直接寫100會報錯,Alt+回車自動生成變量接收

變量定義和錯誤處理

導包操作

使用Scanner類需要導包,Alt+回車自動導包

類的導入和包管理

刪除行快捷鍵

Ctrl+Y:刪除光標所在行

快捷鍵的使用和代碼編輯效率

復制當前行

Ctrl+D:復制當前行代碼

快捷鍵的使用和代碼編輯效率

格式化代碼

Ctrl+Alt+L:格式化代碼

代碼格式化和可讀性提升

單行注釋

Ctrl+/:單行注釋

注釋的使用和代碼管理

多行注釋

Ctrl+Shift+/:多行注釋

注釋的使用和代碼管理

移動當前行

Alt+Shift+上下箭頭:移動當前行代碼

代碼編輯和重構效率

自動生成變量

先寫等號右邊,Alt+回車選擇introduce local variable生成左邊變量

變量定義和代碼自動化

11.賦值運算符

知識點

核心內容

重點

基本賦值運算符

使用等號(=)進行賦值操作,先計算右邊表達式再將結果賦給左邊變量

必須區分賦值方向(右→左)與數學等號的區別

復合賦值運算符

包含+=、-=、*=、/=、%=等組合運算符

b += 1與b = b + 1不等價(前者自動類型轉換)

類型轉換規則

變量參與運算時自動提升為int型,常量賦值不超范圍則無需轉換

byte/short運算必須手動強轉,復合運算符例外

復合運算符特性

虛擬機對+=等操作自動處理類型轉換,無需顯式強轉

實際開發中優先使用復合運算符簡化代碼

12.與或運算符

知識點

核心內容

易混淆點

代碼驗證示例

單與(&)運算符

1. 布爾型運算:有假則假; 2. 數字型運算:按位與; 3. 無短路效果(前為假仍執行后面判斷)

與雙與的短路效果區別

int a=10,b=20; boolean r=(++a>100) & (++b>10);; 結果:a=11,b=21

雙與(&&)運算符

1. 布爾型運算:有假則假; 2. 有短路效果(前為假則跳過后面判斷)

不能用于數字位運算

int a=10,b=20; boolean r=(++a>100) && (++b>10);; 結果:a=11,b=20

單或(|)運算符

1. 布爾型運算:有真則真; 2. 數字型運算:按位或; 3. 無短路效果(前為真仍執行后面判斷)

與雙或的短路效果區別

int a=10,b=20; boolean r=(++a<100) | (++b>10);; 結果:a=11,b=21

雙或(||)運算符

1. 布爾型運算:有真則真; 2. 有短路效果(前為真則跳過后面判斷)

不能用于數字位運算

int a=10,b=20; boolean r=(++a<100) || (++b>10);; 結果:a=11,b=20

數值區間判斷

正確寫法:i>=1 && i<=100; 錯誤寫法:1<=i<=100(數學表達式不適用)

Java語法與數學表達式的區別

int i=50; boolean inRange=(i>=1 && i<=100);

模塊四

13.Scanner類的next()方法和nextLine()方法

知識點

核心內容

重點

Scanner類的next()方法

用于錄入字符串,遇到空格或回車即結束錄入

空格會截斷輸入,只接收空格前的部分

Scanner類的nextLine()方法

用于錄入字符串,僅遇到回車才結束錄入

可接收包含空格的完整字符串

next()與nextLine()混合使用問題

連續使用時nextLine()會接收next()遺留的空格及后續內容

看似跳過輸入,實際是接收了殘留數據

數據類型匹配異常

nextInt()等類型方法要求輸入匹配的數據類型

輸入非整數字符會拋出InputMismatchException

14.Random隨機數

知識點

核心內容

重點

Random類的基本使用

導包→創建對象→調用方法(nextInt())

默認范圍:int全范圍隨機;指定范圍:nextInt(n)生成0到n-1的隨機數

指定范圍的隨機數生成

通過數學運算調整范圍(如nextInt(10)+1生成1-10)

易錯點:范圍邊界計算(如100-999需nextInt(900)+100)

Random的底層機制

每次運行重新生成隨機數,結果不可預測

對比:與固定種子(new Random(seed))的確定性差異

常見應用場景

抽獎、驗證碼、游戲數值等需隨機結果的場景

注意:范圍邏輯需嚴格驗證(如1-100≠nextInt(100))

15.switch case

知識點

核心內容

重點

switch語句的break作用

break用于結束當前case語句,防止執行后續case

忘記寫break會導致case穿透

case穿透現象

當case后沒有break時,程序會繼續執行后續case直到遇到break或switch結束

穿透會執行多個case代碼塊

穿透性應用場景

利用穿透特性簡化多條件同結果代碼(如12/1/2月都輸出冬季)

需明確何時需要/不需要break

月份季節判斷案例

通過穿透性優化代碼結構: - 冬季(12/1/2月); - 春季(3/4/5月); - 夏季(6/7/8月); - 秋季(9/10/11月)

default處理非法輸入

Scanner輸入應用

配合switch實現動態輸入驗證: Scanner.nextInt()獲取用戶輸入

輸入類型需與case匹配

16.if與switch的區別

知識點

核心內容

重點

if與switch的區別

if從上到下逐個條件判斷;switch直接跳轉匹配的case

執行流程差異(if順序判斷 vs switch精準跳轉)

if的靈活性

支持復雜條件邏輯(如范圍判斷、組合條件)

實際開發中if使用更頻繁

switch的效率特性

基于單一值快速匹配,適合離散值枚舉

break的作用(防止case穿透)

debug工具應用

通過調試觀察代碼執行流程

斷點調試演示if/switch差異

17.do-while循環

知識點

核心內容

重點

do-while循環

先執行循環體再判斷條件,至少循環一次

與while/for循環的區別:執行順序差異(先循環后判斷)

語法結構

do {循環語句; 步進表達式;} while(比較條件);

大括號位置、分號結尾易遺漏

執行流程

1. 初始化變量→2. 執行循環體→3. 步進表達式→4. 條件判斷→重復2-4直到false

強制首輪執行的特性

適用場景

需至少執行一次的場景(如輸入校驗、菜單交互)

開發中使用頻率較低

模塊五

18.數組

知識點

核心內容

重點

數組長度獲取

使用數組名.length語法(不帶括號)

length是屬性不是方法,區別于nextInt()等帶括號的方法調用

數組索引概念

元素在數組中的存儲位置/編號(從0開始)

最大索引=數組長度-1,索引具有唯一性

數組操作原理

所有存取查操作都需通過索引完成

類比旅店房間號機制(零基編號系統)

字符串數組示例

String[] arr = {"迪迦奧特曼","貓和老鼠","海綿寶寶"}

靜態初始化語法與索引對應關系(0=迪迦)

長度屬性驗證

int len = arr.length;輸出元素數量

屬性與方法語法差異(無參vs帶括號)

19.數組獲取數據

知識點

核心內容

重點

數組元素獲取方法

通過索引值獲取元素(數組名[索引]),直接輸出數組名會返回內存地址值

地址值 vs 元素值; 直接輸出數組名返回的是地址值而非元素內容

數組內存機制

數組在內存中分配地址值(唯一標識),通過地址值可定位并操作數組

地址值的本質; 內存中的"身份證號",用于唯一標識數組

默認值規則

未賦值的數組元素存在默認值: - 整數:0; - 小數:0.0; - 字符:\u0000; - 布爾:false; - 引用類型:null

動態初始化未賦值的陷阱; 系統自動賦予默認值而非"空"

存取操作規范

存值需賦值(arr[0]=1),取值直接引用索引(System.out.println(arr[0]))

操作符混淆風險; 存取語法相似但等號是關鍵區分點

20.數組擴容

知識點

核心內容

重點

數組擴容原理

通過創建新數組并復制原數組元素實現擴容,原數組引用指向新數組地址

數組定長特性 vs 擴容邏輯(地址值覆蓋)

內存地址機制

數組變量存儲的是內存地址值,通過賦值操作可改變引用指向

地址值傳遞與原始數組的關系

代碼實現步驟

1. 創建新數組; 2. 復制元素; 3. 地址值覆蓋(oldArr = newArr)

元素復制范圍控制(避免越界)

默認值規則

擴容后新增位置自動填充默認值(如int數組為0)

未顯式賦值的元素狀態

21.內存劃分

知識點

核心內容

重點

內存劃分

JAVA將內存劃分為五部分:棧(Stack)、堆(Heap)、方法區(Method Area)、本地方法棧(Native Method Stack)、寄存器(PC Register)

重點掌握前三部分(棧、堆、方法區)

棧內存(Stack)

存儲方法運行時的數據(如局部變量),方法執行時入棧,執行完畢彈棧釋放內存

方法未及時彈棧會導致棧內存溢出

堆內存(Heap)

存儲對象和數組,new操作在堆中開辟空間并分配地址值,數據有默認值(如int=0、boolean=false)

地址值的作用(通過變量引用堆中對象)

方法區(Method Area)

代碼預備區,存儲類信息和方法信息(如.class文件內容)

與棧/堆的協作關系(代碼加載→方法區→運行時分配)

本地方法棧

運行Native方法(如C語言編寫的底層功能,擴展JAVA能力)

與硬件交互的場景(如IO流讀寫硬盤)

內存協作流程

示例:

int[] arr = new int[3];

1. .class加載到方法區;

2. main方法入棧運行;

3. new在堆中開辟數組空間(含默認值);

4. 變量arr保存堆內存地址

地址指向的實際意義(變量通過地址操作堆內對象)

22.二維數組

知識點

核心內容

重點

二維數組定義

使用兩個中括號表示二維數組,本質是"數組套數組"

動態初始化與靜態初始化的語法區別

動態初始化語法

數據類型[][] 數組名 = new 數據類型[m][n]; 三種變體:中括號前置/后置/分開放置

m代表二維數組長度(包含的一維數組數量); n代表每個一維數組的長度

特殊動態初始化

new 數據類型[m][]形式表示一維數組未被創建; 未創建的一維數組默認值為null

與帶n聲明的區別:后者已創建但元素為默認值

靜態初始化

直接賦值:數據類型[][] 數組名 = {{元素1,元素2},{...}}; 支持簡化寫法省略new關鍵字

各一維數組長度可不一致; 與動態初始化固定長度的區別

內存結構示例

圖示說明new int[2][3]和new int[2][]的內存分配差異

null與默認值的內存狀態區別

典型應用場景

不規則二維數組案例: {{"孫悟空","唐僧"},{"劉備","關羽","張飛"}}

靜態初始化更適合非對稱數據結構

模塊六

23.方法定義

知識點

核心內容

重點

方法定義通用格式

修飾符 + 返回值類型 + 方法名 + 參數 + 方法體 + return結果

void與return的沖突(void方法不可return具體值)

修飾符作用

public static固定搭配(公共訪問權限 + 靜態方法)

面向對象階段會詳細解釋

返回值類型

由return結果的數據類型決定(如int/double/String)

無返回值時需用void

方法命名規范

小駝峰命名法(如getSum)

需見名知意

參數定義

數據類型 + 變量名(多個參數用逗號隔開)

調用時賦值,定義時不需初始化

方法體與return

方法體為具體實現代碼;return返回結果(僅非void方法可用)

方法體操作參數生成返回值(類比“牛消化飼料產奶”)

IDE分割線設置

勾選Show Method顯示方法間分割線(解決代碼混淆問題)

路徑:File → Settings → Editor → General → Appearance

24.無參有返回值方法

知識點

核心內容

重點

無參有返回值方法的定義

public static+返回值類型+方法名() {}

返回值類型不能寫void,方法體需包含return語句

返回值的處理

方法體內通過return語句返回結果

返回值類型需與方法體內返回的數據類型一致

方法調用的兩種方式

直接調用和賦值調用

直接調用將結果直接輸出,賦值調用將結果賦值給變量

打印調用(直接調用)

調用方法后,將結果直接放入輸出語句中

適用于不需要再次使用結果的情況

賦值調用

調用方法后,將結果賦值給一個變量

推薦方式,便于后續使用結果

執行流程

調用方法 -> 執行方法體 -> 返回結果 -> 接收結果

理解方法調用的整個過程,特別是返回值的接收

示例:整數相加方法

public static int sum(int a, int b) { return a+b; }

方法的定義、調用和返回值處理

25.方法_參數和返回值使用時機

知識點

核心內容

重點

參數的使用時機

當想將方法A的數據傳遞到方法B時,定義方法B需要帶參數

參數傳遞的機制和目的

返回值的使用時機

調用方法A時,想要方法A的結果去參與其他的操作,方法A需要返回結果

返回值類型與接收

三層架構思想

Controller層(接收請求回響應)、Service層(業務邏輯)、DAO層(持久層)

各層職責與協作方式

參數在三層架構中的應用

Ctrl層接收請求參數,通過參數傳遞到Service層,Service層再通過參數傳遞到DAO層

參數在各層之間的傳遞與接收

返回值在三層架構中的應用

DAO層查詢結果需要返回給Service層,Service層處理結果需要返回給Ctrl層

返回值的傳遞與接收,以及根據返回值做不同的響應

三層架構的框架對應

Ctrl層對應Spring MVC,Service層對應Spring,DAO層對應MyBatis

SSM框架的組成與對應層次

26.方法注意事項

知識點

核心內容

重點

方法注意事項

方法不調用不執行;執行順序僅與調用順序相關;方法間不可嵌套

void與return的共存規則

void與return的關系

void表示無返回值,不可與return 結果共存,但可與return(無數據)共存

return 結果會先返回數據再結束方法;return僅結束方法

方法中的return限制

一個方法不能連續寫多個return(語法錯誤);if-else分支中的return需覆蓋所有邏輯路徑

多返回值需用數組封裝;未覆蓋分支的return會報錯

方法調用前提

調用方法前需確認方法已定義,否則報錯

常見錯誤:未定義直接調用

27.方法調用技巧

知識點

核心內容

重點

方法定義與調用

先定義后調用,避免報錯

定義順序錯誤導致報錯

返回值處理

無返回值方法在方法內輸出;有返回值方法需用變量接收后輸出

返回值類型與接收變量不匹配

方法調用方式

直接調用(無返回值)、打印調用(不推薦)、賦值調用(推薦)

混淆調用方式適用場景

28.方法重載

知識點

核心內容

重點

方法重載的判斷標準

方法名相同且參數列表不同(類型/順序/數量)

與返回值類型、參數名稱無關

重載方法調用沖突

當參數類型存在隱式轉換時可能導致調用歧義(如int和double)

sum(10, 2.5)可能同時匹配多個重載

典型重載場景

相同功能不同實現細節(如集合的add()方法)

位置添加 vs 末尾添加屬于合法重載

非法重載示例

僅修改參數名(int a vs int x)或返回值類型

編譯器報錯:"method is already defined"

合法重載變體

無參/有參、類型順序不同((int,double) vs (double,int))

方法簽名實質不同即可

方法簽名唯一性

嚴格區分大小寫(Open()與open()不算重載)

視為完全獨立的方法

模塊七

29.面向對象思想

知識點

核心內容

重點

面向對象思想

核心編程思想,強調“調用他人功能”而非親力親為(如洗衣機洗衣服、外賣點餐等類比)

與面向過程的區別(C語言 vs Java); 關鍵判斷標準:是否調用其他類的成員

類與對象

類(Class)是模板,對象是實例(如Scanner/Random的new操作)

new對象后通過.調用方法; 特殊場景:靜態方法(static)可直接類名調用(如Arrays.toString())

匿名對象

一次性使用的對象(未賦變量名)

內存效率 vs 代碼可讀性權衡

對象內存解析

堆棧內存分配機制(對象在堆,引用在棧)

易混淆點:基本類型 vs 引用類型的存儲差異

成員變量與局部變量

作用域與生命周期對比(類內全局 vs 方法內臨時)

默認值差異:成員變量自動初始化,局部變量需手動賦值

面向對象應用場景

調用他人功能時使用(如Scanner.nextInt()、Random.nextInt())

典型誤區:自身類內方法調用不屬面向對象

代碼簡化案例

Arrays.toString(arr) vs 手動遍歷拼接字符串

效率對比:面向對象減少重復代碼量

30.對象的使用

知識點

核心內容

重點

類與對象概念

類是一類事物的抽象表示形式,對象是類的具體實例

抽象vs具體體現的辯證關系

對象創建三步法

1. 導包 2. 創建對象 3. 調用成員

同包下免導包規則與java.lang包特殊性

對象成員調用

對象名.成員變量 / 對象名.方法()

方法調用的四種組合形式(有參無參/有返回值無返回值)

默認值機制

未賦值的成員變量自動初始化(如String=null, int=0)

默認值陷阱在業務邏輯中的影響

面向對象基礎語法

類名 對象名 = new 類名()標準創建格式

對象名命名規范與內存指向原理

包訪問規則

同包類直接互訪 vs 跨包需導包

import語句的精確導入與通配符導入區別

31.匿名對象

知識點

核心內容

重點

匿名對象的使用

匿名對象即沒有變量名直接使用的對象,通過new關鍵字直接創建并調用方法或訪問成員變量

匿名對象適用于一次性調用方法,不適用于需要多次訪問或修改對象狀態的場景

原始方式與匿名對象的對比

原始方式:使用變量接收對象,可以多次訪問和修改對象狀態;匿名對象方式:直接創建并使用對象,無法后續訪問或修改

易混淆點:匿名對象無法保存狀態,每次使用都會創建新的對象實例

匿名對象的適用場景

適用于只需要調用對象方法,不需要保存對象狀態的場景,如調用工具類的方法

誤用匿名對象進行賦值操作,會導致無法后續訪問或修改該值

原始方式的優勢

可以保存對象狀態,方便后續訪問和修改,適用于需要多次使用對象的場景

堆棧內存分析

原始方式中,對象存儲在堆內存中,變量名保存在棧內存中,通過變量名可以訪問堆內存中的對象;匿名對象只存在于堆內存中,無法通過變量名訪問

理解堆棧內存模型對于掌握對象存儲和訪問機制至關重要

32.兩個對象指向同一片空間

知識點

核心內容

重點

對象內存分配原理

兩個對象變量指向同一內存空間時的數據共享機制

地址值傳遞導致的對象關聯性

引用類型變量賦值

通過Phone p2 = p1實現對象引用傳遞

直接賦值與new創建的本質區別

堆棧內存交互

棧內存存儲引用地址,堆內存存儲實際對象數據

方法區存儲類模板的class對象

對象屬性修改影響

通過任一引用修改屬性會同步影響所有關聯對象

多引用操作同一對象的副作用

內存圖繪制方法

三區域劃分(棧/堆/方法區)與地址指向關系

數組與對象內存模型的相似性

33.成員變量和局部變量

知識點

核心內容

重點

成員變量 vs 局部變量

定義位置不同:成員變量在類中方法外,局部變量在方法內或參數位置

初始化值差異:成員變量有默認值,局部變量需手動賦值

作用范圍不同:成員變量作用于整個類,局部變量僅限所在方法

內存位置:成員變量在堆中,局部變量在棧中(非重點)

生命周期不同:成員變量隨對象創建/銷毀,局部變量隨方法調用/結束(非重點)

成員變量默認值規則

未手動賦值時,成員變量自動賦予默認值(如String為null)

易錯點:局部變量未賦值直接使用會報錯

作用域驗證示例

Person類中name(成員變量)可在所有方法調用,而方法內變量(如i)僅限本方法

混淆點:誤將局部變量跨方法調用

模塊八

34.封裝?private

知識點

核心內容

重點

封裝的概念

將代碼片段放入方法中隱藏實現細節,對外提供公共接口(方法名)調用

區分“代碼封裝”與“屬性封裝”的異同

private關鍵字

私有化修飾成員變量/方法,限制僅本類訪問,強制通過公共接口間接操作

不合理賦值問題(如年齡賦負值)的解決方案

封裝的實際應用

1. 方法封裝代碼邏輯; 2. private封裝屬性+公共setter/getter控制賦值邏輯

setter方法中加入有效性校驗(如if(age>0))

封裝的優勢

1. 隱藏實現細節; 2. 增強數據安全性; 3. 降低耦合度

對比public與private的訪問權限差異

案例演示

1. 數組打印方法封裝; 2. Person類屬性私有化+setAge校驗

易錯點:忘記提供公共訪問接口導致數據無法操作

35.get set方法

知識點

核心內容

重點

封裝思想

使用private隱藏屬性細節,通過get/set方法提供公共訪問接口

私有化屬性后仍需通過方法控制賦值有效性(如setAge中校驗負值)

get/set方法作用

set用于屬性賦值(可加入邏輯校驗),get用于屬性取值

方法內可直接訪問本類私有成員(與外部調用區別)

封裝實現流程

1. 屬性私有化 → 2. 編寫帶校驗的set方法 → 3. 編寫get方法 → 4. 外部通過方法間接訪問

校驗邏輯需覆蓋邊界值(如年齡>150)

封裝優勢

防止不合理賦值(如age=-18)、隱藏實現細節、統一訪問入口

private限制的是外部直接訪問而非本類內部訪問

36.this關鍵字

知識點

核心內容

重點

this關鍵字基本使用

通過this區分重名成員變量與局部變量,遵循就近原則(默認訪問局部變量)

成員變量與局部變量重名時的訪問優先級

this代表當前對象

this指向調用該方法的對象,通過輸出對象地址值驗證(person與person2調用時this指向不同)

動態綁定機制:this具體指向由調用對象決定

標準get/set方法改造

形參與成員變量同名時,用this.變量名明確賦值目標(如this.name = name)

未用this會導致局部變量自賦值(age=age無效)

代碼示例分析

speak()方法中this.name輸出成員變量,name輸出局部變量(傳參"劉彥昌")

輸出結果差異:this.name為"沉香",name為"劉彥昌"

對象調用驗證

person.speak()與person2.speak()中this分別指向不同對象地址

通過分割線對比兩對象地址值及this指向

37.構造方法

知識點

核心內容

重點

構造方法定義

方法名與類名一致,用于初始化對象,無返回值(連void也不寫)

易混淆:new 類名()實際調用的是構造方法,而非創建類本身

構造方法分類

無參構造(默認存在,虛擬機自動提供)、有參構造(為屬性賦值)、滿參構造(為所有屬性賦值)

重點:默認無參構造在類中未顯式定義時仍存在

無參構造特點

格式:public 類名(){};作用:僅用于new對象

易錯點:手動定義后,默認無參構造失效

構造方法調用

通過new關鍵字隱式調用(無需對象.操作)

示例:Person p = new Person();直接觸發無參構造執行

IDEA快捷操作

自動生成get/set方法和構造方法(如Alt+Insert)

知識點

核心內容

考試重點/易混淆點

有參構造

定義格式:public 類名(參數列表){為屬性賦值}

與無參構造的區別、如何為屬性賦值

作用:創建對象的同時為屬性賦值

有參構造與set方法的區別

寫法示例:public Person(String name, int age){this.name=name; this.age=age;}

構造方法重載(參數列表不同)

注意:手寫有參構造后,無參構造需手動添加

虛擬機默認提供無參構造,手寫有參后不再自動提供

屬性賦值

通過有參構造、set方法為屬性賦值

私有屬性如何通過有參構造和set方法賦值

方法調用

按住Ctrl鍵,鼠標點擊方法名可快速定位到方法定義

如何快速找到調用的方法

get/set方法

get方法用于獲取屬性值,set方法用于設置屬性值

get/set方法的作用、使用場景

構造方法重載

多個構造方法,參數列表不同

構造方法重載的意義、如何實現

38.JavaBean

知識點

核心內容

重點

Java Bean定義

符合特定規范的Java類: 1. 公共類(public class); 2. 提供無參/有參構造方法; 3. 成員變量私有化; 4. 提供get/set方法

易混淆點: - 非私有屬性也可提供get/set,但無實際意義

分層架構與分包

開發時按功能分包: - controller(表現層); - service(業務層); - dao(持久層); - pojo(存放Java Bean); - util(工具類)

重點: - 包名規范(公司域名倒寫); - 類的職責隔離

Java Bean使用場景

1. 通過set方法或有參構造賦值; 2. 通過get方法取值; 3. 實體類統一存放于pojo包

易錯點: - 無參構造方法體通常為空

39.javabean參與添加功能

知識點

核心內容

易混淆點/關鍵細節

參與環節

三層架構

表現層(Controller)、業務層(Service)、持久層(DAO)的分工

表現層僅處理請求/響應,業務邏輯應集中在Service層

整體框架設計

注冊功能流程

1. 頁面輸入 → 2. Controller獲取參數 → 3. 封裝為JavaBean → 4. 逐層傳遞至DAO → 5. 數據庫操作

參數封裝必要性(避免多參數傳遞混亂)

功能實現核心鏈路

JavaBean作用

數據打包(如User對象含ID、用戶名、密碼)、跨層傳輸、屬性提取(get/set方法)

與DTO/VO的區別(本例未涉及分層模型)

數據封裝與傳遞

DAO層邏輯

1. 用戶名查重 → 2. 無重復則插入數據

查詢與插入的原子性

數據庫交互

響應控制

Controller根據Service返回結果(如1/0)動態響應頁面

狀態碼設計(可擴展為枚舉/常量)

結果反饋

模塊九

40.static關鍵字

知識點

核心內容

重點

static關鍵字

用于修飾成員變量和方法,使成員屬于類而非對象,實現數據共享

靜態成員與非靜態成員的內存加載順序(靜態優先)

靜態成員特點

1. 類加載時即存在; 2. 通過類名直接調用; 3. 所有對象共享同一靜態成員

區分類名.靜態成員與對象.非靜態成員的調用方式

應用場景

解決多對象共享屬性問題(如班級換教室只需修改一次靜態變量)

靜態方法中不可直接調用非靜態成員(需先實例化對象)

內存機制

靜態成員存儲在方法區,非靜態成員存儲在堆內存對象中

易混淆:靜態成員生命周期與類相同,非靜態成員與對象綁定

代碼示例

static String classroom = "111";; 修改時:Student.classroom = "222";

需注意靜態變量初始化的線程安全問題

41.static內存說明

知識點

核心內容

重點

static成員的內存存儲位置

靜態成員存儲在靜態域中,靜態域在JDK 6時位于方法區(永久代),JDK 7開始移至堆內存

方法區 vs. 堆內存:JDK 7后靜態域遷移至堆,目的是提高內存回收效率

方法區的演變

JDK 6稱“永久代”,JDK 8改為“元空間”,但均為方法區的具體實現

永久代、元空間與方法區的關系:需明確三者是同一邏輯區域的不同實現

靜態域遷移原因

堆內存回收效率高,方法區回收效率低;遷移后可及時釋放靜態成員占用的內存

為什么靜態域不留在方法區?:避免內存長期占用,優化運行性能

靜態成員共享機制

靜態成員隨類加載而加載,被該類的所有對象共享;不屬于對象成員,僅屬于類

靜態成員訪問方式:直接通過類名調用(如Student.classroom),無需實例化對象

內存模型示例(Student類)

classroom(靜態)存儲在堆的靜態區,name(實例)存儲在對象堆內存;新建對象共享靜態成員

對象與靜態區的關系:對象通過內存地址共享靜態成員,但靜態成員生命周期獨立于對象

42.靜態成員訪問特點

知識點

核心內容

重點

靜態方法訪問非靜態成員

靜態方法中不能直接訪問非靜態成員,需通過new對象調用

先出生的靜態成員無法直接訪問后出生的非靜態成員(類比秦始皇不知康熙存在)

非靜態方法訪問靜態成員

非靜態方法中能直接訪問靜態成員(同類可直接調用/類名調用,不同類需類名調用)

反編譯證明即使通過對象調用靜態方法,底層仍是類名調用

靜態方法訪問靜態成員

靜態方法中能直接訪問靜態成員(同類可直接調用,不同類需類名調用)

同類訪問時存在兩種調用方式(直接調用/類名調用)

非靜態方法訪問非靜態成員

非靜態方法中能直接訪問非靜態成員(同類直接調用,不同類需new對象調用)

同類訪問時new對象調用非必要但可行

通用訪問規則總結

非靜態成員始終通過new對象調用;靜態成員始終推薦類名調用

靜態成員生命周期早于非靜態成員(類加載vs對象實例化)

43.靜態成員的使用場景

知識點

核心內容

重點

靜態成員的使用場景

靜態成員通過類名直接調用,無需實例化,適用于工具類等場景

靜態成員與實例成員的區別(內存加載時機)

靜態成員的局限性

所有靜態成員會在類加載時占用內存,濫用會導致內存浪費

需權衡“便利性”與“資源占用”

工具類設計規范

1. 成員全靜態化; 2. 構造方法私有化(禁止實例化); 3. 功能需高頻復用(如數組求最大值)

工具類與普通類的設計差異

代碼復用案例

抽取ArrayUtils.getMax()方法,避免重復編寫數組遍歷邏輯

工具類方法的通用性設計(參數/返回值)

44.可變參數

知識點

核心內容

注意事項

可變參數定義

使用數據類型...變量名語法定義(必須三個點)

必須三個點,兩個或四個點都不行

可變參數本質

底層實現是數組(可通過反編譯驗證)

可使用數組遍歷方式操作可變參數

參數位置規則

可變參數必須放在參數列表最后

報錯提示:varargs parameter must be the last

多參數共存

可與普通參數共存(如int i, int... arr)

普通參數需在前,順序不可顛倒

方法調用方式

可傳入任意數量同類型參數(自動轉為數組)

類型必須匹配定義的數據類型

45.遞歸

知識點

核心內容

重點

遞歸的定義

方法內部調用自身的編程技巧

與循環的區別(出口條件的必要性)

遞歸的經典案例

"從前有座山"的無限循環故事

無出口的遞歸導致棧溢出錯誤

遞歸的分類

直接遞歸(方法A調A)和間接遞歸(方法A→B→C→A循環調用)

間接遞歸的代碼實現邏輯

遞歸的注意事項

必須設置終止條件(出口),且遞歸次數不宜過多

棧內存溢出的原理(StackOverflowError)

遞歸的代碼演示

method()無限調用自身導致崩潰

實際開發中需通過條件判斷控制遞歸深度

46.斐波那契數列

知識點

核心內容

重點

斐波那契數列定義

數列中每個數字是前兩個數字之和(從1,1開始)

起始項定義(通常為F(1)=1, F(2)=1)

兔子繁殖模型

1.新生兔1個月成熟; 2.成熟后每月生1對; 3.無死亡假設

第二個月不生兔的時間延遲特性

遞歸算法實現

method(n) = method(n-1) + method(n-2)

終止條件必須包含n=1和n=2的情況

數列計算示例

月份:1→1對, 2→1對, 3→2對, 4→3對, 5→5對, 6→8對

第6個月結果8對的推導過程

遞歸調用過程

方法自調用時的參數傳遞機制(月份遞減)

遞歸樹展開時的重復計算問題

47.數組反轉

知識點

核心內容

重點

數組翻轉算法

中心思想是數組對稱索引位置上的元素互換,通過中間變量實現元素位置交換

確定交換終止條件(min >= max)和索引移動規則(min++/max--)

索引對稱原理

奇數數組中間元素自對稱,偶數數組全部成對交換(圖示[1,2,3,4,5,6,7]與[7,6,5,4,3,2,1]索引對應關系)

奇偶數組的不同處理邏輯

元素交換技術

使用臨時變量temp的三步交換法: 1. temp = arr[min]; 2. arr[min] = arr[max]; 3. arr[max] = temp

類比水杯交換的具象化理解

循環控制邏輯

for(int min=0,max=arr.length-1; min<max; min++,max--) 復合循環條件寫法

多語句初始化/迭代的語法特性

邊界條件處理

循環終止條件min < max同時覆蓋奇偶兩種情況

避免偶數數組重復交換

48.冒泡排序

知識點

核心內容

重點

冒泡排序定義

數組排序方法,通過相鄰元素比較和交換實現排序

默認升序排序,需理解“相鄰元素”指 arr[i] 和 arr[i+1]

排序過程

1. 每輪將最大值“冒泡”到末尾; 2. 比較輪數=數組長度-1,每輪比較次數遞減

易錯點:忽略每輪減少一次比較(已排序部分無需重復比較)

代碼實現關鍵

1. 雙重循環(外層控制輪數,內層控制比較次數); 2. 相鄰元素交換條件 arr[i] > arr[i+1]

筆試高頻:需默寫代碼框架及邊界條件(如 i < arr.length-1)

性能特點

時間復雜度 O(n2),空間復雜度 O(1)

對比其他排序:效率低但實現簡單,適合小規模數據

實例演示

數組 [5,4,3,2,1] 的完整排序步驟(4輪比較,每輪次數遞減)

重點觀察:最大值如何逐步移動到末尾

49.二分查找

知識點

核心內容

重點

二分查找原理

通過不斷折半縮小查找范圍,提升查詢效率

必須保證數組有序(升序/降序)

中間索引計算

mid = (min + max) // 2,動態調整min/max

初始min=0,max=長度-1,非固定長度/2

查找流程

1. 比較目標值與mid元素; 2. 大于則min=mid+1; 3. 小于則max=mid-1; 4. 等于則命中

終止條件:min > max時未找到

效率對比

原始遍歷:O(n); 二分查找:O(log n)

數據量越大優勢越顯著(例:100數據僅需7次比較)

邊界案例

目標值在首尾/不存在時索引移動邏輯

min/max更新需嚴格±1,避免死循環

50.對象數組

知識點

核心內容

重點

對象數組定義

Person[]數組存儲Person對象,數組定義語法與基本類型數組類似

數組元素類型與對象類型的匹配關系

對象數組初始化

創建三個Person對象并存入數組,通過索引賦值

數組存儲的是對象引用(地址值)而非對象本身

數組遍歷與屬性訪問

使用for循環遍歷數組,通過getter方法獲取對象屬性

遍歷得到的是對象引用,需通過引用訪問成員方法

內存模型解析

堆內存中數組元素存儲對象引用示意圖

引用傳遞與值傳遞的本質區別

類型系統應用

接收數組元素必須使用Person類型變量

編譯期類型檢查機制

51.對象數組應用

知識點

核心內容

重點

對象數組創建

創建Student類數組并初始化三個學生對象

Student[] students = new Student[3]

匿名對象初始化方式

類定義規范

定義Student類包含私有屬性(name/score)和標準方法(構造器/getter)

無參/有參構造器同時存在的必要性

冒泡排序算法

通過嵌套循環實現對象數組排序

比較成績但交換整個對象

對象屬性訪問

通過getter方法獲取私有屬性進行比較

直接訪問私有屬性會導致編譯錯誤

數組遍歷輸出

排序后遍歷數組輸出學生信息

注意數組越界問題

52.基本類型做參數傳遞

知識點

核心內容

重點

基本數據類型與引用數據類型的區分

基本數據類型包括四類八種(byte、short、int、long、float、double、char、boolean),其余均為引用數據類型

如何快速區分:只需記住基本數據類型的范圍,其余均為引用類型

方法參數傳遞(基本數據類型)

基本數據類型作為方法參數傳遞時,傳遞的是值而非變量本身,方法內部的修改不影響原始變量

易混淆點:誤認為方法內部修改會影響原變量值

方法調用與棧內存機制

方法執行時壓棧,運行完畢后彈棧,局部變量僅作用于當前方法棧幀

關鍵理解:方法棧的獨立性導致變量作用域隔離

53.引用類型作參數傳遞

知識點

核心內容

重點

引用數據類型作為方法參數傳遞

引用數據類型(如數組)作為參數傳遞時,傳遞的是地址值,而非值本身。

區分基本數據類型和引用數據類型的參數傳遞方式;理解為何引用數據類型的修改會影響到原數據。

數組在內存中的存儲

數組在堆內存中存儲,變量保存的是數組的地址值。

數組的內存分配和地址值的概念;數組如何通過地址值進行訪問和修改。

方法調用與棧的壓棧彈棧

方法調用時,會在棧中壓棧運行;方法執行完畢后,會彈棧返回。

方法調用的棧機制;壓棧與彈棧對變量值的影響。

方法間參數傳遞的影響

引用數據類型作為參數傳遞時,方法間的修改會相互影響。

引用傳遞導致的修改共享問題;如何理解并避免不必要的修改。

基本數據類型與引用數據類型的區別

基本數據類型傳遞的是值,引用數據類型傳遞的是地址值。

兩者在參數傳遞、內存存儲和修改影響上的區別。

54.命令行參數

知識點

核心內容

重點

命令行參數

指main方法中的String[] args參數,通過命令行或IDE配置傳遞實參

參數傳遞格式(空格分隔)、IDE配置入口位置

參數傳遞方式

1. 命令行運行:java 類名 參數1 參數2; 2. IDEA配置:Run → Edit Configurations → Program Arguments

參數與類名需空格分隔,參數按順序對應數組元素

實際應用場景

臨時測試方法功能(如method(String s1, String s2)),避免啟動完整項目流程

與直接調用方法的區別(靈活性 vs 便捷性)

IDE操作演示

1. 創建類并編寫main方法; 2. 通過Edit Configurations設置參數(如哈哈 嘿嘿); 3. 運行后遍歷args數組輸出結果

配置路徑易忽略(需通過類名旁箭頭進入)

55.快速生成方法

知識點

核心內容

重點

方法定義與調用順序

初學者需先定義方法再調用,否則報錯;熟練者可先調用后定義(通過IDE補全)

Alt+Enter快速生成方法(自動補全參數/返回值)

IDE智能補全功能

使用Alt+Enter自動生成方法: - 無參無返回值(默認private修飾); - 有參無返回值(自動匹配參數類型); - 有返回值(自動推斷類型)

修飾符需手動調整

代碼抽取為方法

選中代碼塊后按Ctrl+Alt+M快速抽取: - 自動識別依賴變量(如數組參數); - 支持修改方法名/修飾符; - 智能提示返回值需求

未選中變量時自動補全參數

IDE操作效率技巧

- 通過快捷鍵生成代碼結構; - 抽取重復邏輯為獨立方法

需熟悉Alt+Enter與Ctrl+Alt+M組合鍵

56.debug調試

知識點

核心內容

重點

Debug調試概述

調試代碼的手段,用于監測變量變化和定位錯誤

理解斷點作用與調試模式啟動方式

斷點設置

在代碼行左側點擊添加紅色圓點(斷點),右鍵選擇Debug啟動調試

斷點可多位置設置,點擊消失的特性易忽略

調試面板功能

- 下一步(逐行執行); - 進入方法(跳轉至被調用方法內部); - 跳出方法(返回調用處); - 放行(執行當前請求代碼但不退出調試); - 結束調試(完全退出)

放行 vs 結束調試的功能差異(是否保留調試模式)

變量監控

調試過程中實時顯示變量值變化(如數組索引賦值過程)

通過變量面板觀察I=3時的數組越界問題

調試應用場景

示例:購物車功能調試(addCart方法逐行檢查變量)

結合循環調用演示放行按鈕的多次觸發特性

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

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

相關文章

ddns-go安裝介紹-強大的ipv6動態域名解析神器-家庭云計算專家

ddns-go 是一款輕量級開源動態域名解析工具&#xff0c;專注于解決動態IP環境下的域名綁定問題&#xff0c;尤其適配IPv6網絡環境。其核心功能包括&#xff1a; 1.IPv6動態解析&#xff1a;自動檢測本地IPv6地址變化&#xff08;支持網卡、接口或命令獲取&#xff09;&#xf…

Docker-mongodb

拉取 MongoDB 鏡像: docker pull mongo 創建容器并設置用戶&#xff1a; 要掛載本地數據目錄&#xff0c;請替換此路徑: /Users/Allen/Env/AllenDocker/mongodb/data/db docker run -d --name local-mongodb \-e MONGO_INITDB_ROOT_USERNAMEadmin \-e MONGO_INITDB_ROOT_PA…

WooCommerce緩存教程 – 如何防止緩存破壞你的WooCommerce網站?

我們在以前的文章中探討過如何加快你的WordPress網站的速度&#xff0c;并研究過各種形式的緩存。 然而&#xff0c;像那些使用WooCommerce的動態電子商務網站&#xff0c;在讓緩存正常工作方面往往會面臨重大挑戰。 在本指南中&#xff0c;我們將告訴你如何為WooCommerce設置…

貪心算法 Part04

總結下重疊區間問題 LC 452. 用最少數量的箭引爆氣球 和 LC 435. 無重疊區間 本質上是一樣的。 LC 452. 用最少數量的箭引爆氣球 是求n個區間當中 &#xff0c; 區間的種類數量 k。此處可以理解為&#xff0c;重疊在一起的區間屬于同一品種&#xff0c;沒有重疊的區間當然…

云原生CD工具-Argocd+ArgoRollout入門到精通

第一章 Argo CD簡介 課時1.1 Argo產品介紹 ARGO官網地址:https://argoproj.github.io/ 旗下產品有: Argo Workflows、ArgoCD 、Argo Rollouts 、Argo Events 課時1.2 什么是Argo CD Argo CD 是一個開源的持續交付工具, 是 Kubernetes 的聲明式 GitOps 持續交付工具。專…

數據分析與應用---數據可視化基礎

目錄 Matplotlib基礎繪圖 (一)、pyplot繪圖基礎語法與常用參數 1、pyplot基礎語法 (1) 創建畫布與創建子圖 (2) 添加畫布內容 (3) 保存與顯示圖形 案例代碼 2. 設置pyplot的動態rc參數 (二)、使用Matplotlib繪制進階圖形 1. 繪制散點圖----scatter 2. 繪制折線…

PP-YOLOE-SOD學習筆記1

項目&#xff1a;基于PP-YOLOE-SOD的無人機航拍圖像檢測案例全流程實操 - 飛槳AI Studio星河社區 一、安裝環境 先準備新環境py>3.9 1.先cd到源代碼的根目錄下 2.pip install -r requirements.txt 3.python setup.py install 這一步需要看自己的GPU情況&#xff0c;去飛漿…

力扣HOT100之二叉樹:114. 二叉樹展開為鏈表

這道題自己嘗試著做了一下&#xff0c;感覺還是得用遞歸來做比較簡單&#xff0c;但是一直想的是用前序遍歷來構造鏈表&#xff0c;導致怎么做都不對&#xff0c;去看了下靈神的題解&#xff0c;然后問了下GPT&#xff0c;現在終于弄明白了。雖然構造出來的鏈表的排列順序是按照…

Spring Boot 注解 @ConditionalOnMissingBean是什么

一句話總結&#xff1a; ConditionalOnMissingBean 是 Spring Boot 提供的一個 條件注解&#xff08;Conditional Annotation&#xff09;&#xff0c;意思是&#xff1a; 只有當 Spring 容器中 不存在 某個 Bean 時&#xff0c;當前的 Bean 或配置才會被加載。 這是一種典型的…

PyInstaller 如何在mac電腦上生成在window上可執行的exe文件

PyInstaller跨平臺打包限制 PyInstaller 無法直接從macOS生成Windows可執行文件&#xff0c;因為它需要訪問目標平臺的系統庫和Python環境來構建可執行文件。要在macOS上為Windows打包Python應用&#xff0c;需要通過以下方法之一&#xff1a; 方法一&#xff1a;使用虛擬機或…

零基礎設計模式——創建型模式 - 抽象工廠模式

第二部分&#xff1a;創建型模式 - 抽象工廠模式 (Abstract Factory Pattern) 我們已經學習了單例模式&#xff08;保證唯一實例&#xff09;和工廠方法模式&#xff08;延遲創建到子類&#xff09;。現在&#xff0c;我們來探討創建型模式中更為復雜和強大的一個——抽象工廠…

【通用智能體】Serper API 詳解:搜索引擎數據獲取的核心工具

Serper API 詳解&#xff1a;搜索引擎數據獲取的核心工具 一、Serper API 的定義與核心功能二、技術架構與核心優勢2.1 技術實現原理2.2 對比傳統方案的突破性優勢 三、典型應用場景與代碼示例3.1 SEO 監控系統3.2 競品廣告分析 四、使用成本與配額策略五、開發者注意事項六、替…

Flask-SQLAlchemy核心概念:模型類與數據庫表、類屬性與表字段、外鍵與關系映射

前置閱讀&#xff0c;關于Flask-SQLAlchemy支持哪些數據庫及基本配置&#xff0c;鏈接&#xff1a;Flask-SQLAlchemy_數據庫配置 摘要 本文以一段典型的 SQLAlchemy 代碼示例為引入&#xff0c;闡述以下核心概念&#xff1a; 模型類&#xff08;Model Class&#xff09; ? 數…

野火魯班貓(arrch64架構debian)從零實現用MobileFaceNet算法進行實時人臉識別(四)安裝RKNN Toolkit2

RKNN Toolkit2是用來將onnx模型轉成rknn專用模型&#xff0c;并可通過RKNN Toolkit Lite2或者RKNPU調用NPU進行加速計算的工具。 一開始我安裝很多次都無法成功安裝。后來跟售后技術對接&#xff0c;必須是PC平臺的Linux環境才可以。我的電腦是windows&#xff0c;所以我需要用…

基于深度學習的工件檢測系統設計與實現

在工業自動化領域&#xff0c;工件檢測一直是提高生產效率和產品質量的關鍵環節。傳統的人工檢測方法不僅效率低下&#xff0c;而且容易受到主觀因素的影響&#xff0c;導致誤判率較高。隨著深度學習技術的飛速發展&#xff0c;基于圖像識別的自動檢測系統逐漸成為研究熱點。今…

CyberSecAsia專訪CertiK首席安全官:區塊鏈行業亟需“安全優先”開發范式

近日&#xff0c;權威網絡安全媒體CyberSecAsia發布了對CertiK首席安全官Wang Tielei博士的專訪&#xff0c;雙方圍繞企業在進軍區塊鏈領域時所面臨的關鍵安全風險與防御策略展開深入探討。 Wang博士在采訪中指出&#xff0c;跨鏈橋攻擊、智能合約漏洞以及私鑰管理不當&#x…

Google C++ Style Guide 谷歌 C++編碼風格指南,深入理解華為與谷歌的編程規范——C和C++實踐指南

Google C 編程風格指南 Release Apr 07, 2017 0. ?享 ?? 4.45 ??? Benjy Weinberger, Craig Silverstein, Gregory Eitzmann, Mark Mentovai, Tashana Landray ?? YuleFox, Yang.Y, acgtyrant, lilinsanity 亯??享 ? Google Style Guide ? Google 開源…

當科技邂逅浪漫:在Codigger的世界里,遇見“愛”

520&#xff0c;一個充滿愛意的日子&#xff0c;人們用各種方式表達對彼此的深情。而在科技的世界里&#xff0c;我們也正經歷著一場特別的邂逅——Codigger&#xff0c;一個分布式操作系統的誕生&#xff0c;正在以它獨特的方式&#xff0c;重新定義我們與技術的關系。 Codigg…

嵌入式學習筆記 - Void類型的指針

void指針的基本概念和特性 void指針是一種特殊的指針類型&#xff0c;稱為“無類型指針”或“通用指針”。它的主要特點是&#xff1a; ?通用性?&#xff1a;void指針可以指向任何類型的數據&#xff0c;這使得它在處理不確定數據類型時非常有用。 ?靈活性?&#xff1a;由…

【綜述】視頻目標分割VOS

相關連接 更新中....... 1、Associating Objects with Transformers for Video Object Segmentation&#xff1a;論文詳解、AOT源碼解析 2、Rethinking Space-Time Networks with Improved Memory Coverage for Efficient Video Object Segmentation 3、Recurrent Dynamic Embe…