1. java中數據類型分類
1.1 基本數據類型
又稱為原始數據類型,byte,short,char,int,long,float,double,boolean,他們之間的比較應該使用(==),比較的是他們的值。
1.2 復合數據類型
當復合數據類型用(==)進行比較,比較的是他們在內存中的存放地址。下面介紹equals方法。
在Java的Object類中定義了equals方法,當復合數據類型之間進行equals比較時,這個方法的初始行為是比較對象在堆內存中的地址,但在一些諸如String,Integer,Date類中這個方法被覆蓋了,在這些類當中equals有其自身的實現,作用被覆蓋為比較內容是否相同。
本文原創,轉載請注明出處:http://blog.csdn.net/seu_calvin/article/details/52089040
2. String類的討論
[java] view plain copy
輸出:s1%20!=%20s2s1%20equals%20s2說明:s1%20s2分別引用了兩個對象。顯然,兩者內容是相同的,因此equal返回true。第一個例子也一樣。
我們接下來將詳細討論,為什么在上面兩個例子中,s1和s2出現了兩種不同的指向對象的情況。
3.%20 %20解釋
[java] view%20plain copy兩種的形式來創建,第一種是用new()來新建對象的,那么這種情況的內存是怎么分配的呢,答案是在堆空間和字符串常量池中。每調用一次就會在堆中創建一個新的對象,如果常量池中已經存在"abc",那么就不會額外在常量池中生成引用。因此這句話會產生一個或者兩個對象。
而第二種是先在常量池中創建一個對String類的對象引用變量str,然后查找常量池中有沒有存放"abc",如果沒有,則將"abc"存放并令str指向”abc”,如果已經有”abc”則直接令str指向“abc”。 由于String類的immutable性質,當String變量需要經常變換其值時,應該考慮使用StringBuffer類,以提高程序效率。
具體可以查看此篇String、StringBuider以及StringBuffer的區別和使用場景。
4. String類的intern方法
[java] view%20plain copy程序輸出:s1%20==%20s2s1%20equals%20s2這次加入:s2%20=%20s2.intern(),java.lang.String的intern()方法,"abc".intern()方法的返回值還是字符串"abc",表面上看起來好像這個方法沒什么用處。但實際上,它做了個小動作:檢查字符串池里是否存在"abc"這么一個字符串,如果存在,就返回池里的字符串;如果不存在,該方法會把"abc"添加到字符串池中,然后再返回它的引用。但是這也僅僅是JDK1.6以及以前的過時的處理方法,如果想了解更全更清晰的intern()方法,請務必參考我的這篇博文Java技術——你真的了解String類的intern()方法嗎。
5. 為什么Java中1000==1000為false而100==100為true?
[java] view%20plain copy
查看Integer.java類,會發現有一個內部私有類,IntegerCache.java,它緩存了從-128到127之間的所有的整數對象。
所以例子中i1和i2指向了一個對象。因此100==100為true。
新聞熱點
疑難解答