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);
}
相關推薦
Java中Integer型別的整數值的大小比較
如果比較兩個數值相等的Integer型別的整數,我們可能會發現,用“==”比較(首先你必須明確“==”比較的是地址),有的時候返回true,而有的時候,返回false。比如: Integer i = 128; Integer j = 128; System
Java中Integer和int比較大小出現的錯誤
最好 裏的 pan 轉換 als 範圍 urn 返回 錯誤 Java在某一處維護著一個常量池,(我記得)在小於128的範圍內,直接用 1 Integer i = 100; 2 int j = 100; 3 return i == j;//true 這裏返回的是true.
Java中double型別比較大小或相等的方法
在Java中int型別資料的大小比較可以使用雙等號,double型別則不能使用雙等號來比較大小,如果使用的話得到的結果將永遠是不相等,即使兩者的精度是相同的也不可以。下面介紹兩種比較double資料是否相等的方法。 第一種方法:轉換成字串 如果要比較的兩個double資料的
Java中Integer直接比較大小
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
java中Integer數值比較
java中的Interger數值比較 首先,分別出“==”和“equal”的差別:“==”是對應的地址相等和內容相等,“equal”是對應的內容想等; 然後,Integer物件在進行計算比較是會進行自動拆箱,也就是說Integer a = 10; int b = 10; 判
Java中包裝型別的大小比較
開發十年,就只剩下這套架構體系了! >>>
java中Long型別比較大小和long型別的比較大小
今天遇到這樣一個問題,我用 "=="來比較兩個Long型別的資料,明明數值都相等,可是結果就是false 兩個 Long 型別
Java基礎中Int型別變數值互換的幾種方法
在很多時候,我們會使用到將兩個整型變數值進行互換,比如氣泡排序,通過判斷來將陣列變數的值逐步交換,那麼怎麼交換值才能最有效最節省空間呢? 首先,我們會想到的,用一個零時變數來做中間的過度儲存空間,這是很容易想到的方法,實現如下: int i = 10; //宣告變數 i,並給 i 賦
淺析List中Integer型別比較的錯誤
相信很多人都會有想用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介
java中Integer與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
java中Integer轉Float總結
style tostring span eof del 類型 () big color 一.先將Integer轉化成int類型,在強制轉float類型 例:Integer str = new Integer(20); int i = str.intValue();
Java中List集合排序的方法 比較器的使用 根據學生對象數序 語文 英語成績總和進行sort排序
private system.in set swift ringbuf 直觀 turn @override encoding package com.swift; import java.util.ArrayList; import java.util.Collecti
Java中Integer和ThreadLocal
PV als 基於 本質 log lang static 返回 類構造 一. Integer 1.引子 在開始之前,我還是需要吐槽下自己,我是真的很菜! 他問:**兩個Integer對象==比較是否相等? 我答:對象==比較,是引用比較,不相等! 他問:Integer
bash的基礎特性 數值運算 數值大小比較 環境變量 位置變量 正則表達式
標準 實現 自動 面試 .... count 輸入 expr 都是 變量類型:數據存儲格式,儲存空間大小,參與變量種類字符型數值型:整數型浮點型強類型的:定義變量時必須指定變量類型,參與運算必須符合類型要求。弱類型的:定義變涼時無需指定類型,所有的全是字符型,參與運算會自動