2016-05-08 155 views
0

我們知道Java中的運行時常量池存儲以下文字: 1)整數2)長整數3)浮點數4)雙精度5)字符串。因此,布爾文字和字符文字存儲在哪裏?在Java中比較兩個具有相同值的字符

實施例:

Character c1 = 'a'; 
Character c2 = 'a'; 
System.out.println(c1==c2); //prints true 

由於==比較參考,確實c1和c2共享相同的參考? (=注意,這些文字被創建爲使得它們各自的原始包裝類的對象。

回答

0
Character c1 = 'a'; 
Character c2 = 'a'; 

作爲相同

Character c1 = 'a'; 
Character c2 = c1; 

兩篇參考文獻指向相同object.In第二殼體我創建,C2指的是C1,其中C1也是真實指向的對象'a'的引用變量。

更多解釋關於引用變量可以發現here

更準確地說,你在堆棧內存中創建了兩個引用變量,名義上是c1和c2,但是它們都指向堆內存中的同一個對象!

+1

不喜歡這個人:你能解釋我說的錯嗎? –

+0

不正確。 'char'文字在每行上被自動裝箱成單獨的'Character'類實例。看到「字符」實例是不可變的,它們在使用中情感上是「相同的」,但在記憶中佔據不同的地方。 – Ownaginatious

+0

可能無法保證正在使用的JVM實現足夠成熟以緩存容易計算的基元(即char和boolean)的盒裝實例。所以你說的不一定是錯的,它不一定總是正確的。無論如何,你沒有回答這個問題。在你的例子中將'Character'改爲'Long',並且你所說的不太可能會成爲現實。我不是那個低估了你的人;) – Ownaginatious

2

正如你所說,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類)。

希望這有助於:)

2

我們知道,在Java的運行時間常量池存儲以下文字:1)整數2)長3)漂浮4)雙5)字符串。

其實這並不完全正確。正確的說法是,在實踐存在對於每種類型BooleanByteShortCharacterIntegerLong的autoboxed值單獨運行時庫。

這些池是不是文字 ...因爲不存在的包裝類型的文字。這些類型的Java文字是基本類型的值。 (事實上​​,有沒有不同的文字,在所有類型的byteshort ...根據JLS)。

不會有自動裝箱池爲FloatDouble,儘管什麼相應的valueOf方法的javadoc,似乎暗示。對於FloatDouble,JLS不需要自動包緩存,並且這些庫不實現它(至少在Java 6,7,8中)。

另一件需要注意的事情是,並非所有由自動裝箱生成的值都會在相應的池中。例如,(默認情況下)只有Integer緩存-128到+127的值。

因此,布爾文字和文字文字存儲在哪裏?

答案從以上如下:

  • 沒有Boolean類型和Character的文字。
  • 實例BooleanCharacter通過自動裝箱創建可能來自相應的自動裝箱池。

併爲您的示例:

因爲==比較引用,確實C1和C2共享相同的參考?

這是正確的。它說明了以前的觀點。 Character的自動裝箱池需要(由JLS)緩存'\u0000''\u007f'


請注意,我遺漏了StringString池是不同的,因爲它(主要)是字符串文字。另一方面,沒有爲字符串值定義自動裝箱...因爲字符串值不必與原始封裝對比來區分封裝對分。


1 - 對不起,是迂腐,但如果你想真正瞭解這些東西,連貫談談他們的其他人,必須使用正確的Java特定的術語。爲了嚴格正確,文字是出現在程序的>>源代碼< <中的東西。在運行時,相應的東西就是一個Value。

相關問題