我們知道Java中的運行時常量池存儲以下文字: 1)整數2)長整數3)浮點數4)雙精度5)字符串。因此,布爾文字和字符文字存儲在哪裏?在Java中比較兩個具有相同值的字符
實施例:
Character c1 = 'a';
Character c2 = 'a';
System.out.println(c1==c2); //prints true
由於==
比較參考,確實c1和c2共享相同的參考? (=注意,這些文字被創建爲使得它們各自的原始包裝類的對象。
我們知道Java中的運行時常量池存儲以下文字: 1)整數2)長整數3)浮點數4)雙精度5)字符串。因此,布爾文字和字符文字存儲在哪裏?在Java中比較兩個具有相同值的字符
實施例:
Character c1 = 'a';
Character c2 = 'a';
System.out.println(c1==c2); //prints true
由於==
比較參考,確實c1和c2共享相同的參考? (=注意,這些文字被創建爲使得它們各自的原始包裝類的對象。
Character c1 = 'a';
Character c2 = 'a';
作爲相同
Character c1 = 'a';
Character c2 = c1;
兩篇參考文獻指向相同object.In第二殼體我創建,C2指的是C1,其中C1也是真實指向的對象'a'
的引用變量。
更多解釋關於引用變量可以發現here。
更準確地說,你在堆棧內存中創建了兩個引用變量,名義上是c1和c2,但是它們都指向堆內存中的同一個對象!
正如你所說,c1和c2在堆中共享同一個對象,所以比較結果是正確的。這是Java緩存機制。所有字符,值在-127到127之間的整數都將被緩存。所以Java將獲得緩存值,而不是創建新的值。這就是爲什麼兩個對象共享相同的引用。
Character c1 = 'a';
Character c2 = 'a';
Character c3 = new Character('a'); // force Java creates new object in heap
System.out.println(c1 == c2); -> true
System.out.println(c1 == c3); -> false
這是出於同樣的原因又如:
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2); // true
Integer i3 = 1000;
Integer i4 = 1000;
System.out.println(i3 == i4); // false, out of cache range
你會滿足串另一個例子,但在不同的機制:
String s1 = "stack";
String s2 = "stack";
String s3 = new String("stack");
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false
創建時,所有的java字符串會分配和存儲在String Pool
。當你創建新的字符串時(如果是s2),Java將在String pool
中搜索這個字符串是否已經分配到某個地方。在s3的情況下,我們對Java說:「嗨,Java,請始終爲我創建一個新的」。
總結,當比較兩個對象時,使用compareTo
方法,當比較兩個基元時,可以使用==
運算符。 (只是提醒你舊的Java類)。
希望這有助於:)
我們知道,在Java的運行時間常量池存儲以下文字:1)整數2)長3)漂浮4)雙5)字符串。
其實這並不完全正確。正確的說法是,在實踐存在對於每種類型Boolean
,Byte
,Short
,Character
,Integer
和Long
的autoboxed值單獨運行時庫。
這些池是不是文字 ...因爲不存在的包裝類型的文字。這些類型的Java文字是基本類型的值。 (事實上,有沒有不同的文字,在所有類型的byte
或short
...根據JLS)。
不會有自動裝箱池爲Float
和Double
,儘管什麼相應的valueOf
方法的javadoc,似乎暗示。對於Float
和Double
,JLS不需要自動包緩存,並且這些庫不實現它(至少在Java 6,7,8中)。
另一件需要注意的事情是,並非所有由自動裝箱生成的值都會在相應的池中。例如,(默認情況下)只有Integer
緩存-128到+127的值。
因此,布爾文字和文字文字存儲在哪裏?
答案從以上如下:
Boolean
類型和Character
的文字。Boolean
和Character
通過自動裝箱創建可能來自相應的自動裝箱池。併爲您的示例:
因爲==比較引用,確實C1和C2共享相同的參考?
這是正確的。它說明了以前的觀點。 Character
的自動裝箱池需要(由JLS)緩存'\u0000'
到'\u007f'
。
請注意,我遺漏了String
。 String
池是不同的,因爲它(主要)是字符串文字。另一方面,沒有爲字符串值定義自動裝箱...因爲字符串值不必與原始封裝對比來區分封裝對分。
1 - 對不起,是迂腐,但如果你想真正瞭解這些東西,連貫談談他們的其他人,必須使用正確的Java特定的術語。爲了嚴格正確,文字是出現在程序的>>源代碼< <中的東西。在運行時,相應的東西就是一個Value。
不喜歡這個人:你能解釋我說的錯嗎? –
不正確。 'char'文字在每行上被自動裝箱成單獨的'Character'類實例。看到「字符」實例是不可變的,它們在使用中情感上是「相同的」,但在記憶中佔據不同的地方。 – Ownaginatious
可能無法保證正在使用的JVM實現足夠成熟以緩存容易計算的基元(即char和boolean)的盒裝實例。所以你說的不一定是錯的,它不一定總是正確的。無論如何,你沒有回答這個問題。在你的例子中將'Character'改爲'Long',並且你所說的不太可能會成爲現實。我不是那個低估了你的人;) – Ownaginatious