日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java byte 判断相等_深入理解Java装箱与拆箱

發(fā)布時間:2023/12/19 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java byte 判断相等_深入理解Java装箱与拆箱 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

寫給小白看的Java基礎(chǔ)知識,閱讀本文大概需要7分鐘

Java中有8種基礎(chǔ)數(shù)據(jù)類型,boolean,char,byte,short,int,long,float,double。從jdk5開始提供了自動裝箱拆箱機(jī)制,對應(yīng)的包裝類型即Boolean,Character,Byte,Short,Integer,Long,Float,Double。

首先解釋一下為什么要引入裝箱和拆箱機(jī)制,因為Java是面向?qū)ο蟮恼Z言啊,這樣使用了包裝類后,就可以調(diào)用object的一些方法了。都是個人見解,歡迎指正。

Integer

裝箱就是將基礎(chǔ)數(shù)據(jù)類型轉(zhuǎn)換為對應(yīng)的包裝器類型;

拆箱就是將包裝器類型轉(zhuǎn)換為對應(yīng)的基礎(chǔ)數(shù)據(jù)類型;

那裝箱和拆箱是如何實現(xiàn)的呢,其實我們在Integer源碼中可以查看,裝箱使用了valueOf()方法,拆箱使用了intValue()。

public static Integer valueOf(int i) {//low=-128if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}public int intValue() {return value;} private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[]; ?static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h; ?cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++); ?// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;} ?private IntegerCache() {}}

從上述方法的具體實現(xiàn)可以知道,vauleOf已經(jīng)在cache中創(chuàng)建了[-128,127]范圍的對象數(shù)組,當(dāng)新建的Integer數(shù)值在該范圍中,會從對象數(shù)組里返回相應(yīng)的對象。如果超出范圍會重新創(chuàng)建一個對象。

經(jīng)過上面的解釋我們可以很好地理解上圖的結(jié)果,i1和i2都在[-128,127]中,所以返回的是同一個對象,結(jié)果為true。而i3和i4超出該范圍,所以兩次都要新建對象,于是結(jié)果返回false。

而對于其他幾種包裝類型,也都是利用對應(yīng)的vauleOf和(Boolean/Character/Byte/Short/Long/Float/Double)Value方法實現(xiàn)裝箱,拆箱。其中Integer、Short、Byte、Character、Long這幾個類的valueOf方法的實現(xiàn)是類似的,Double、Float的valueOf方法的實現(xiàn)是類似的,大家可以在源碼中查看。

Integer a = 1;Integer b = 2;Integer c = 3;Integer d = 3;Integer e = 200;Integer f = 200;Long g = 3L;Long h = 2L; ?System.out.println(c==d);//trueSystem.out.println(e==f);//falseSystem.out.println(c==(a+b));//trueSystem.out.println(c.equals(a+b));//trueSystem.out.println(g==(a+b));//true 當(dāng)==兩邊有算式時,就比較數(shù)值(自動拆箱)System.out.println(g.equals(a+b));//falseSystem.out.println(g.equals(a+h));//true

在解釋結(jié)果前先來說說==和euqals的區(qū)別:

== : 它的作用是判斷兩個對象的地址是不是相等。即,判斷兩個對象是不是同一個對象(基本數(shù)據(jù)類型比較的是值,引用數(shù)據(jù)類型比較的是內(nèi)存地址)。

equals() : 它的作用也是判斷兩個對象是否相等。但它一般有兩種使用情況:

情況 1:類沒有覆蓋 equals() 方法。則通過 equals() 比較該類的兩個對象時,等價于通過“==”比較這兩個對象。

情況 2:類覆蓋了 equals() 方法。一般,我們都覆蓋 equals() 方法來比較兩個對象的內(nèi)容是否相等;若它們的內(nèi)容相等,則返回 true (即,認(rèn)為這兩個對象相等)。

這里解釋一下后三個的結(jié)果,==兩邊如果有算式的話,那就只比較內(nèi)容而不是地址,結(jié)果為true。倒數(shù)第二個中,a+b和g的類型不同,自然地址也不相同,結(jié)果為false。最后一個a+h結(jié)果會發(fā)生隱式轉(zhuǎn)換,所以結(jié)果為true。

----------------------------------------------------------------------------------------------

歡迎關(guān)注我的公眾號預(yù)備碼農(nóng)

總結(jié)

以上是生活随笔為你收集整理的java byte 判断相等_深入理解Java装箱与拆箱的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。