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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

plsql怎么查看存储过程中long变量的值_面试官:详细说下基本数据类型与装箱拆箱的过程...

發(fā)布時間:2024/9/19 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 plsql怎么查看存储过程中long变量的值_面试官:详细说下基本数据类型与装箱拆箱的过程... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基本數(shù)據(jù)類型,有存放在棧中的,也有存放堆中的,這取決去基本類型聲明的位置。

一:在方法中聲明的變量,即該變量是局部變量,每當(dāng)程序調(diào)用方法時,系統(tǒng)都會為該方法建立一個方法棧,其所在方法中聲明的變量就放在方法棧中,當(dāng)方法結(jié)束系統(tǒng)會釋放方法棧,其對應(yīng)在該方法中聲明的變量隨著棧的銷毀而結(jié)束,這就局部變量只能在方法中有效的原因

在方法中聲明的變量可以是基本類型的變量,也可以是引用類型的變量。 (1)當(dāng)聲明是基本類型的變量的時,其變量名及值(變量名及值是兩個概念)是放在方法棧中 (2)當(dāng)聲明的是引用變量時,所聲明的變量(該變量實(shí)際上是在方法中存儲的是內(nèi)存地址值)是放在方法的棧中,該變量所指向的對象是放在堆類存中的。

二:在類中聲明的變量是成員變量,也叫全局變量,放在堆中的(因?yàn)槿肿兞坎粫S著某個方法執(zhí)行結(jié)束而銷毀)。

同樣在類中聲明的變量即可是基本類型的變量 也可是引用類型的變量 (1)當(dāng)聲明的是基本類型的變量其變量名及其值放在堆內(nèi)存中的 (2)引用類型時,其聲明的變量仍然會存儲一個內(nèi)存地址值,該內(nèi)存地址值指向所引用的對象。引用變量名和對應(yīng)的對象仍然存儲在相應(yīng)的堆中

比較一下八個基本數(shù)據(jù)類型的區(qū)別吧。

基本數(shù)據(jù)類型比較

8 bit(位) = 1 Byte (字節(jié))

整 型:byte,short,int,long

浮點(diǎn)型:float,double

邏輯型:boolean

字符型:char

我們先來看幾個例子。

  • 奇怪的精度問題
public class demo { public static void main(String[] arg){ System.out.println(2.00f-1.10f); System.out.println(2.00-1.10); } /* 輸出: 0.9 0.8999999999999999 */}

你可能以為程序打印出來的都是0.9,但事實(shí)卻不是,為什么會出現(xiàn)這種情況呢。

原來2.00和1.10在計算機(jī)里存儲的時候,需要轉(zhuǎn)換成二進(jìn)制,浮點(diǎn)型默認(rèn)是double類型的(即沒有加f),從上面的列舉的區(qū)別表格中知道,float占4個字節(jié)32位,double占8個字節(jié)64位,而1.10在轉(zhuǎn)換成二進(jìn)制的時候,是1.000110.......,而double類型表示小數(shù)部分只有52位,當(dāng)向后計算 52位后基數(shù)還不為0,那后面的部分只能舍棄,從這里可以看出float、double并不能準(zhǔn)確表示每一位小數(shù),對于有的小數(shù)只能無限趨向它,所以計算后的結(jié)果是0.8999999999999999。

當(dāng)加上f之后,規(guī)定了類型為float精度,并沒有double精度那么大,小數(shù)部分0.1二進(jìn)制表示被舍去的比較多。

  • 長整除問題
public class demo { public static void main(String[] arg){ final long a = 24 * 60 * 60 * 1000 * 1000; final long b = 24 * 60 * 60 * 1000; System.out.println(a/b); }//輸出: 5}

1000???錯是5,這又是什么情況

24*60*60*1000*1000 的結(jié)果計算時為int類型,計算后再轉(zhuǎn)成long型,明顯結(jié)果超出了int類型的表達(dá)范圍,在運(yùn)算的過程中運(yùn)算結(jié)果仍然為int型,超出范圍就截取后64位作為運(yùn)算的結(jié)果。因此,我們看到雖然定義了long型變量,但結(jié)果仍然是截取后的結(jié)果。其實(shí) a = 500654080,b = 86400000 ,得到的結(jié)果也就是5。

當(dāng)我們修改成這樣:

public class demo { public static void main(String[] arg){ final long a = 24l * 60 * 60 * 1000 * 1000; final long b = 24l * 60 * 60 * 1000; System.out.println(a/b); }//輸出: 1000}

24后面加上L后,結(jié)果就是我們所預(yù)期的結(jié)果了。

因此,我們中寫代碼中,如果對精度要求很高的,建議使用BigDecimal來運(yùn)算,一般用來計算高精度的數(shù)據(jù)。

為什么需要包裝類

因?yàn)榛緮?shù)據(jù)類型不是對象,在有些時候使用對象是最方便的,比如List的add(Object e)方法,參數(shù)是Object類型,是引用數(shù)據(jù)類型,那我們想放入基本數(shù)據(jù)類型怎么辦,為了方便操作基本數(shù)據(jù)類型,所以引入了包裝類。

自動裝箱和自動拆箱

自動裝箱其實(shí)就是將基本數(shù)據(jù)類型轉(zhuǎn)換成包裝類,反之自動拆箱就是把包裝類轉(zhuǎn)換成基本數(shù)據(jù)類型。

public static void main(String[] args) { Integer i = 10;//自動裝箱 int i2 = i;//自動拆箱 } public static void main(String[] args) { int i = 100; Integer i1 = 100; Integer i2 = 100; Integer i3 = 200; Integer i4 = 200; System.out.println(i == i1);// true System.out.println(i1 == i2);// true System.out.println(i3 == i4);// false }

為什么一個true,一個false呢,我們分析下源碼,查看編譯后的字節(jié)碼文件

字節(jié)碼文件

從字節(jié)碼文件中,我們可以得知,裝箱調(diào)用的Integer.valueOf方法,拆箱調(diào)用Integer.intValue方法,我們快來看下這兩個方法的源碼和他的構(gòu)造函數(shù)。

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

i與i1用==比較的時候,會自動將i1自動拆箱,比較的是基本數(shù)據(jù)類型。

這里沒有放出IntegerCache的相關(guān)代碼,從這個類中可以得知,IntegerCache.low為-128,IntegerCache.high為127,當(dāng)在這個范圍內(nèi)的基本類型,轉(zhuǎn)換成Integer的時候,就直接從緩存取,所以i1和i2是相等的,但是i3,i4都不在這個范圍內(nèi),所以都新建了Integer對象,所以不相等。

其實(shí)Byte、Short、Integer、Long、Character的valueOf()方法實(shí)現(xiàn)機(jī)制和Integer類似,但是Float、Double中的valueOf(),永遠(yuǎn)返回新創(chuàng)建的對象,因?yàn)橐粋€范圍內(nèi)的整數(shù)是有限的,但是小數(shù)卻是無限的,無法保存在緩存中,Boolean中只有兩個對象,要么是true的Boolean,要么是false的Boolean,只要boolean的值相同,Boolean就相等。

總結(jié)

以上是生活随笔為你收集整理的plsql怎么查看存储过程中long变量的值_面试官:详细说下基本数据类型与装箱拆箱的过程...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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