目錄
1.?Java語言有幾種基本類型,分別是什么?
整數類型(Integer Types):
浮點類型(Floating-Point Types):
字符類型(Character Type):
布爾類型(Boolean Type):
2.?int[]類型是不是基本類型?
3.?什么是128陷阱?什么是裝箱?什么是拆箱?為什么要有包裝類?
128 位整數陷阱(128-bit Integer Trap):
裝箱和拆箱(Boxing and Unboxing):
包裝類(Wrapper Classes):
為什么要有包裝類?:
4.?位運算有哪幾種?
按位與(&):
按位或(|):
按位異或(^):
取反(~):
左移(<<):
右移(>>):
無符號右移(>>>):
5.?“>>”和”>>>”的區別是什么?
>> 右移操作符:
>>> 無符號右移操作符:
6.?String類的常用函數有哪些?列舉十種。
length() 方法:
charAt(int index) 方法:
substring(int beginIndex) 和 substring(int beginIndex, int endIndex) 方法:
concat(String str) 方法:
indexOf(String str) 和 indexOf(String str, int fromIndex) 方法:
toUpperCase() 和 toLowerCase() 方法:
trim() 方法:
startsWith(String prefix) 和 endsWith(String suffix) 方法:
replace(char oldChar, char newChar) 和 replace(CharSequence target, CharSequence replacement) 方法:
split(String regex) 方法:
7.?String和StringBuffer,StringBuilder的區別有哪些?所有類名包含Buffer的類的內部實現原理是什么?有什么優勢?
String 類:
StringBuffer 類:
StringBuilder 類:
優勢:
8.?String字符串的不可變是指哪里不可變?
值不可變:
長度不可變:
????????不可變性的好處:
9.?字符串常量池是什么?不同的JDK版本都分別位于哪個區域?
10.?Java異常類有哪些?分別管理什么異常?
檢查異常(Checked Exception):
非檢查異常(Unchecked Exception):
我的其他博客
1.?Java語言有幾種基本類型,分別是什么?
在Java中,基本數據類型分為兩大類:原始數據類型(Primitive Data Types)和引用數據類型(Reference Data Types)。原始數據類型又分為四類:整數類型、浮點類型、字符類型和布爾類型。
-
整數類型(Integer Types):
- byte:8位,有符號,范圍為-128到127。
- short:16位,有符號,范圍為-32,768到32,767。
- int:32位,有符號,范圍為-2^31到2^31-1。
- long:64位,有符號,范圍為-2^63到2^63-1。
-
浮點類型(Floating-Point Types):
- float:32位,單精度浮點數。
- double:64位,雙精度浮點數。
-
字符類型(Character Type):
- char:16位,無符號,表示Unicode字符。
-
布爾類型(Boolean Type):
- boolean:表示邏輯值,只能取
true
或false
。
- boolean:表示邏輯值,只能取
這些基本數據類型是Java語言的基礎,用于存儲簡單的數據值。在Java中,對象都是引用數據類型,包括類、接口、數組等。這些基本數據類型具有不同的大小和范圍,根據需要選擇合適的類型來存儲數據。
2.?int[]類型是不是基本類型?
不是,int[]
不是基本數據類型,而是一種引用數據類型。在Java中,數組是一種引用數據類型,它可以包含基本數據類型的元素或其他引用類型的元素。int[]
表示一個整數類型的數組,其中的元素都是 int
類型。
基本數據類型是存儲簡單數值的類型,而引用數據類型是用來存儲對象引用的類型。基本數據類型直接包含數據值,而引用數據類型包含對存儲在內存中的對象的引用。
當你聲明一個 int[]
類型的數組時,實際上創建了一個對象,該對象存儲了一組整數,并且變量(數組名)存儲的是對該對象的引用。因此,int[]
是引用數據類型,而不是基本數據類型。
3.?什么是128陷阱?什么是裝箱?什么是拆箱?為什么要有包裝類?
128 位整數陷阱(128-bit Integer Trap):
Java 中的基本數據類型 long
是 64 位的,而在某些場景下需要表示更大的整數值,比如超過 Long.MAX_VALUE
。在這種情況下,有時候會考慮使用 BigInteger
類,它可以表示任意大小的整數,但由于其靈活性和大數計算的特性,性能可能相對較低,而且在處理一些常規整數時不如基本數據類型高效。
裝箱和拆箱(Boxing and Unboxing):
- 裝箱: 將基本數據類型轉換為對應的包裝類對象。例如,將
int
裝箱為Integer
。 - 拆箱: 將包裝類對象轉換為對應的基本數據類型。例如,將
Integer
拆箱為int
。
// 裝箱
int primitiveInt = 42;
Integer boxedInt = Integer.valueOf(primitiveInt);// 拆箱
int unboxedInt = boxedInt.intValue();
-
包裝類(Wrapper Classes):
-
Java 提供了一組包裝類,用于將基本數據類型轉換為對象,以便在需要對象的上下文中使用。以下是常見的包裝類:
Boolean
:對應基本數據類型boolean
Byte
:對應byte
Short
:對應short
Integer
:對應int
Long
:對應long
Float
:對應float
Double
:對應double
Character
:對應char
通過使用包裝類,可以在需要對象的情況下使用基本數據類型,也可以在集合類中存儲基本數據類型,因為集合類通常只能存儲對象。
-
為什么要有包裝類?:
- 對象化: 在需要對象而基本數據類型不夠時,可以使用包裝類將其轉化為對象。
- 集合框架: 集合類(如
List
、Set
、Map
等)只能存儲對象,因此需要包裝類來存儲基本數據類型的值。 - 泛型: 泛型也要求使用對象,而不是基本數據類型。
包裝類提供了一種將基本數據類型轉換為對象的方式,使得在某些情況下,可以方便地在面向對象的環境中使用基本數據類型。同時,自動裝箱和拆箱的特性使得在基本數據類型和其對應的包裝類之間進行轉換更加方便。
?
?
4.?位運算有哪幾種?
位運算是一種對二進制位進行操作的運算,Java 提供了幾種常見的位運算操作符:
-
按位與(&):
- 兩個相應的位都為1時,結果為1;否則,結果為0。
-
按位或(|):
- 兩個相應的位只要有一個為1,結果就為1;否則,結果為0。
-
按位異或(^):
- 兩個相應的位不同,結果為1;相同,結果為0。
-
取反(~):
- 每個位上的0變成1,1變成0。
-
左移(<<):
- 將操作數的所有位向左移動指定的次數,右側空出的位用0填充。
-
右移(>>):
- 將操作數的所有位向右移動指定的次數,左側空出的位根據符號位(正數補0,負數補1)或者補0進行填充。
-
無符號右移(>>>):
- 將操作數的所有位向右移動指定的次數,左側空出的位總是用0填充。
這些位運算操作符可以用于執行一些底層的位級操作,如掩碼、權限控制、壓縮存儲等。在一些特定的場景中,位運算可以提高程序的執行效率。
5.?“>>”和”>>>”的區別是什么?
>>
和 >>>
都是右移操作符,但它們在處理帶符號整數和無符號整數時有一些區別。
-
>>
右移操作符:int x = -8; System.out.println(x >> 1); // 結果為 -4
- 對于正數,
>>
和>>>
的效果相同,都是將所有位右移,左側空出的位用0填充。 - 對于負數,
>>
采用“算術右移”,即將所有位右移,左側空出的位用符號位填充(即保持符號位不變)。
- 對于正數,
>>>
無符號右移操作符:
>>> 無符號右移操作符:無論正數還是負數,>>> 都是采用“邏輯右移”,即將所有位右移,左側空出的位總是用0填充。
- 無論正數還是負數,
>>>
都是采用“邏輯右移”,即將所有位右移,左側空出的位總是用0填充。
6.?String類的常用函數有哪些?列舉十種。
String
類是 Java 中用來表示字符串的類,它提供了許多常用的方法來操作字符串。以下是 String
類的一些常用方法,其中列舉了十種:
length()
方法:
-
返回字符串的長度,即包含的字符數。
charAt(int index)
方法:
- 返回字符串中指定索引位置的字符。
substring(int beginIndex)
和 substring(int beginIndex, int endIndex)
方法:
substring(int beginIndex)
返回從指定索引開始到字符串末尾的子字符串。substring(int beginIndex, int endIndex)
返回從指定索引開始到指定索引結束之前的子字符串。
concat(String str)
方法:
- 將指定字符串連接到該字符串的末尾。
indexOf(String str)
和 indexOf(String str, int fromIndex)
方法:
indexOf(String str)
返回指定子字符串在該字符串中第一次出現的索引。indexOf(String str, int fromIndex)
從指定的索引位置開始,返回指定子字符串在該字符串中第一次出現的索引
toUpperCase()
和 toLowerCase()
方法:
toUpperCase()
將字符串中的所有字符轉換為大寫。toLowerCase()
將字符串中的所有字符轉換為小寫。
trim()
方法:
- 返回一個字符串,刪除了原字符串開頭和末尾的所有空格。
startsWith(String prefix)
和 endsWith(String suffix)
方法:
startsWith(String prefix)
判斷字符串是否以指定的前綴開始。endsWith(String suffix)
判斷字符串是否以指定的后綴結束。
replace(char oldChar, char newChar)
和 replace(CharSequence target, CharSequence replacement)
方法:
replace(char oldChar, char newChar)
替換字符串中的所有指定字符。replace(CharSequence target, CharSequence replacement)
替換字符串中的所有指定字符序列。
split(String regex)
方法:
- 使用給定的正則表達式拆分字符串,返回一個字符串數組。
7.?String和StringBuffer,StringBuilder的區別有哪些?所有類名包含Buffer的類的內部實現原理是什么?有什么優勢?
String
、StringBuffer
和 StringBuilder
是 Java 中用于處理字符串的三個主要類,它們有一些關鍵的區別,主要體現在可變性、線程安全性和性能上。
String
類:
在選擇使用 String
、StringBuffer
或 StringBuilder
時,需要根據具體的需求來決定。如果在多線程環境下,需要線程安全性,則選擇 StringBuffer
;如果在單線程環境下,并且不需要線程安全性,則選擇 StringBuilder
,由于 StringBuilder
不進行同步,因此性能更好。如果字符串是常量,不需要修改,則選擇 String
。
- 不可變性: 字符串是不可變的,一旦創建,內容無法修改。
- 線程安全: 由于字符串是不可變的,所以是線程安全的。
- 性能: 由于不可變性,每次對字符串進行修改都會創建一個新的字符串對象,可能導致性能開銷。
StringBuffer
類: - 可變性: 字符串緩沖區,可以修改其中的內容。
- 線程安全:
StringBuffer
是線程安全的,各個方法都進行了同步處理。 - 性能: 在多線程環境下使用時,相對于
StringBuilder
,由于同步處理,性能稍遜一籌。StringBuilder
類: - 可變性: 字符串生成器,可以修改其中的內容。
- 線程安全:
StringBuilder
是非線程安全的,不進行同步處理。 - 性能: 在單線程環境下,由于不進行同步處理,性能較好。
關于所有類名包含 "Buffer" 的類的內部實現原理,通常這些類都是基于緩沖區(Buffer)實現的。緩沖區是一塊臨時存儲區域,用于臨時保存數據,提高讀寫的效率。這些類通常使用數組作為底層數據結構,通過對數組的操作來實現對字符串的修改。緩沖區的使用可以避免頻繁的對象創建和銷毀,從而提高字符串操作的效率。
優勢:
- 性能:
StringBuffer
和StringBuilder
通過使用可變的緩沖區,避免了頻繁的對象創建和銷毀,提高了字符串操作的性能。 - 靈活性: 可以方便地對字符串進行修改,而不需要創建新的字符串對象。
8.?String字符串的不可變是指哪里不可變?
字符串的不可變性是指在創建之后,字符串對象的內容不可被修改。具體來說,不可變性表現在以下幾個方面:
值不可變:
一旦字符串對象被創建,其中的字符序列不可更改。
長度不可變:
字符串的長度在創建后也是不可變的。無法通過直接修改字符串對象來改變其長度。
????????不可變性的好處:
-
線程安全性: 由于字符串是不可變的,多個線程可以安全地共享字符串對象,而無需擔心修改沖突。
-
安全性: 字符串不可變性提供了一定的安全性,因為它們無法在創建后被意外地修改。
-
緩存: 由于字符串的不可變性,可以進行一些優化,例如字符串常量池的使用,以及緩存哈希碼等。
?
9.?字符串常量池是什么?不同的JDK版本都分別位于哪個區域?
字符串常量池(String Constant Pool)是 Java 中用于存儲字符串常量的一個特殊的內存區域。字符串常量池的目的是提高字符串的重用性,減少內存的占用。
在 Java 中,字符串常量池位于方法區(Method Area),這是一種線程共享的內存區域,存儲了類的結構信息、靜態變量、常量池等數據。
不同的 JDK 版本中,字符串常量池的具體位置可能有所變化:
-
JDK 6 及之前:
- 字符串常量池位于永久代(Permanent Generation)中。
-
JDK 7 和 JDK 8:
- JDK 7 中還是位于永久代。
- JDK 8 引入了元空間(Metaspace),替代了永久代。字符串常量池被移至堆中,與堆共享內存。
-
JDK 9 及之后:
- JDK 9 進一步改進了內存模型,移除了永久代,完全采用元空間,字符串常量池仍然位于堆中。
在 JDK 7 和 JDK 8 中,字符串常量池的移動到堆中的改變,是為了解決永久代內存泄漏的問題。元空間的引入進一步改善了類的元信息存儲機制,避免了永久代的一些限制和問題。
請注意,由于不同的 JDK 實現和配置可能有所不同,具體的內存區域分配情況可能會有一些變化。上述描述主要是針對 Oracle JDK 和 OpenJDK 的情況。
10.?Java異常類有哪些?分別管理什么異常?
Java 中的異常分為兩大類:檢查異常(Checked Exception)和非檢查異常(Unchecked Exception)。
檢查異常(Checked Exception):
-
IOException:
- 用于處理輸入輸出操作中可能發生的異常,如文件讀寫等。
-
FileNotFoundException:
- 繼承自 IOException,表示嘗試打開一個不存在的文件時拋出的異常。
-
ParseException:
- 通常用于處理字符串解析為日期等格式時可能發生的異常。
-
SQLException:
- 用于處理與數據庫相關的異常。
-
ClassNotFoundException:
- 在使用 Class 類的 forName 方法時,如果指定的類不存在,會拋出此異常。
非檢查異常(Unchecked Exception):
-
RuntimeException:
- 這是一個非常常見的非檢查異常的父類,包括以下幾種:
- ArithmeticException: 用于處理算術運算中可能發生的異常,如除以零。
- NullPointerException: 表示對一個對象調用方法、訪問字段或數組元素時,對象引用為 null。
- ArrayIndexOutOfBoundsException: 表示數組下標越界。
- IndexOutOfBoundsException: 表示索引越界,通常由于集合操作中的錯誤使用引起。
- IllegalArgumentException: 表示傳遞給方法的參數值不合法。
- IllegalStateException: 表示對象的狀態不合法。
- NumberFormatException: 表示字符串轉換為數字時的格式錯誤。
- ConcurrentModificationException: 在使用迭代器遍歷集合的過程中,如果集合的結構發生變化,會拋出此異常。
- 這是一個非常常見的非檢查異常的父類,包括以下幾種:
-
NullPointerException:
- 雖然
NullPointerException
屬于RuntimeException
的子類,但由于其普遍性,特別列出。 - 表示對一個對象調用方法、訪問字段或數組元素時,對象引用為 null。
- 雖然
-
ArrayIndexOutOfBoundsException:
- 同樣屬于
RuntimeException
的子類,表示數組下標越界。
- 同樣屬于
這些異常類用于處理在程序運行期間可能出現的各種錯誤狀況。檢查異常在編譯期強制處理,程序員必須捕獲或聲明拋出,而非檢查異常通常是運行時異常,程序員可以選擇捕獲和處理,也可以不處理。
我的其他博客
簡單介紹一些其他的樹-CSDN博客
認識二叉樹(詳細介紹)-CSDN博客
正則表達式詳細講解-CSDN博客
低代碼開發:創新之道還是軟件開發的捷徑?-CSDN博客
HTTP與HTTTPS的區別-CSDN博客
什么情況下會產生StackOverflowError(棧溢出)和OutOfMemoryError(堆溢出)怎么排查-CSDN博客
在多線程中sleep()和wait()的區別(詳細)-CSDN博客
談談我對HashMap擴容機制的理解及底層實現-CSDN博客
堆排序詳細講解(一文足矣JAVA)-CSDN博客