国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

JVM角度比較==和equals的區(qū)別·

2019-11-11 02:17:25
字體:
供稿:網(wǎng)友

1.  java中數(shù)據(jù)類型分類

1.1    基本數(shù)據(jù)類型

又稱為原始數(shù)據(jù)類型,byte,short,char,int,long,float,double,boolean,他們之間的比較應(yīng)該使用(==),比較的是他們的值。

1.2    復(fù)合數(shù)據(jù)類型

當(dāng)復(fù)合數(shù)據(jù)類型用(==)進(jìn)行比較,比較的是他們?cè)趦?nèi)存中的存放地址。下面介紹equals方法。

 在Java的Object類中定義了equals方法,當(dāng)復(fù)合數(shù)據(jù)類型之間進(jìn)行equals比較時(shí),這個(gè)方法的初始行為是比較對(duì)象在堆內(nèi)存中的地址,但在一些諸如String,Integer,Date類中這個(gè)方法被覆蓋了,在這些類當(dāng)中equals有其自身的實(shí)現(xiàn),作用被覆蓋為比較內(nèi)容是否相同。

本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.net/seu_calvin/article/details/52089040

2.  String類的討論

[java] view plain copy 在CODE上查看代碼片String s1 = "Hello";  String s2 = "Hello";  if (s1 == s2){   System.out.String s1 = "Hello";  String s2 = new String("Hello");  if (s1 == s2){  System.out.println("s1 == s2");  }else{  System.out.println("s1 != s2");  }  if (s1.equals(s2)) {  System.out.println("s1 equals s2");  }else{  System.out.println("s1 not equals s2");  }  

輸出:s1%20!=%20s2s1%20equals%20s2說明:s1%20s2分別引用了兩個(gè)對(duì)象。顯然,兩者內(nèi)容是相同的,因此equal返回true。第一個(gè)例子也一樣。

我們接下來將詳細(xì)討論,為什么在上面兩個(gè)例子中,s1和s2出現(xiàn)了兩種不同的指向?qū)ο蟮那闆r。

3.%20 %20解釋

[java] view%20plain copy String str = new String("abc");   String str = "abc";   

兩種的形式來創(chuàng)建,第一種是用new()來新建對(duì)象的,那么這種情況的內(nèi)存是怎么分配的呢,答案是在堆空間和字符串常量池中。每調(diào)用一次就會(huì)在堆中創(chuàng)建一個(gè)新的對(duì)象,如果常量池中已經(jīng)存在"abc",那么就不會(huì)額外在常量池中生成引用。因此這句話會(huì)產(chǎn)生一個(gè)或者兩個(gè)對(duì)象。

而第二種是先在常量池中創(chuàng)建一個(gè)對(duì)String類的對(duì)象引用變量str,然后查找常量池中有沒有存放"abc",如果沒有,則將"abc"存放并令str指向”abc”,如果已經(jīng)有”abc”則直接令str指向“abc”。 由于String類的immutable性質(zhì),當(dāng)String變量需要經(jīng)常變換其值時(shí),應(yīng)該考慮使用StringBuffer類,以提高程序效率。 

具體可以查看此篇String、StringBuider以及StringBuffer的區(qū)別和使用場(chǎng)景。

4.  String類的intern方法

[java] view%20plain copy String s1 = "Hello";  String s2 = new String("Hello");  s2 = s2.intern();  if (s1 == s2){  System.out.println("s1 == s2");  }else{  System.out.println("s1 != s2");  }  if (s1.equals(s2)) {  System.out.println("s1 equals s2");  }else{  System.out.println("s1 not equals s2");  }  程序輸出:s1%20==%20s2s1%20equals%20s2這次加入:s2%20=%20s2.intern(),java.lang.String的intern()方法,"abc".intern()方法的返回值還是字符串"abc",表面上看起來好像這個(gè)方法沒什么用處。但實(shí)際上,它做了個(gè)小動(dòng)作:檢查字符串池里是否存在"abc"這么一個(gè)字符串,如果存在,就返回池里的字符串;如果不存在,該方法會(huì)把"abc"添加到字符串池中,然后再返回它的引用。但是這也僅僅是JDK1.6以及以前的過時(shí)的處理方法,如果想了解更全更清晰的intern()方法,請(qǐng)務(wù)必參考我的這篇博文Java技術(shù)——你真的了解String類的intern()方法嗎。

5.  為什么Java1000==1000false100==100true

[java] view%20plain copy 派生到我的代碼片Integer i1 = 100,i2 = 100;  System.out.println(i1==i2);  Integer i3 = 1000,i4 = 1000;  System.out.println(i3==i4);  

查看Integer.java類,會(huì)發(fā)現(xiàn)有一個(gè)內(nèi)部私有類,IntegerCache.java,它緩存了從-128到127之間的所有的整數(shù)對(duì)象。

所以例子中i1和i2指向了一個(gè)對(duì)象。因此100==100為true。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 云浮市| 讷河市| 南郑县| 漾濞| 静宁县| 古丈县| 龙里县| 呼玛县| 长岛县| 肥城市| 洞口县| 白银市| 延吉市| 额济纳旗| 饶河县| 汽车| 泸州市| 岳阳县| 定日县| 莲花县| 门头沟区| 萨迦县| 泽州县| 来安县| 青海省| 武强县| 涞水县| 禹州市| 大英县| 沾益县| 比如县| 土默特左旗| 昌都县| 平阳县| 顺平县| 大庆市| 东丽区| 白沙| 普兰县| 铁力市| 广灵县|