java int short区别_Java基础之数据比较Integer、Short、int、short
基礎很重要,基礎很重要,基礎很重要。重要的事情說三遍,。
今天聊一聊Java的數據比較,這個范圍比較大,基礎類型的比較、引用類型的比較。
前提:
1、Java和c#都提供自動裝箱和自動拆箱操作,何為自動裝箱,簡單點說就是將值類型轉換成為引用類型,自動拆箱就是將引用類型轉換成為值類型。并且我們還經常被教導,要避免自動的裝箱和拆箱操作,因為這個會影響性能。
2、比較常用的運算符是==,equals。
下面分幾類來說明數據的比較,
引用類型之間的比較:Integer與Integer之間的比較、Boolean與Boolean之間的比較、Integer與Boolean之間的比較
值類型之間的比較:int與int之間的比較、int與bool之間的比較
值類型與引用類型之間的比較:Integer與int之間的比較、Boolean與bool之間的比較
開工
引用類型之間的比較--Integer與Integer之間的比較
簡單說明一下,Integer是引用類型,代表的是整形數字
上代碼
1 public static void main(String[] args) throwsException {2 Integer integer = new Integer(0);3 Integer mInteger = Integer.valueOf(0);4 Integer sInteger = 0;5
6 System.out.println(integer == mInteger);//false
7 System.out.println(integer == sInteger);//false
8 System.out.println(mInteger == sInteger);//true
9
10 System.out.println(memoryAddress(integer));11 System.out.println(memoryAddress(mInteger));12 System.out.println(memoryAddress(sInteger));13
14 }15
16 private static intmemoryAddress(Object object) {17 //內存地址會有所不同
18 returnSystem.identityHashCode(object);19 }
執行結果:
分析:
1、執行結果和我們預想的不太一樣,引用類型是在堆上存放的,每個引用的地址應該都不相同。但是mInteger == sInteger? 執行結果為true,并且mInteger ,sInteger的內存地址是相同的。
2、要分析這個原因,我們需要了解Java設計者為了性能而進行的一些努力,查看Java源代碼,可以看到Integer的valueof方法里面包含了一個緩存:其中IntegerCache.low =-127,IntegerCache.high=128
1 @HotSpotIntrinsicCandidate2 public static Integer valueOf(inti) {3 if (i >= IntegerCache.low && i <=IntegerCache.high)4 return IntegerCache.cache[i + (-IntegerCache.low)];5 return newInteger(i);6 }
對于使用Integer.valueof()方法,如果數值是-127至128,那么會使用緩存對象,否則會new一個對象。
3、Integer sInteger = 0;?? 發生了什么呢?自動裝箱,等價于Integer sInteger=Integer.valueOf(0)。通過這個,我們就可以得出比較等于true的原因了,都是從緩存中讀取的對象,難怪內存地址會一致。
引用類型比較--Integer與Integer引用類型比較?? 使用equals
上代碼:
1 public static void main(String[] args) throwsException {2 Integer integer = new Integer(0);3 Integer mInteger = Integer.valueOf(0);4 Integer sInteger = 0;5
6 System.out.println(integer == mInteger);//false
7 System.out.println(integer == sInteger);//false
8 System.out.println(mInteger == sInteger);//true
9
10 System.out.println(memoryAddress(integer));11 System.out.println(memoryAddress(mInteger));12 System.out.println(memoryAddress(sInteger));13
14 System.out.println(integer.equals(mInteger));//true
15 System.out.println(integer.equals(sInteger));//true
16 System.out.println(mInteger.equals(sInteger));//true
17
18 }19
20 private static intmemoryAddress(Object object) {21 //內存地址會有所不同
22 returnSystem.identityHashCode(object);23 }
分析:使用equals比較,只要數值相同,那么比較結果就是相同。查看Java源代碼:
1 public booleanequals(Object obj) {2 if (obj instanceofInteger) {3 return value ==((Integer)obj).intValue();4 }5 return false;6 }
可以看到Integer的equals比較,其實比較的就是數值。
值類型之間的比較:int與int
上代碼
1 int m=0;2 int i=0;3 int s=0;4 System.out.println(m==i);//true5 //值類型是沒有equals方法6 //System.out.println(m.equals(i));
分析:對于int 的比較,無需多言,本來就是數值比較。
Integer與int的比較:
1 Integer integer = new Integer(0);2 Integer mInteger = Integer.valueOf(0);3 Integer sInteger = 0;//等價于Integer。valueof
4 int i = 0;5 System.out.println(integer == i);//true
6 System.out.println(mInteger == i);//true
7 System.out.println(sInteger == i);//true
8 System.out.println(integer.equals(i));//true
9 System.out.println(mInteger.equals(i));//true
10 System.out.println(sInteger.equals(i));//true
分析:
1、Integer類型與int類型通過==比較,Integer會自動拆箱,轉換成int數值進行比較
2、equals方法更是讀取對應的int數值進行比較。
因此引用類型與值類型之間的比較,使用equals與==都可以。
簡單總結:
1、引用類型之間的比較,由于存在-127至128之間的緩存對象,因此使用== 進行比較存在風險。優先使用equals進行比較
2、引用類型與值類型進行比較,由于會自動拆箱,因此使用==和equals都可以正確得到結果
3、建議在實際編碼過程中,對數值的比較使用equals
深入總結:
不僅僅Integer,其他的基本類型也都存在緩存,下面給出一個簡單圖表進行說明
基本類型
裝箱類型
取值范圍
是否緩存
緩存范圍
byte
Byte
-128~127
是
-128~127
short
Short
-2^15 ~ (2^15 - 1)
是
-128~127
int
Integer
-2^31 ~ (2^31 - 1)
是
-128~127
long
Long
-2^63 ~ (2^63 - 1)
是
-128~127
float
Float
--
否
double
Double
--
否
boolean
Boolean
true、false
是
true、false
char
Character
\u0000 ~ \uffff
是
\u0000 ~ \uffff
Java博大精深,要想深入,基礎必須要好,才能避免bug。
我們程序員的職責就是少寫bug,這才是我們一直學習的動力。
總結
以上是生活随笔為你收集整理的java int short区别_Java基础之数据比较Integer、Short、int、short的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: MyBioSource STMN1 el
 - 下一篇: 【小月电子】ALTERA FPGA开发板