Java基本数据类型及String类
基本類型,或者叫做內(nèi)置類型,是JAVA中不同于類的特殊類型。它們是我們編程中使用最頻繁的類型。java是一種強(qiáng)類型語(yǔ)言,第一次申明變量必須說明數(shù)據(jù)類型,第一次變量賦值稱為變量的初始化。
一、 Java的簡(jiǎn)單類型及其封裝器類
Java基本類型共有八種,基本類型可以分為三類,字符類型char,布爾類型boolean以及數(shù)值類型byte、short、int、long(整數(shù)型)float、double(浮點(diǎn)型)。
Java基本類型存儲(chǔ)在棧中,因此它們的存取速度要快于存儲(chǔ)在堆中的對(duì)應(yīng)包裝類的實(shí)例對(duì)象。從Java5.0(1.5)開始,JAVA虛擬機(jī)(Java Virtual Machine)可以完成基本類型和它們對(duì)應(yīng)包裝類之間的自動(dòng)轉(zhuǎn)換。因此我們?cè)谫x值、參數(shù)傳遞以及數(shù)學(xué)運(yùn)算的時(shí)候像使用基本類型一樣使用它們的包裝類,但這并不意味著你可以通過基本類型調(diào)用它們的包裝類才具有的方法。另外,所有基本類型(包括void)的包裝類都使用了final修飾,因此我們無(wú)法繼承它們擴(kuò)展新的類,也無(wú)法重寫它們的任何方法。
- 基本類型的優(yōu)勢(shì):數(shù)據(jù)存儲(chǔ)相對(duì)簡(jiǎn)單,運(yùn)算效率比較高
- 包裝類的優(yōu)勢(shì):有的容易,比如集合的元素必須是對(duì)象類型,滿足了java一切皆是對(duì)象的思想
二、Java中的常量(必須放進(jìn)常量池)
十六進(jìn)制整型常量:以十六進(jìn)制表示時(shí),需以0x或0X開頭,如0xff,0X9A。
八進(jìn)制整型常量:八進(jìn)制必須以0開頭,如0123,034。
長(zhǎng)整型:長(zhǎng)整型必須以L作結(jié)尾,如9L,342L。
浮點(diǎn)數(shù)常量:由于小數(shù)常量的默認(rèn)類型是double型,所以float類型的后面一定要加f(F)。同樣帶小數(shù)的變量默認(rèn)為double類型。
如:float f;
f=1.3f;//必須聲明f。
字符常量:字符型常量需用兩個(gè)單引號(hào)括起來(注意字符串常量是用兩個(gè)雙引號(hào)括起來)。Java中的字符占兩個(gè)字節(jié)。一些常用的轉(zhuǎn)義字符:
①\r表示接受鍵盤輸入,相當(dāng)于按下了回車鍵;
②\n表示換行;
③\t表示制表符,相當(dāng)于Table鍵;
④\b表示退格鍵,相當(dāng)于Back Space鍵;
⑤’表示單引號(hào);
⑥’'表示雙引號(hào);
⑦\(yùn)表示一個(gè)斜杠\。
三、Java引用類型
Java有 5種引用類型(對(duì)象類型):類 接口 數(shù)組 枚舉 標(biāo)注
引用類型:底層結(jié)構(gòu)和基本類型差別較大
JVM的內(nèi)存空間
(1). Heap 堆空間:分配對(duì)象 new Student()
(2). Stack 棧空間:臨時(shí)變量 Student stu
(3).Code 代碼區(qū) :類的定義,靜態(tài)資源 Student.class
上例實(shí)現(xiàn)步驟:
- a.JVM加載Student.class 到Code區(qū)
- b.new Student()在堆空間分配空間并創(chuàng)建一個(gè)Student實(shí)例
- c.將此實(shí)例的地址賦值給引用stu, 棧空間
四、Java中的數(shù)據(jù)轉(zhuǎn)換
A.簡(jiǎn)單類型數(shù)據(jù)間的轉(zhuǎn)換,有兩種方式:自動(dòng)轉(zhuǎn)換和強(qiáng)制轉(zhuǎn)換,通常發(fā)生在表達(dá)式中或方法的參數(shù)傳遞時(shí)。
1.自動(dòng)轉(zhuǎn)換
具體地講,當(dāng)一個(gè)較"小"數(shù)據(jù)與一個(gè)較"大"的數(shù)據(jù)一起運(yùn)算時(shí),系統(tǒng)將自動(dòng)將"小"數(shù)據(jù)轉(zhuǎn)換成"大"數(shù)據(jù),再進(jìn)行運(yùn)算。而在方法調(diào)用時(shí),實(shí)際參數(shù)較"小",而被調(diào)用的方法的形式參數(shù)數(shù)據(jù)又較"大"時(shí)(若有匹配的,當(dāng)然會(huì)直接調(diào)用匹配的方法),系統(tǒng)也將自動(dòng)將"小"數(shù)據(jù)轉(zhuǎn)換成"大"數(shù)據(jù),再進(jìn)行方法的調(diào)用,自然,對(duì)于多個(gè)同名的重載方法,會(huì)轉(zhuǎn)換成最"接近"的"大"數(shù)據(jù)并進(jìn)行調(diào)用。這些類型由"小"到"大"分別為 (byte,short,char)--int--long--float—double。這里我們所說的"大"與"小",并不是指占用字節(jié)的多少,而是指表示值的范圍的大小。
- 下面的語(yǔ)句可以在Java中直接通過:
- 如果低級(jí)類型為char型,向高級(jí)類型(整型)轉(zhuǎn)換時(shí),會(huì)轉(zhuǎn)換為對(duì)應(yīng)ASCII碼值,例如
- 對(duì)于byte,short,char三種類型而言,他們是平級(jí)的,因此不能相互自動(dòng)轉(zhuǎn)換,可以使用下述的強(qiáng)制類型轉(zhuǎn)換。
2.強(qiáng)制轉(zhuǎn)換
將"大"數(shù)據(jù)轉(zhuǎn)換為"小"數(shù)據(jù)時(shí),你可以使用強(qiáng)制類型轉(zhuǎn)換。即你必須采用下面這種語(yǔ)句格式:
可以想象,這種轉(zhuǎn)換肯定可能會(huì)導(dǎo)致溢出或精度的下降。
B.表達(dá)式的數(shù)據(jù)類型自動(dòng)提升, 關(guān)于類型的自動(dòng)提升,注意下面的規(guī)則。
- 所有的byte,short,char型的值將被提升為int型;
- 如果有一個(gè)操作數(shù)是long型,計(jì)算結(jié)果是long型;
- 如果有一個(gè)操作數(shù)是float型,計(jì)算結(jié)果是float型;
- 如果有一個(gè)操作數(shù)是double型,計(jì)算結(jié)果是double型;
C.包裝類過渡類型轉(zhuǎn)換
一般情況下,我們首先聲明一個(gè)變量,然后生成一個(gè)對(duì)應(yīng)的包裝類,就可以利用包裝類的各種方法進(jìn)行類型轉(zhuǎn)換了。例如:
- 當(dāng)希望把float型轉(zhuǎn)換為double型時(shí):
- 當(dāng)希望把double型轉(zhuǎn)換為int型時(shí):
- 簡(jiǎn)單類型的變量轉(zhuǎn)換為相應(yīng)的包裝類,可以利用包裝類的構(gòu)造函數(shù)。即:
而在各個(gè)包裝類中,總有形為××Value()的方法,來得到其對(duì)應(yīng)的簡(jiǎn)單類型數(shù)據(jù)。利用這種方法,也可以實(shí)現(xiàn)不同數(shù)值型變量間的轉(zhuǎn)換,例如,對(duì)于一個(gè)雙精度實(shí)型類,intValue()可以得到其對(duì)應(yīng)的整型變量,而doubleValue()可以得到其對(duì)應(yīng)的雙精度實(shí)型變量。
D.字符串與其它類型間的轉(zhuǎn)換
1.其它類型向字符串的轉(zhuǎn)換
- 調(diào)用類的串轉(zhuǎn)換方法:X.toString();
- 自動(dòng)轉(zhuǎn)換:X+"";
- 使用String的方法:String.volueOf(X);
2.字符串作為值,向其它類型的轉(zhuǎn)換
- 先轉(zhuǎn)換成相應(yīng)的封裝器實(shí)例,再調(diào)用對(duì)應(yīng)的方法轉(zhuǎn)換成其它類型
- 靜態(tài)parseXXX方法
- Character的getNumericValue(char ch)方法
E.Date類與其它數(shù)據(jù)類型的相互轉(zhuǎn)換
整型和Date類之間并不存在直接的對(duì)應(yīng)關(guān)系,只是你可以使用int型為分別表示年、月、日、時(shí)、分、秒,這樣就在兩者之間建立了一個(gè)對(duì)應(yīng)關(guān)系,在作這種轉(zhuǎn)換時(shí),你可以使用Date類構(gòu)造函數(shù)的三種形式:
Date(int year, int month, int date):以int型表示年、月、日 Date(int year, int month, int date, int hrs, int min):以int型表示年、月、日、時(shí)、分 Date(int year, int month, int date, int hrs, int min, int sec):以int型表示年、月、日、時(shí)、分、秒在長(zhǎng)整型和Date類之間有一個(gè)很有趣的對(duì)應(yīng)關(guān)系,就是將一個(gè)時(shí)間表示為距離格林尼治標(biāo)準(zhǔn)時(shí)間1970年1月1日0時(shí)0分0秒的毫秒數(shù)。對(duì)于這種對(duì)應(yīng)關(guān)系,Date類也有其相應(yīng)的構(gòu)造函數(shù):Date(long date)。
獲取Date類中的年、月、日、時(shí)、分、秒以及星期你可以使用Date類的getYear()、getMonth()、getDate()、getHours()、getMinutes()、getSeconds()、getDay()方法,你也可以將其理解為將Date類轉(zhuǎn)換成int。
而Date類的getTime()方法可以得到我們前面所說的一個(gè)時(shí)間對(duì)應(yīng)的長(zhǎng)整型數(shù),與包裝類一樣,Date類也有一個(gè)toString()方法可以將其轉(zhuǎn)換為String類
有時(shí)我們希望得到Date的特定格式,例如20020324,我們可以使用以下方法
F.總結(jié):只有boolean不參與數(shù)據(jù)類型的轉(zhuǎn)換
- 自動(dòng)類型的轉(zhuǎn)換:
- 強(qiáng)制類型轉(zhuǎn)換:用圓括號(hào)括起來目標(biāo)類型,置于變量前
五、String類
String是java的 一個(gè)類,而不是基本數(shù)據(jù)類型,以下是關(guān)于String的幾個(gè)面試題:
- 例1:String類型的st1和st2是否相等
解釋:在Java中==這個(gè)符號(hào)是比較運(yùn)算符,它可以基本數(shù)據(jù)類型和引用數(shù)據(jù)類型是否相等,如果是基本數(shù)據(jù)類型,==比較的是值是否相等,如果是引用數(shù)據(jù)類型,==比較的是兩個(gè)對(duì)象的內(nèi)存地址是否相等。而equals是Object這個(gè)父類的方法,在String類中重寫了這個(gè)equals方法。
內(nèi)存大致流程:
- 例2:下面這句話在內(nèi)存中創(chuàng)建了幾個(gè)對(duì)象
內(nèi)存中創(chuàng)建兩個(gè)對(duì)象,一個(gè)在堆內(nèi)存,一個(gè)在常量池,堆內(nèi)存對(duì)象是常量池對(duì)象的一個(gè)拷貝副本
new出來的對(duì)象都是存儲(chǔ)在堆內(nèi)存。那為什么堆中對(duì)象是常量池的對(duì)象的拷貝副本。“abc”屬于字符串,字符串屬于常量,所以應(yīng)該在常量池中創(chuàng)建,所以第一個(gè)創(chuàng)建的對(duì)象就是在常量池里的“abc”。第二個(gè)對(duì)象在堆內(nèi)存為啥是一個(gè)拷貝的副本呢,這個(gè)就需要在JDK API 1.6找到String(String original)這個(gè)構(gòu)造方法的注釋:初始化一個(gè)新創(chuàng)建的 String 對(duì)象,使其表示一個(gè)與參數(shù)相同的字符序列;換句話說,新創(chuàng)建的字符串是該參數(shù)字符串的副本。所以,答案就出來了,兩個(gè)對(duì)象。
- 例3:以下定義為String類型的st1和st2是否相等
- 例4:以下定義為String類型的st1和st2是否相等
解釋:“a”,”b”,”c”三個(gè)本來就是字符串常量,進(jìn)行+符號(hào)拼接之后變成了“abc”,“abc”本身就是字符串常量(Java中有常量?jī)?yōu)化機(jī)制),所以常量池立馬會(huì)創(chuàng)建一個(gè)“abc”的字符串常量對(duì)象,在進(jìn)行st2=”abc”,這個(gè)時(shí)候,常量池存在“abc”,所以不再創(chuàng)建。所以,不管比較內(nèi)存地址還是比較字符串序列,都相等。
- 例5:以下st2和st3是否相等
第二個(gè)是true不用解釋,可第一個(gè)判斷為什么是false?需要結(jié)合API的注釋說明和內(nèi)存圖來解釋這個(gè)為什么不相等。API的解釋可以濃縮成:str1 與 "c" 進(jìn)行字符串連接時(shí),底層是通過StringBuffer 進(jìn)行 append,生成一個(gè)StringBuffer對(duì)象,然后通過toString()方法,將StringBuffer對(duì)象轉(zhuǎn)為String,此時(shí)會(huì)產(chǎn)生一個(gè)新的堆內(nèi)存地址,str3指向這個(gè)新的內(nèi)存地址。
內(nèi)存流程:
本文參考1
本文參考2
總結(jié)
以上是生活随笔為你收集整理的Java基本数据类型及String类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高级产品经理的思维方式
- 下一篇: Java的Map接口,以及Collect