1. 程式人生 > >Java中Integer型別的整數值的大小比較

Java中Integer型別的整數值的大小比較

       如果比較兩個數值相等的Integer型別的整數,我們可能會發現,用“==”比較(首先你必須明確“==”比較的是地址),有的時候返回true,而有的時候,返回false。比如:

Integer i = 128;
Integer j = 128;
System.out.println(i == j);//返回false

然而:

Integer m = 127;
Integer n = 127;
System.out.println(m == n);//返回true

為什麼會出現這種請況呢,因為Integer i = 128;這種方式賦值,會呼叫valueOf方法。我們發現這裡做了一些關於IntegerCache的操作。讓我們先看下valueOf的原始碼:

     這裡補充一下assert(斷言)的用法:(

assert格式

(1)assert [boolean 表示式]

如果[boolean表示式]為true,則程式繼續執行。

如果為false,則程式丟擲AssertionError,並終止執行。

(2)assert[boolean 表示式 : 錯誤表示式 (日誌)]

如果[boolean表示式]為true,則程式繼續執行。

如果為false,則程式丟擲java.lang.AssertionError,輸出[錯誤資訊]。


public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

IntegerCache原始碼:

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];
 
        static {
            // high value may be configured by property 即是可調大小的
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            }
            high = h;
            
            //把-128到127(可調)的整數都提前例項化了
            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }
 
        private IntegerCache() {}
    }

      原來Integer把-128到127(可調)的整數都提前例項化了, 所以你不管建立多少個這個範圍內的Integer都是同一個物件

那麼,如何比較兩個Integer型別是否相等呢,你肯定會想到equals,沒錯,就是equals,看下equals原始碼:

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

value值是int型別(檢視原始碼可知):

private final int value;

 通過原始碼得知,是獲取Integer的基本型別值來用==比較了。所以,我們也可以這樣,通過Integer.intValue()獲取int值來直接比較。

其實,一個int型別和Integer直接“==”比較也是沒有問題的,下面給出演示:

Integer i = 128;
int j = 128;
System.out.println(i == j);//返回true

總結:

如果你用兩個Integer型別的整數做相等比較:

1.如果Integer型別的兩個數相等,如果範圍在-128~127(預設),那麼用“==”返回true,其餘的範會false。

2.兩個基本型別int進行相等比較,直接用==即可。

3.一個基本型別int和一個包裝型別Integer比較,用==也可,比較時候,Integer型別做了拆箱操作。

4.Integer型別比較大小,要麼呼叫Integer.intValue()轉為基本型別用“==”比較,要麼直接用equals比較。

擴充套件:

Long和Short型別也做了相同的處理,只不過最大值是不可調的。

參考Long的原始碼: 


public static Long valueOf(long l) {
        final int offset = 128;
        if (l >= -128 && l <= 127) { // will cache
            return LongCache.cache[(int)l + offset];
        }
        return new Long(l);
    }

參考Short的原始碼:


public static Short valueOf(short s) {
        final int offset = 128;
        int sAsInt = s;
        if (sAsInt >= -128 && sAsInt <= 127) { // must cache
            return ShortCache.cache[sAsInt + offset];
        }
        return new Short(s);
    }

相關推薦

JavaInteger型別數值大小比較

       如果比較兩個數值相等的Integer型別的整數,我們可能會發現,用“==”比較(首先你必須明確“==”比較的是地址),有的時候返回true,而有的時候,返回false。比如: Integer i = 128; Integer j = 128; System

JavaInteger和int比較大小出現的錯誤

最好 裏的 pan 轉換 als 範圍 urn 返回 錯誤 Java在某一處維護著一個常量池,(我記得)在小於128的範圍內,直接用 1 Integer i = 100; 2 int j = 100; 3 return i == j;//true 這裏返回的是true.

Javadouble型別比較大小或相等的方法

在Java中int型別資料的大小比較可以使用雙等號,double型別則不能使用雙等號來比較大小,如果使用的話得到的結果將永遠是不相等,即使兩者的精度是相同的也不可以。下面介紹兩種比較double資料是否相等的方法。 第一種方法:轉換成字串 如果要比較的兩個double資料的

JavaInteger直接比較大小

Integer a = -1250; Integer b = -1250; System.out.println(a == b); Integer c = -125; Integer d = -125

java三個數值大小比較

