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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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

一:在方法中聲明的變量,即該變量是局部變量,每當程序調用方法時,系統都會為該方法建立一個方法棧,其所在方法中聲明的變量就放在方法棧中,當方法結束系統會釋放方法棧,其對應在該方法中聲明的變量隨著棧的銷毀而結束,這就局部變量只能在方法中有效的原因

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

二:在類中聲明的變量是成員變量,也叫全局變量,放在堆中的(因為全局變量不會隨著某個方法執行結束而銷毀)。

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

比較一下八個基本數據類型的區別吧。

基本數據類型比較

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

整 型:byte,short,int,long

浮點型: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,但事實卻不是,為什么會出現這種情況呢。

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

當加上f之后,規定了類型為float精度,并沒有double精度那么大,小數部分0.1二進制表示被舍去的比較多。

  • 長整除問題
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 的結果計算時為int類型,計算后再轉成long型,明顯結果超出了int類型的表達范圍,在運算的過程中運算結果仍然為int型,超出范圍就截取后64位作為運算的結果。因此,我們看到雖然定義了long型變量,但結果仍然是截取后的結果。其實 a = 500654080,b = 86400000 ,得到的結果也就是5。

當我們修改成這樣:

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后,結果就是我們所預期的結果了。

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

為什么需要包裝類

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

自動裝箱和自動拆箱

自動裝箱其實就是將基本數據類型轉換成包裝類,反之自動拆箱就是把包裝類轉換成基本數據類型。

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呢,我們分析下源碼,查看編譯后的字節碼文件

字節碼文件

從字節碼文件中,我們可以得知,裝箱調用的Integer.valueOf方法,拆箱調用Integer.intValue方法,我們快來看下這兩個方法的源碼和他的構造函數。

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自動拆箱,比較的是基本數據類型。

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

其實Byte、Short、Integer、Long、Character的valueOf()方法實現機制和Integer類似,但是Float、Double中的valueOf(),永遠返回新創建的對象,因為一個范圍內的整數是有限的,但是小數卻是無限的,無法保存在緩存中,Boolean中只有兩個對象,要么是true的Boolean,要么是false的Boolean,只要boolean的值相同,Boolean就相等。

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。