天天看點

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

<a href="http://www.blogjava.net/zhangyuan/archive/2010/07/24/327011.html" target="_blank">關于Integer大小比較的問題</a>

昨天跟朋友一起吃飯,他說到兩個Integer類型值比較是否相等的問題。經理也在這裡把java的Integer值比較的問題拿出來說一說。因為在面試的時候這個是經常遇到的問題。

首先給大家看一個例子:

 1

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

public class Test {

 2

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

 3

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

    /**

 4

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

     * 關于Integer大小比較問題

 5

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

     * @author 經理

 6

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

     */

 7

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

    public static void main(String[] args) {

 8

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

        Integer a = 10;

 9

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

        Integer b = 10;

10

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

        System.out.println("a==b : " + String.valueOf(a==b));

11

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

        System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));

12

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

    }

13

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

}

14

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

運作一下,在控制台得到的結果是這樣的

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

a==b : true

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

a.equals(b) : true

當是當我們變換一下值

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

        Integer a = 1000;

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

        Integer b = 1000;

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)
Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

運作一下,控制台的結果又是

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

a==b : false

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

這是什麼原因呢?我當時也有點犯糊塗。有點沖動就直接開源碼看了。

實際上在我們用Integer a = 數字;來指派的時候Integer這個類是調用的public static Integer valueOf(int i)這個方法。

1

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

public static Integer valueOf(int i) {

2

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

        if(i &gt;= -128 &amp;&amp; i &lt;= IntegerCache.high)

3

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

            return IntegerCache.cache[i + 128];

4

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

        else

5

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

            return new Integer(i);

6

Integer類型資料比較大小問題:(Integer定義的是對象,養成使用equals方法的好習慣)

我們來看看ValueOf(int i)的代碼,可以發現他對傳入參數i做了一個if判斷。在-128&lt;=i&lt;=127的時候是直接用的int原始資料類型,而超出了這個範圍則是new了一個對象。我們知道"=="符号在比較對象的時候是比較的記憶體位址,而對于原始資料類型是直接比對的資料值。那麼這個問題就解決了。

至于為什麼用int型的時候值會在-128&lt;=i&lt;=127範圍呢呢?我們知道八位二進制的表示的範圍正好就是-128到127。大概就是因為這吧。

實際上這也就是java 自動裝箱、拆箱的運用:http://ycgit.blog.51cto.com/8590215/1637992

本文轉自 藝晨光 51CTO部落格,原文連結:http://blog.51cto.com/ycgit/1637975,如需轉載請自行聯系原作者