隨筆-15  評論-79  文章-0  trackbacks-0
          昨天跟朋友一起吃飯,他說到兩個Integer類型值比較是否相等的問題。經(jīng)理也在這里把java的Integer值比較的問題拿出來說一說。因為在面試的時候這個是經(jī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 = 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
          運行一下,在控制臺得到的結(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}

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

          這是什么原因呢?我當(dāng)時也有點犯糊涂。有點沖動就直接開源碼看了。
          實際上在我們用Integer a = 數(shù)字;來賦值的時候Integer這個類是調(diào)用的public static Integer valueOf(int i)這個方法。
          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)他對傳入?yún)?shù)i做了一個if判斷。在-128<=i<=127的時候是直接用的int原始數(shù)據(jù)類型,而超出了這個范圍則是new了一個對象。我們知道"=="符號在比較對象的時候是比較的內(nèi)存地址,而對于原始數(shù)據(jù)類型是直接比對的數(shù)據(jù)值。那么這個問題就解決了。
          至于為什么用int型的時候值會在-128<=i<=127范圍呢呢?我們知道八位二進制的表示的范圍正好就是-128到127。大概就是因為這吧。

          把平時出現(xiàn)的問題記錄下來,自己就可以一點一點進步了。
          posted on 2010-07-24 16:03 張元Won 閱讀(24806) 評論(12)  編輯  收藏 所屬分類: Java

          評論:
          # re: 關(guān)于Integer大小比較的問題 2010-07-24 21:22 | bokix
          第一次看到這種問題,自己以后寫代碼要注意了。
          不過,“教科書”上教我們,兩個不同對象之間用“==”操作應(yīng)該是false,因為內(nèi)存地址不同,如果真這么寫的,那應(yīng)該問問自己,究竟想比較什么?內(nèi)存地址還是數(shù)值?  回復(fù)  更多評論
            
          # re: 關(guān)于Integer大小比較的問題 2010-07-24 22:52 | え經(jīng)理え
          @bokix
          是啊~
          推薦多看看源碼,看源碼才能知道問題的根本所在。  回復(fù)  更多評論
            
          # re: 關(guān)于Integer大小比較的問題 2010-07-25 11:26 | rox
          恩,這個問題,同事曾經(jīng)講過,不拿出來單獨說就很容易忘記。
          所以,原則上,應(yīng)該還是用==比基本類型值。  回復(fù)  更多評論
            
          # re: 關(guān)于Integer大小比較的問題 2010-07-25 11:39 | 文溫
          # re: 關(guān)于Integer大小比較的問題[未登錄] 2010-07-25 14:11 | xxx
          要養(yǎng)成好的習(xí)慣,不用隨便用==來判斷對象的相等。java不支持操作符重載,所以要用equal來判斷2個對象是否邏輯相等。  回復(fù)  更多評論
            
          # re: 關(guān)于Integer大小比較的問題[未登錄] 2010-07-25 14:12 | xxx
          java不是純OO語言。基本類型默認(rèn)不是對象,因此對于基本類型要用==來判斷。  回復(fù)  更多評論
            
          # 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ù)  更多評論
            
          # re: 關(guān)于Integer大小比較的問題 2010-07-27 16:20 | え經(jīng)理え
          @蒂亞戈——侯賽因
          你裝個jad就可以看到了~ 多看看源碼!  回復(fù)  更多評論
            
          # re: 關(guān)于Integer大小比較的問題 2010-07-27 16:22 | え經(jīng)理え
          對象還是用eqauls()比較穩(wěn)妥,eqauls前要判斷是否為空@rox
            回復(fù)  更多評論
            
          # re: 關(guān)于Integer大小比較的問題 2010-07-27 16:29 | え經(jīng)理え
          說的很對啊,要養(yǎng)成好習(xí)慣,對象比較內(nèi)容要用equals @xxx
            回復(fù)  更多評論
            
          # re: 關(guān)于Integer大小比較的問題 2011-02-12 16:19 | 風(fēng)清月明
          細節(jié)處見真功夫!!!贊。  回復(fù)  更多評論
            
          # re: 關(guān)于Integer大小比較的問題 2013-12-04 16:17 | 武漢-后來者-存在感
          究其原因, 應(yīng)該是java對小整形對象的優(yōu)化, 打個比方: 程序中有1億個-128-127之間的integer, 如果按照正常我們的OO, 每個都是個對象的話, 就有1億個integer, 可以java來說, 就是引用了. 這樣大大減少對象的數(shù)量.  回復(fù)  更多評論
            

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 柏乡县| 都安| 五常市| 边坝县| 桃源县| 庆云县| 固原市| 新竹市| 新建县| 湛江市| 商水县| 那坡县| 蒙山县| 林周县| 修文县| 兴宁市| 邵武市| 绥化市| 鹤岗市| 台中县| 合水县| 瓮安县| 桃源县| 肃宁县| 天等县| 鸡东县| 渝中区| 奈曼旗| 汉川市| 韩城市| 江阴市| 平顶山市| 都兰县| 临城县| 仙居县| 城固县| 南投县| 拜城县| 水城县| 马尔康县| 青河县|