先看一段小程序:
---------------------------------------------------------------
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.}
---------------------------------------------------------------
這段程序是非常簡(jiǎn)單的。但是為什么new出來(lái)的對(duì)象用==判斷為false,而基本類(lèi)型的直接賦值用==判斷就是true呢?
這是因?yàn)樵贘AVA的對(duì)象存儲(chǔ)機(jī)制里,new出來(lái)的一定是對(duì)象,而對(duì)象在內(nèi)存中的存貯位置在Heap(堆)中,而基本類(lèi)型在程序中出現(xiàn)的比較頻繁(注:JAVA中的基本類(lèi)型為8中,分別是:boolean,char,byte,short,int,long,float,double),所以通過(guò)new產(chǎn)生這些對(duì)象而將其放入在heap中效率反而不高,所以JAVA直接采取C/C++的方式,也就是不以new來(lái)分配其空間,而是產(chǎn)生一種所謂的“automatic”變量(不在是reference的形式),來(lái)解決效率的問(wèn)題,此類(lèi)變量直接放數(shù)據(jù)值,并且置于stack(棧)中,因?yàn)閟tack在空間的分配和釋放上,效率要好的多。而恰恰是這種在內(nèi)存中位置的不同,在stack中為基本類(lèi)型變量分配空間時(shí),如果stack中有一樣的數(shù)據(jù)時(shí),將不在創(chuàng)建新的數(shù)據(jù),所以導(dǎo)致這個(gè)時(shí)候比較的兩個(gè)基本類(lèi)型值時(shí),即使用==也是true。
因?yàn)镴AVA保存了基本類(lèi)型,而基本類(lèi)型(入int、char等)并不具備面向?qū)ο蟮奶攸c(diǎn),比如擁有類(lèi)的對(duì)象和方法。所以在JAVA中引入了new出來(lái)的基本類(lèi)型,比如character c = new character( )的形式。基于此,嚴(yán)格的講,JAVA并不是像人們所宣稱(chēng)的是徹底的純粹的面向?qū)ο笳Z(yǔ)言。
簡(jiǎn)單點(diǎn)就是
==:
1、比較的是操作符兩端的操作數(shù)是否是同一個(gè)對(duì)象
2、兩邊的操作數(shù)必須是同一類(lèi)型的(可以是父子類(lèi)之間)才能編譯通過(guò)。
3、比較的是地址,如果是具體的阿拉伯?dāng)?shù)字的比較,值相等則為T(mén)RUE,如:
int a=10 與 long b=10L 與 double c=10.0都是相同的(為true),因?yàn)樗麄兌贾赶虻刂窞?0的堆
equals:
1、比較的是兩個(gè)對(duì)象的內(nèi)容是否一樣
posted on 2008-09-03 21:02
greedy 閱讀(233)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
Java技術(shù)