java中的數據類型,可分爲兩類:
1.基本數據類型,也稱原始數據類型。byte,short,char,int,long,float,double,boolean
他們之間的比較,應用雙等號(==),比較的是他們的值。
2.複合數據類型(類)
當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,因此,除非是同一個new出來的對象,他們的比較後的結果爲true,不然比較後結果爲false。 JAVA當中全部的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行爲是比較對象的內存地 址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現,而再也不是比較類在堆內存中的存放地址了。
對於複合數據類型之間進行equals比較,在沒有覆寫equals方法的狀況下,他們之間的比較仍是基於他們在內存中的存放位置的地址值的,由於Object的equals方法也是用雙等號(==)進行比較的,因此比較後的結果跟雙等號(==)的結果相同。java
public class StringAndStringBuffer {apache
public static void main(String[] args) { 緩存
String str1="hello"; spa
String str2="he"+"llo";對象
String str3="he"+new String("llo"); 繼承
String str4=new String("hello");內存
System.out.println(str1==str2);字符串
System.out.println(str1==str3);class
System.err.println(str1.equals(str3)); 數據類型
System.err.println(str1==str4);
}
}
結果:true
false
true
false
分析:
1) 由於在比較中使用了== ,因此返回的值爲一個布爾值
2)==與.equals()均可以比較值是否相等,可是侷限於基本數據類型;在String類中==判斷的是其在內存中的地址是否相等, .equals能夠比較值是否相等,因此若是比較兩個字符串的值是否相等,最好仍是用equals(),如上面的str1==str3與str1.equals(str3)的區別
3)"hello","he","llo"都爲字符串常量,
第一次出現字符串常量時會在池中建立一個新的,以後出現就不會建立了, 而是直接把引用指向第一次建立的對象。但對於new出來的對象, 不管怎樣賦值,new一次建立一次(在堆中),不會考慮以前是否已經已存在相同的。並且,字符串是不可追加的, 因此每次使用鏈接符號其實至關於先產生一個常量,而後再賦給引用,原來指向的串就成垃圾被回收了。
str3建立過程當中,new String("llo")存在於堆內存中,因此所獲得的字符串對象在本身的內存中,而再也不緩衝池中
str2建立的過程當中,"he","llo"都已經存在緩存池中,獲得的str2="hello"已經存在緩衝池中,因此直接引用str1
str4建立的對象存在於堆內存中,不能直接引用
4)System.out.println與System.err.println()都是打印出來,可是後者顯示的爲紅色,並且在顯示順序上始終在out的後面
比較兩個字符串是否相等,優先使用
1)StringUtils.equals(str1,str2);
org.apache.commons.lang.StringUtils
2)str1.equals(str2);
3)str1==str2;