在我們初學者學習過程中,都會有遇到要求編寫三個數值大小比較的程式碼 今天,在這裡我分享兩種方法去編寫這個問題。 1、if語句 if(a>b){if(a>c){System.out.println("三個數中的最大值為"+a);}else{System.out.p

javaInteger數值比較

java中的Interger數值比較 首先,分別出“==”和“equal”的差別:“==”是對應的地址相等和內容相等,“equal”是對應的內容想等; 然後,Integer物件在進行計算比較是會進行自動拆箱,也就是說Integer a = 10; int b = 10; 判

Java包裝型別大小比較

開發十年,就只剩下這套架構體系了! >>>   

javaLong型別比較大小和long型別比較大小

今天遇到這樣一個問題,我用 "=="來比較兩個Long型別的資料,明明數值都相等,可是結果就是false 兩個 Long 型別

Java基礎Int型別數值互換的幾種方法

    在很多時候,我們會使用到將兩個整型變數值進行互換,比如氣泡排序,通過判斷來將陣列變數的值逐步交換,那麼怎麼交換值才能最有效最節省空間呢?   首先,我們會想到的,用一個零時變數來做中間的過度儲存空間,這是很容易想到的方法,實現如下:       int i = 10;  //宣告變數 i,並給 i 賦

淺析ListInteger型別比較的錯誤

相信很多人都會有想用List集合存int資料的時候(或許是用於後續遍歷),初始我的第一反應是下圖,經驗證會報錯,雖要將int存入,但初始化時需要初始為Integer型別。正確的初始化如下實際上是由於我的軟體構造實驗課lab1中一個困擾我近三個小時的程式bug,讓我想到了開這樣

比較任意兩個String型別數值大小

import java.util.regex.Pattern; public class Main { public static void main(String... args) {

Java對兩個物件進行比較大小

在Java中要想對兩個物件進行比較大小,需要實現Comparable介面或Comparator介面。String型別的值之所以可以比較大小(漢字根據ANSI值的大小進行比較),是因為String類實現了Comparable介面。如果要比較的物件沒有實現Comparable介

javaInteger與int比較淺談

今天看到一個面試題 測試程式碼如下 public class test { @Test public void test(){ Integer a = 300 ; Integer b = 300; int c = 300; System.out.println(a == b); System.out.pri

JAVA型別和物件(Integer和Int)

Integer是物件 Int是型別 比如 boolean 和Boolean就也不一樣,long和Long等等 作為引數傳遞時要注意 要進行轉換如下 int到Integer: int a=3; Integer A=new Integer(a); 或: Integer A

sql server字串型別的日期如何比較大小

日期資料在Sql Server資料庫中不都是以日期型別儲存的,如果資料庫中儲存日期欄位的資料型別為varchar,而你又需要對這個日期和另外一個日期進行比較,那麼該怎麼辦呢?總結有以下方法 (1)方法一 這個方法很容易想到,就是純粹地利用字串來比較大小,比如有一個欄位為a

Java計算對象的大小

bject tro 項目依賴 all 返回值 not 檢測 app main 一、計算對象大小的方法 Java中如何計算對象的大小呢,找到了4種方法: 1.java.lang.instrument.Instrumentation的getObjectSize方法; 2.BT

javaInteger轉Float總結

style tostring span eof del 類型 () big color 一.先將Integer轉化成int類型,在強制轉float類型 例:Integer str = new Integer(20); int i = str.intValue();

JavaList集合排序的方法 比較器的使用 根據學生對象數序 語文 英語成績總和進行sort排序

private system.in set swift ringbuf 直觀 turn @override encoding package com.swift; import java.util.ArrayList; import java.util.Collecti

JavaInteger和ThreadLocal

PV als 基於 本質 log lang static 返回 類構造 一. Integer 1.引子 在開始之前,我還是需要吐槽下自己,我是真的很菜! 他問:**兩個Integer對象==比較是否相等? 我答:對象==比較,是引用比較,不相等! 他問:Integer

bash的基礎特性 數值運算 數值大小比較 環境變量 位置變量 正則表達式

標準 實現 自動 面試 .... count 輸入 expr 都是 變量類型:數據存儲格式,儲存空間大小,參與變量種類字符型數值型:整數型浮點型強類型的:定義變量時必須指定變量類型,參與運算必須符合類型要求。弱類型的:定義變涼時無需指定類型,所有的全是字符型,參與運算會自動