關於 Java 常量池
當你新建兩個對象做 == 比較時, 卻會出現很有意思的效果, 參見例題 1.
//常量池 例題1
static void T01(){
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1 == s2); //true
System.out.println(s2 == s3); //false
}
... java'''
- 原因
- 一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配的, 二堆內存中則存放 new 出來的對象和數組, 初次之外, 還有一塊區域, 叫做常量池. 第一個 s1 對象, 這樣的聲明值就存在常量池中, 當創建第二個對象 s2 時, java 底層會優先在常量池中查找是否有相同值, 如果存在則指向這個值, 所以第一個判斷爲什麼會爲 true.
下面來看第二個例子
static void T02(){
Integer a =1000,b=1000;
Integer c=100,d=100;
System.out.println(a == b);
System.out.println(c == d);
}
... java'''
- 基本知識
- == 表示兩個引用指向同一對象.即使值相同,指向不同也不同.
- 說明
- 但按照常量池的說明,這裏面第一個應該是true啊,但實際上Integer.java類有一個內部私有類 IntergerCache.java,它緩存了-128到127之間的所有的整數對象.
- 所以變成了
//Integer對象調用valueOf()對象進行類型轉換. -128 - 127緩存了下來,所以在-127 - 128之間的時候是引用的同一個對象
//int和Integer進行==比較時,會把Integer自動拆箱,轉換成int類型. true
... java'''