💡涉及的知識點速通
- 🛫 關于變量和常量你都知道啥?
- 🛫 &和&&、|和||有什么區別?
- 🛫 關于字符串的問題你能答對幾道?
- 🪂 可以修改一個字符串中的值嗎?
- 🪂 字符串使用==和equals判等的區別?
- 🪂 空串""和null串有啥區別?
- 🪂 這些String的常見API你都掌握了嗎?
- 🪂 String StringBuilder StringBuffer都是啥?
??各位小伙伴們大家好,歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄,在這個系列專欄中我將記錄淺學這本書所得收獲,鑒于 看到就是學到、學到就是賺到 精神,這波簡直就是血賺
扎哇太棗糕的博客首頁
🛫 關于變量和常量你都知道啥?
變量
首先,變量的聲明遵循以下規范:
- 只能包含字母、數字、美元符(“$”)、下劃線(“_”),但是不能以數字開頭,且"$“和”_"并不推薦在命名的時候使用
- 不能使用Java中的保留字
- 變量的命名區分大小寫
- 雖不強制要求,但是盡量使用小駝峰(第一個單詞首字母小寫其他單詞的首字母大寫)命名
??其次,Java支持一次聲明多個變量但并不提倡,因為這種形式會降低程序的可讀性(int i, j;),可以使用逐一聲明的形式,而且變量的聲明要盡可能的靠近變量第一次使用的地方
??最后,變量聲明之后還必須要進行初始化才能使用,否則會編譯器就會認為這個變量的使用是非法的。變量的初始化有三種機制:
- 構造器:Java中如果沒有在構造器中顯式的為字段設置初始值的話,就會將其設置成默認值,也就是不同數據類型數據所對應的默認值
- 顯式賦值:也就是最常見的使用等于號
- 初始化代碼塊:Java中將類中使用花括號包裹起來的幾行代碼稱為是初始化代碼塊,初始化代碼塊隨著類的加載而加載,只要構造這個類的對象就會執行這個塊里的代碼。而且初始化代碼塊中的代碼會在main方法之前執行,初始化代碼塊中定義的變量和構造器一樣有默認值機制
??類變量(static修飾的變量)、實例變量可以使用構造器、顯式賦值和初始化塊三種機制進行初始化,但是局部變量則只能也必須使用賦值語句進行顯式初始化。常量
??Java中常量必須在main方法的外部使用final進行定義,常量定義的時候必須進行初始化,一旦初始化之后就無法改變值的大小,且常量的命名必須全部大寫。靜態變量和靜態常量
??靜態變量也叫類變量是使用static修飾的變量,靜態變量屬于類而不屬于任何單個的對象,也就是說即使不創建該類的對象這個靜態變量依然存在,不管創建多少個對象都是共享這一個靜態變量。非靜態變量也就是實例變量就不一樣了,實例對象屬于對象,必須使用對象調用無法直接調,每創建一個對象都會得到一個實例變量的副本,不同對象之間互不影響??靜態常量的使用頻率要明顯高于靜態變量,在靜態常量定義的時候往往都會加上final修飾,這樣的話它既可以被其他類直接使用類名調用,又不用擔心字段值被調用后隨意修改產生的安全問題。之前輸出語句的時候使用的out就是一個final修飾的PrintStream類型的靜態常量,PrintStream類里又內置了print、println、printf等方法用于輸出
🛫 &和&&、|和||有什么區別?
??&(邏輯與)和|(邏輯或)是邏輯運算符,&&(短路與)和||(短路或)是短路邏輯運算符。這兩種運算符對應的的運算結果相同,與運算的話是全真為真、有假則假,或運算的是全假為假、有真則真。兩種類型的運算符區別在于:邏輯運算符會執行完左右兩邊的表達式之后返回一個結果,短路邏輯運算符當能夠得到結果的時候就會直接返回,也就是說短路與的左邊結果為false就會直接返回false,短路或的左邊結果為true就會直接返回true
??補充一種進行位移運算的位運算符,位移運算就是對一個數值的二進制表示進行左右移動的運算,其中>>表示右移高位符號位補充,<<表示左移低位補0,>>>則是右移高位補0,注意:并沒有<<<這個運算符
🛫 關于字符串的問題你能答對幾道?
🪂 可以修改一個字符串中的值嗎?
??不能。因為Java中字符串并不是內置的數據類型,而是標準Java類庫中提供的一個預定義類。字符串不只一種使用new的實例化方式,使用雙引號(“”)括起來的字符都是String類的一個實例,使用new方式實例的對象對分配在堆內存中,使用雙引號實例的對象在常量池中,字符串變量的值則是字符串對象的地址引用,不管使用哪種方式給字符串變量重新賦一個新值都是看上去改變了這個字符串的值,實際上只不過是改變了變量值的地址引用,原來的字符串對象還在內存中存儲且值不變
??由上圖就得以驗證我們之前的結論是正確的,使用雙引號實例化的字符串對象存儲在字符串常量池中,所以連續創建兩個內容相同的字符串會指向同一個地址。而且使用new實例化的字符串對象存儲在堆內存中,所以說使用兩種方式實例化內容相同的字符串對象,地址會不同。接下來的三種方式改變字符串的內容,地址都和原地址不同,也就是證實了字符串是一個不可變的數據類型
🪂 字符串使用==和equals判等的區別?
??==是對兩個字符串變量的引用地址值是否相等進行判斷,就算字符串的內容相等如果存儲的位置不同也會返回false。String類中重寫了Object的equals方法使之可以對字符串的內容進行判等,查看源碼不難發現重寫之后的equals方法是對兩個字符串的地址、長度、每一個字符順序進行判斷,在判斷的過程中但凡有一個不等就直接返回false。
??趁熱打鐵,結合字符串的兩種實例化方式和兩種判等方式找幾個題做做,答案放在文末了,記得去對照一下
??補充一個知識點,如果想忽略字母大小寫比較兩個字符串的內容是否相等,可以使用equalsIgnoreCase方法,用法與equals相同
🪂 空串""和null串有啥區別?
??空串是一個長度為0內容為空的字符串,屬于是一個字符串對象;null串表示這個變量并未引用任何的對象或者基本數據類型值,屬于是一個供引用數據變量引用的值。空串引用String的API 會返回值,但是null串調用String的API 的話會報NullPointerException的錯誤。一般情況下都會使用if(str != null && str.length() != 0)對字符串進行檢查,符合條件才會使用這個字符串。
🪂 這些String的常見API你都掌握了嗎?
??拓展一個compareTo方法,該方法會對比兩個字符串并返回一個int數值,對比規則:從第一個字符開始相比較,返回第一個不同的兩個字符的ASCII碼的差值(前減后),如果說一個字符串是另一個的字串就返回二者的長度差
🪂 String StringBuilder StringBuffer都是啥?
??這三種都是Java中用來操作字符串的類。區別就是String聲明一個不可變的對象,每次操作都會生成一個新的對象,并將新的對象地址賦給原來的字符串變量,而StringBuilder和StringBuffer都是在原來的對象上進行操作并不會產生新的對象,所以說在需要經常改變字符串內容的情況下最好使用這兩種類。??StringBuilder和StringBuffer也是有區別的,StringBuffer線程安全但是性能相對較差,StringBuilder線程不安全但是性能較高,于是單線程的情況下推薦使用StringBuilder,多線程的話就使用安全的StringBuffer
字符串的兩種實例化方式和兩種判等方式的問題答案