先看一段小程序:
---------------------------------------------------------------
1.public class MyClass
2.{
3. static String s1 = "I am unique!";
4. public static void main(String args[])
5. {
6. String s2 = "I am unique!";
7. String s3 = new String(s1);
8. System.out.println(s1 == s2);
9. System.out.println(s1.equals(s2));
10. System.out.println(s3 == s1);
11. System.out.println(s3.equals(s1));
12. System.out.println(TestClass.s4 == s1);
13. }
14.}
---------------------------------------------------------------
這段程序是非常簡單的。但是為什么new出來的對象用==判斷為false,而基本類型的直接賦值用==判斷就是true呢?
這是因為在JAVA的對象存儲機制里,new出來的一定是對象,而對象在內存中的存貯位置在Heap(堆)中,而基本類型在程序中出現的比較頻繁(注:JAVA中的基本類型為8中,分別是:boolean,char,byte,short,int,long,float,double),所以通過new產生這些對象而將其放入在heap中效率反而不高,所以JAVA直接采取C/C++的方式,也就是不以new來分配其空間,而是產生一種所謂的“automatic”變量(不在是reference的形式),來解決效率的問題,此類變量直接放數據值,并且置于stack(棧)中,因為stack在空間的分配和釋放上,效率要好的多。而恰恰是這種在內存中位置的不同,在stack中為基本類型變量分配空間時,如果stack中有一樣的數據時,將不在創建新的數據,所以導致這個時候比較的兩個基本類型值時,即使用==也是true。
因為JAVA保存了基本類型,而基本類型(入int、char等)并不具備面向對象的特點,比如擁有類的對象和方法。所以在JAVA中引入了new出來的基本類型,比如character c = new character( )的形式?;诖?,嚴格的講,JAVA并不是像人們所宣稱的是徹底的純粹的面向對象語言。
簡單點就是
==:
1、比較的是操作符兩端的操作數是否是同一個對象
2、兩邊的操作數必須是同一類型的(可以是父子類之間)才能編譯通過。
3、比較的是地址,如果是具體的阿拉伯數字的比較,值相等則為TRUE,如:
int a=10 與 long b=10L 與 double c=10.0都是相同的(為true),因為他們都指向地址為10的堆
equals:
1、比較的是兩個對象的內容是否一樣
posted on 2008-09-03 21:02
greedy 閱讀(233)
評論(0) 編輯 收藏 所屬分類:
Java技術