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