java 基礎知識,查缺補漏之
String
字符串
JDK 1.8
以前String
保存的是字符數組JDK1.9
以後String
保存的是字節數組- 請解釋
String
比較中“==”
與equals()
區別?。
“==”
:進行的是數值比較,如果用於對象比較.上比較的是兩個內存的地址數值
equals()
:是類所提供的一個比較方法,可以直接進行字符串內容的判斷。 - 任何使用
""
定義的字符串常量實際上描述的都是一個String
類的匿名對象 - 使用
equals()
進行字符串比較時,字符串常量寫在前面,如果寫在後面,可能造成空指向異常
public class Hello {
public static void main(String[] args) {
String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true
}
}
String類兩種實例化方式區別
- 直接賦值(推薦):只會產生一個實例化對象,並且可以自動保存到對象池之中,以實現該字符串實例的重用
- 構造方法:會產生兩個實例化對象,並且不會自動入池,無法實現對象重用,但是可以利用
intern()
方法手工入池
public class Hello {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
// 兩個對象所指向的堆內存是同一個
System.out.println(str1 == str2); // true
// 實例化對象時,如果`String`對象池中存在,就不會再開闢堆內存,
// 棧內存指向已存在的堆內存,所以地址比較的值爲true(指向同一塊堆內存)
}
}
- 在採用直接賦值的處理過程之中,對於字符串而言可以實現池數據的自動保存,這樣如果再有相同數據定義時可以減少對象的產生,以提升操作性能。
public class Hello {
public static void main(String[] args) {
String str1 = "hello";
// 手工入池
String str2 = new String("hello").intern();
System.out.println(str1 == str2); // true
}
}
- 使用構造方法實例化
String
對象,會開闢兩塊堆內存空間,只會使用一塊,而另外一個由於字符串常量所定義的匿名對象將成爲垃圾空間。
String 對象常量池
對象池的主要目的是實現數據的共享處理。以String
對象池爲例,裏面的內容主要就是爲了重用,而重用實際上是共享設計。
但是在Java之中對象(常量)池實際上可以分爲兩種
- 靜態常量池:指的是程序(
*.class
)在加載的時候會自動將此程序之中保存的字符串、普通的常量、類和方法的信息等等,全部進行分配 - 運行時常量池:當一個程序(
* .class
) 加載之後,裏面可能有一些變量,這個時候提供的常量池。
public class Hello {
public static void main(String[] args) {
String str1 = "How are you!";
String str2 = "How " + "are" + " you!";
// 靜態常量池
System.out.println(str1 == str2); // true
String str3 = "are";
String str4 = "How " + str3 + " you!";
// 動態常量池
System.out.println(str3 == str4); // false
}
}
參考鏈接:
- 國內最新JAVA10培訓課堂 [by 魔樂科技]
- String 類常用方法