<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-15  評論-79  文章-0  trackbacks-0
    昨天跟朋友一起吃飯,他說到兩個Integer類型值比較是否相等的問題。經理也在這里把java的Integer值比較的問題拿出來說一說。因為在面試的時候這個是經常遇到的問題。
    首先給大家看一個例子:
     1public class Test {
     2
     3    /**
     4     * 關于Integer大小比較問題
     5     * @author 經理
     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
    運行一下,在控制臺得到的結果是這樣的
    a==b : true
    a.equals(b) : 
    true

    當是當我們變換一下值
     1public class Test {
     2
     3    /**
     4     * 關于Integer大小比較問題
     5     * @author 經理
     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}

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

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

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

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

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲男人电影天堂| 亚洲AV色香蕉一区二区| 亚洲av永久中文无码精品综合 | 日本亚洲视频在线| 国产99视频精品免费视频76| 亚洲综合激情另类专区| 香蕉免费一级视频在线观看| 亚洲春色在线视频| 91禁漫免费进入| 亚洲免费闲人蜜桃| 日韩免费视频播播| EEUSS影院WWW在线观看免费| 亚洲自偷自偷偷色无码中文| 日韩免费在线视频| 亚洲一区二区三区久久| 国产一级淫片视频免费看| 亚欧洲精品在线视频免费观看 | 亚洲剧情在线观看| 免费观看男人免费桶女人视频 | 在线观看亚洲专区| 中文字幕精品亚洲无线码一区应用| 水蜜桃视频在线观看免费播放高清| 一区二区三区亚洲| 免费看少妇作爱视频| 9久久免费国产精品特黄| 亚洲欧洲日产v特级毛片| 在线观看成人免费| 永久免费观看黄网站| 亚洲第一区视频在线观看| 香蕉高清免费永久在线视频| 香蕉免费在线视频| 亚洲久悠悠色悠在线播放| 亚洲综合另类小说色区色噜噜| 4399影视免费观看高清直播| 亚洲AV女人18毛片水真多| 亚洲AV永久纯肉无码精品动漫| a级毛片无码免费真人| 国产特黄特色的大片观看免费视频| 亚洲不卡1卡2卡三卡2021麻豆| 亚洲国产成人乱码精品女人久久久不卡 | 人妻无码中文字幕免费视频蜜桃|