java.lang包—基本类型的封装类
目錄
一、java為什么需要對(duì)各種類(lèi)型提供封裝類(lèi)?
二、8大基礎(chǔ)類(lèi)型和對(duì)應(yīng)的封裝類(lèi)型
三、基礎(chǔ)類(lèi)型與封裝類(lèi)的區(qū)別
四、"=="和"equal()"方法
五、Integer.valueOf函數(shù)
六、常見(jiàn)面試題
總結(jié)
一、java為什么需要對(duì)各種類(lèi)型提供封裝類(lèi)?
在剛剛學(xué)習(xí)java的時(shí)候,老師不止一次的說(shuō)過(guò)java是一種面向?qū)ο蟮恼Z(yǔ)言,萬(wàn)物皆對(duì)象。對(duì)于java中的基礎(chǔ)數(shù)據(jù)類(lèi)型,由于為了符合java中面向?qū)ο蟮奶攸c(diǎn),同樣也有其封裝類(lèi)。這篇文章對(duì)其有一個(gè)認(rèn)識(shí)。
二、8大基礎(chǔ)類(lèi)型和對(duì)應(yīng)的封裝類(lèi)型
其實(shí)在jdk1.5之前,在基礎(chǔ)數(shù)據(jù)類(lèi)型與其封裝器之間的轉(zhuǎn)化必須手動(dòng)進(jìn)行,但是從jdk1.5之后,由于提供了自動(dòng)裝箱的機(jī)制,因此我們不再手動(dòng)進(jìn)行了。
- 裝箱:基礎(chǔ)類(lèi)型轉(zhuǎn)封裝類(lèi)型。Integer a = 3底層實(shí)現(xiàn):Integer a = Integer.valueOf(3);? ?//裝箱這個(gè)過(guò)程是通過(guò)Integer.valueOf這個(gè)函數(shù)完成的,隱士裝箱也是調(diào)用這個(gè)函數(shù),這個(gè)知識(shí)點(diǎn)很重要
- 拆箱:封裝類(lèi)型轉(zhuǎn)基礎(chǔ)類(lèi)型。int b = a;底層實(shí)現(xiàn):int b = a.intValue();
既然封裝類(lèi)能夠封裝基礎(chǔ)類(lèi)型,那么能封裝的范圍是多少呢?我們對(duì)其進(jìn)行了一個(gè)總結(jié)。不過(guò)我們應(yīng)該注意到boolean類(lèi)型沒(méi)有給出精確的定義,可能是一個(gè)字節(jié)也有可能是四個(gè)字節(jié),這是為什么呢?java虛擬機(jī)規(guī)范中規(guī)定的是4個(gè)字節(jié),但是不同的廠家虛擬機(jī)可能不同,所以可能不會(huì)按照規(guī)范來(lái)。
- Java中的數(shù)值都是有符號(hào)的,不存在無(wú)符號(hào)的數(shù),它們的取值范圍也是固定的,不會(huì)隨著硬件環(huán)境或者操作系統(tǒng)的改變而改變。
- Java語(yǔ)言中,默認(rèn)聲明的小數(shù)是double類(lèi)型的,因此對(duì)float類(lèi)型的變量進(jìn)行初始化時(shí)需要進(jìn)行類(lèi)型轉(zhuǎn)換。float類(lèi)型變量有兩種初始化方法:float f = 1.0f? 或者 float f =(float) 1.0?
三、基礎(chǔ)類(lèi)型與封裝類(lèi)的區(qū)別
1、傳遞方式不同
基本類(lèi)型是按值傳遞,而封裝類(lèi)型是按引用傳遞的。int是基本類(lèi)型,直接存放數(shù)值;Integer類(lèi)會(huì)產(chǎn)生一個(gè)對(duì)象引用指向這個(gè)對(duì)象。
2、存儲(chǔ)位置不同
基本類(lèi)型存儲(chǔ)在棧中,封裝類(lèi)的引用存儲(chǔ)在棧中,而值是存在堆中。這樣看上去好像基礎(chǔ)封裝類(lèi)多此一舉,而且基本類(lèi)型的速度也確實(shí)會(huì)比封裝類(lèi)更快。為什么快呢?這是因?yàn)?span style="color:#f33b45;">封裝類(lèi)涉及到了對(duì)象內(nèi)存的分配和垃圾回收。但是基本類(lèi)型直接拿起來(lái)就計(jì)算了。
四、"=="和"equal()"方法
| 基本型和基本型比較 | 基本型 == 基本型 | ? |
| 基本型和基本型的封裝型比較 | 基本型 == 封裝型 | 將封裝型拆箱? |
| 封裝型.equals(基本型) | 將基本型裝箱 | |
| 封裝型與封裝型比較 | 封裝型 == 封裝型 | ? |
| 封裝型.equals(封裝型) | ? |
1)基本型 == 封裝型:封裝型自動(dòng)拆箱為基本型后進(jìn)行比較,因此Integer(0)會(huì)自動(dòng)拆箱為int類(lèi)型再進(jìn)行比較,顯然返回true。代碼如下
int i=0; Integer j=new Integer(0); System.out.println(i==j); //Integer(0)會(huì)自動(dòng)拆箱為int類(lèi)型再進(jìn)行比較,顯然返回true System.out.println(i.equals(j)); //運(yùn)行結(jié)果:true2)封裝型.equals(基本型):基本型封裝類(lèi)型調(diào)用equals(),但是參數(shù)是基本類(lèi)型,這時(shí)候,先將基本型自動(dòng)裝箱,在對(duì)封裝型進(jìn)行比較?!?/p> double d=0.5; Double b=new Double(0.5); System.out.println(d==b); //運(yùn)行結(jié)果:true System.out.println(b.equals(d)); //運(yùn)行結(jié)果:true
3)封裝型.equals(封裝型):兩個(gè)基本型的封裝型進(jìn)行equals()比較,首先equals()會(huì)比較類(lèi)型,如果類(lèi)型相同,則繼續(xù)比較值,如果值也相同,返回true。
五、Integer.valueOf函數(shù)
面試題中經(jīng)常出現(xiàn)下面這種代碼的分析。今天我們來(lái)看看這個(gè)問(wèn)題。
Integer aa=-100; Integer bb=-100; System.out.println(aa==bb); //運(yùn)行結(jié)果:trueInteger aaa=129; Integer bbb=129; System.out.println(aaa==bbb); //運(yùn)行結(jié)果:false代碼分析:Integer aa=-100;這句代碼調(diào)用 Integer.valueOf()函數(shù) 進(jìn)行裝箱,來(lái)看下Integer.valueOf()函數(shù)
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); }?
可以看到調(diào)用valueOf()時(shí),如果值在-128和127之間,則會(huì)先去緩存中去取,否則才會(huì)創(chuàng)建新的對(duì)象,再來(lá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 propertyint 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_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);}private IntegerCache() {} }緩沖池cache[ ]
以 Integer x = Integer.valueOf(123); 為例,首先先判斷緩沖池中是否有當(dāng)前數(shù)據(jù),有就從InegerCache的緩存cache[] 數(shù)組中取出并返回, 在 VM 初始化期間, 緩存最大值 high, 可能被保存在 sun.misc.VM class 的私有系統(tǒng)屬性里。不同包裝類(lèi)的 cache[] 范圍不同。一些基本數(shù)據(jù)類(lèi)型緩沖池的范圍
- boolean values true and false
- short values between -128 and 127
- int values between -128 and 127
- char in the range \u0000 to \u007F
- #進(jìn)入對(duì)應(yīng)類(lèi)源碼查看對(duì)應(yīng)XXXCache類(lèi)的cache范圍即可
總結(jié):
- 基本型比較使用“==”,封裝型比較使用equals(),不要混用!!!!
- 對(duì)封裝型進(jìn)行賦值時(shí),不要通過(guò)基本型去復(fù)制!!!!
六、常見(jiàn)面試題
Integer integer1=new Integer(100); Integer integer2=new Integer(100); System.out.println(integer1==integer2);Integer integer3=100;//實(shí)際是Integer。Valueof(1000) Integer integer4=100;//實(shí)際是Integer。Valueof(1000) System.out.println(integer3==integer4);Integer integer5=1000;//實(shí)際是Integer。Valueof(1000) Integer integer6=1000;//實(shí)際是Integer。Valueof(1000) System.out.println(integer5==integer6);輸出結(jié)果:
- false:new在堆中開(kāi)辟空間 1與2的地址不同,而==僅對(duì)地址進(jìn)行比較,如果使用System.out.println(integer1.equals(integer2));則輸出結(jié)果為true,因?yàn)閑quals()函數(shù)對(duì)值進(jìn)行比較
- true:100 自動(dòng)裝箱在Integer的緩沖區(qū)中,直接返回緩沖區(qū)對(duì)象,地址相同,為true
- false:1000已經(jīng)超出緩沖區(qū)了,會(huì)分配新的地址,所以使用==進(jìn)行比較時(shí)結(jié)果false
總結(jié)
以上所述是小編給大家介紹的Java 八種基本類(lèi)型和基本類(lèi)型封裝類(lèi),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
讀后有收獲可以支付寶請(qǐng)作者喝奶茶?
?
總結(jié)
以上是生活随笔為你收集整理的java.lang包—基本类型的封装类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java.lang包—对象基类Objec
- 下一篇: java.lang包—枚举类Enum