隨筆-15  評(píng)論-79  文章-0  trackbacks-0
          昨天跟朋友一起吃飯,他說到兩個(gè)Integer類型值比較是否相等的問題。經(jīng)理也在這里把java的Integer值比較的問題拿出來說一說。因?yàn)樵诿嬖嚨臅r(shí)候這個(gè)是經(jīng)常遇到的問題。
          首先給大家看一個(gè)例子:
           1public class Test {
           2
           3    /**
           4     * 關(guān)于Integer大小比較問題
           5     * @author 經(jīng)理
           6     */

           7    public static void main(String[] args) {
           8        Integer a = 10;
           9        Integer b = 10;
          10        System.out.println("a==b : " + String.valueOf(a==b));
          11        System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));
          12    }

          13}

          14
          運(yùn)行一下,在控制臺(tái)得到的結(jié)果是這樣的
          a==b : true
          a.equals(b) : 
          true

          當(dāng)是當(dāng)我們變換一下值
           1public class Test {
           2
           3    /**
           4     * 關(guān)于Integer大小比較問題
           5     * @author 經(jīng)理
           6     */

           7    public static void main(String[] args) {
           8        Integer a = 1000;
           9        Integer b = 1000;
          10        System.out.println("a==b : " + String.valueOf(a==b));
          11        System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));
          12    }

          13}

          運(yùn)行一下,控制臺(tái)的結(jié)果又是
          a==b : false
          a.equals(b) : 
          true

          這是什么原因呢?我當(dāng)時(shí)也有點(diǎn)犯糊涂。有點(diǎn)沖動(dòng)就直接開源碼看了。
          實(shí)際上在我們用Integer a = 數(shù)字;來賦值的時(shí)候Integer這個(gè)類是調(diào)用的public static Integer valueOf(int i)這個(gè)方法。
          1public static Integer valueOf(int i) {
          2        if(i >= -128 && i <= IntegerCache.high)
          3            return IntegerCache.cache[i + 128];
          4        else
          5            return new Integer(i);
          6    }
          我們來看看ValueOf(int i)的代碼,可以發(fā)現(xiàn)他對(duì)傳入?yún)?shù)i做了一個(gè)if判斷。在-128<=i<=127的時(shí)候是直接用的int原始數(shù)據(jù)類型,而超出了這個(gè)范圍則是new了一個(gè)對(duì)象。我們知道"=="符號(hào)在比較對(duì)象的時(shí)候是比較的內(nèi)存地址,而對(duì)于原始數(shù)據(jù)類型是直接比對(duì)的數(shù)據(jù)值。那么這個(gè)問題就解決了。
          至于為什么用int型的時(shí)候值會(huì)在-128<=i<=127范圍呢呢?我們知道八位二進(jìn)制的表示的范圍正好就是-128到127。大概就是因?yàn)檫@吧。

          把平時(shí)出現(xiàn)的問題記錄下來,自己就可以一點(diǎn)一點(diǎn)進(jìn)步了。
          posted on 2010-07-24 16:03 張?jiān)猈on 閱讀(24806) 評(píng)論(12)  編輯  收藏 所屬分類: Java

          評(píng)論:
          # re: 關(guān)于Integer大小比較的問題 2010-07-24 21:22 | bokix
          第一次看到這種問題,自己以后寫代碼要注意了。
          不過,“教科書”上教我們,兩個(gè)不同對(duì)象之間用“==”操作應(yīng)該是false,因?yàn)閮?nèi)存地址不同,如果真這么寫的,那應(yīng)該問問自己,究竟想比較什么??jī)?nèi)存地址還是數(shù)值?  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Integer大小比較的問題 2010-07-24 22:52 | え經(jīng)理え
          @bokix
          是啊~
          推薦多看看源碼,看源碼才能知道問題的根本所在。  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Integer大小比較的問題 2010-07-25 11:26 | rox
          恩,這個(gè)問題,同事曾經(jīng)講過,不拿出來單獨(dú)說就很容易忘記。
          所以,原則上,應(yīng)該還是用==比基本類型值。  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Integer大小比較的問題 2010-07-25 11:39 | 文溫
          # re: 關(guān)于Integer大小比較的問題[未登錄] 2010-07-25 14:11 | xxx
          要養(yǎng)成好的習(xí)慣,不用隨便用==來判斷對(duì)象的相等。java不支持操作符重載,所以要用equal來判斷2個(gè)對(duì)象是否邏輯相等。  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Integer大小比較的問題[未登錄] 2010-07-25 14:12 | xxx
          java不是純OO語(yǔ)言。基本類型默認(rèn)不是對(duì)象,因此對(duì)于基本類型要用==來判斷。  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Integer大小比較的問題 2010-07-26 14:28 | 蒂亞戈——侯賽因
          博主你是用什么方法怎么“直接開源碼看” 看到這些的?

          public static Integer valueOf(int i) {
          2 if(i >= -128 && i <= IntegerCache.high)
          3 return IntegerCache.cache[i + 128];
          4 else
          5 return new Integer(i);
          6 }
            回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Integer大小比較的問題 2010-07-27 16:20 | え經(jīng)理え
          @蒂亞戈——侯賽因
          你裝個(gè)jad就可以看到了~ 多看看源碼!  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Integer大小比較的問題 2010-07-27 16:22 | え經(jīng)理え
          對(duì)象還是用eqauls()比較穩(wěn)妥,eqauls前要判斷是否為空@rox
            回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Integer大小比較的問題 2010-07-27 16:29 | え經(jīng)理え
          說的很對(duì)啊,要養(yǎng)成好習(xí)慣,對(duì)象比較內(nèi)容要用equals @xxx
            回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Integer大小比較的問題 2011-02-12 16:19 | 風(fēng)清月明
          細(xì)節(jié)處見真功夫!!!贊。  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Integer大小比較的問題 2013-12-04 16:17 | 武漢-后來者-存在感
          究其原因, 應(yīng)該是java對(duì)小整形對(duì)象的優(yōu)化, 打個(gè)比方: 程序中有1億個(gè)-128-127之間的integer, 如果按照正常我們的OO, 每個(gè)都是個(gè)對(duì)象的話, 就有1億個(gè)integer, 可以java來說, 就是引用了. 這樣大大減少對(duì)象的數(shù)量.  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 眉山市| 遵义县| 鹤岗市| 寿宁县| 夹江县| 衢州市| 云龙县| 万年县| 巴东县| 卢龙县| 铜川市| 新沂市| 庆元县| 全州县| 京山县| 岑溪市| 遂平县| 南召县| 夏邑县| 宁乡县| 华容县| 于都县| 洪洞县| 乌拉特后旗| 巴中市| 宁乡县| 长治县| 米易县| 福安市| 托里县| 天台县| 福泉市| 泗阳县| 平远县| 综艺| 昌邑市| 和平县| 盐津县| 阳城县| 宝应县| 丰县|