java基礎(chǔ)詳解之?dāng)?shù)據(jù)類型知識(shí)點(diǎn)總結(jié)
一、基本數(shù)據(jù)類型
1.1 整形
1.1.1 int
int a = Integer.MAX_VALUE;//int最大值 int b = Integer.MIN_VALUE;//int最小值
在java中int占4個(gè)字節(jié),和操作系統(tǒng)每任何關(guān)系。這也是java的可移植性。
int 能表示的范圍為-231~231-1,如果超出最大值或者小于最小值則會(huì)發(fā)生溢出。
public static void main(String[] args) { int a = Integer.MAX_VALUE;//int最大值 int b = Integer.MIN_VALUE;//int最小值 System.out.println("MAX_VALUE="+a); System.out.println("MIN_VALUE="+b); a = a+1; b = b-1; System.out.println("---------------"); System.out.println("MAX_VALUE+1="+a); System.out.println("MIN_VALUE-1="+b); }
我們發(fā)現(xiàn)int的最大值加1會(huì)等于int的最小值,而int的最小值減1會(huì)等于int的最大值。這種情況不僅在int,在long和short都存在
1.1.2 長整形:long
long占8個(gè)字節(jié),可表示的范圍是 -263~-263-1
long a = 100L; long b = 100l; long c = 100;
在創(chuàng)建長整形變量時(shí),a,b,c三種都可以,當(dāng)我們一般用第一種,大寫L更好識(shí)別它時(shí)長整形
1.1.3 短整形:short
short占2個(gè)字節(jié),所能表示的范圍為-215~215-1
short能表示的范圍 -32768~32767 ,所表示的范圍比較小一般不推薦使用,所以我們以后 int 和 long 時(shí)使用的比較多的。
1.2 浮點(diǎn)型
1.2.1 雙精度浮點(diǎn)型:double
public static void main(String[] args) { int a1 = 1; int a2 = 2; double b1 = 1.0; double b2 = 2.0; System.out.println("a1/a2="+a1/a2); System.out.println("b1/b2="+b1/b2); }
在java當(dāng)中int除以 int 只能得到 int 類型,因?yàn)樾?shù)部分會(huì)被舍去。如果要得到小數(shù)則需要用浮點(diǎn)數(shù)來計(jì)算。
再來看一個(gè)有意思的代碼
public static void main(String[] args) { double a = 1.1; System.out.println(a*a); }
這里a*a理論上說時(shí)等于1.21的但這里為什么不是呢?
1.Java 中的 double 雖然也是 8 個(gè)字節(jié), 但是浮點(diǎn)數(shù)的內(nèi)存布局和整數(shù)差別很大, 不能單純的用 2n 的形式表示數(shù)據(jù)范
2.Java 的 double 類型的內(nèi)存布局遵守 IEEE 754 標(biāo)準(zhǔn)(和C語言一樣), 嘗試使用有限的內(nèi)存空間表示可能無限的小數(shù), 勢(shì)
必會(huì)存在一定的精度誤差圍,而且計(jì)算機(jī)中小數(shù)是沒有精確的數(shù)字的
1.2.2 單精度浮點(diǎn)型:float
flaot占4個(gè)字節(jié)
public static void main(String[] args) { float a1 = 1.1; float a2 = (float)1.1; float b = 1.1F; float c = 1.1f; }
這里為什么報(bào)錯(cuò)呢?因?yàn)镴ava是一個(gè)強(qiáng)類型語言,安全性更高。在Java當(dāng)中小數(shù)默認(rèn)是double類型的,在創(chuàng)建float變量的時(shí)候,需要在小數(shù)后面加上一個(gè)F(f)或者強(qiáng)制類型轉(zhuǎn)換。
不過float能表示的精度較小,所以我們一般都是用double
1.3 字符類型變量char
在java中char不同于C語言它是占兩個(gè)字節(jié)的,計(jì)算機(jī)中的字符本質(zhì)上是一個(gè)整數(shù). 在 C 語言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此一個(gè)字符占用兩個(gè)字節(jié), 表示的字符種類更多, 包括中文.
public static void main(String[] args) { char a = 97; char b = 65; char c = '好'; System.out.println(a); System.out.println(b); System.out.println(c); }
在Java當(dāng)中字符類型就是字符類型不要和數(shù)字掛鉤,記住java中字符類型是不能夠給負(fù)數(shù)的。
1.4 字節(jié)類型變量byte
byte占1個(gè)字節(jié),能表示的范圍為 -128~127
byte不能賦值超過它范圍外的數(shù)字,從而可以推到出其它類型也是一樣的。
來看一段代碼:
這里的 b3和b5都報(bào)錯(cuò),而b4沒有報(bào)錯(cuò)呢?
1.這是因?yàn)閳?zhí)行 b3 這段代碼時(shí),b1和b2都是變量編譯器不知道里面是什么,為了安全起見所以報(bào)錯(cuò)。
2.而b4不報(bào)錯(cuò)時(shí)因?yàn)樵诰幾g的時(shí)候 5+10就已經(jīng)被替換為15了,相當(dāng)于 b4 = 15.
3.那b5報(bào)錯(cuò)又是為什么呢?這里就牽扯到了整形提升,
簡單說一下整形提升:當(dāng)變量小于4個(gè)字節(jié)的時(shí)候,比如這里的byte在計(jì)算時(shí)會(huì)把它先提升為整形int再進(jìn)行計(jì)算。而byte是1個(gè)字節(jié)接收不了int類型的變量,所以報(bào)錯(cuò)。后面會(huì)再提到整形提升
1.5 布爾類型變量 boolean
boolean a = false; boolean b = true;
1.在java中布爾類型只有兩個(gè)取值 false 和 true 。
2.java中的boolean和int 類型不能相互轉(zhuǎn)換,不存在1表示true ,0表示false這種用法
3.boolean 類型有些 JVM 的實(shí)現(xiàn)是占 1 個(gè)字節(jié), 有些是占 1 個(gè)比特位。并沒有明確規(guī)定大小
1.6 字符串類型變量 String
Java的字符串可以用+進(jìn)行拼接
public static void main(String[] args) { String str1 = "這是一個(gè)字符串"; String str2 = "java"; String tmp = str1 + str2; System.out.println(tmp); }
同樣也可以拼接數(shù)字
public static void main(String[] args) { String str1 = "這是一個(gè)字符串"; String str2 = "java"; String tmp = str1 + str2; System.out.println(tmp); int a = 10; int b = 20; System.out.println(tmp+a+b); System.out.println(a+b+tmp); }
輸出的時(shí)候如果前面是字符串則后面的數(shù)字會(huì)被當(dāng)作字符進(jìn)行拼接,可以根據(jù)自己的需要進(jìn)行運(yùn)算或者拼接
1.Java 使用 雙引號(hào) + 若干字符 的方式表示字符串字面值.
2. 和上面的類型不同, String 不是基本類型, 而是引用類型(在以后的文章會(huì)說到).
二、常量
上面討論的都是各種規(guī)則的變量, 每種類型的變量也對(duì)應(yīng)著一種相同類型的常量.
常量指的是運(yùn)行時(shí)類型不能發(fā)生改變.
常量主要有以下兩種體現(xiàn)形式
2.1 字面常量
2.2 … final 關(guān)鍵字修飾的常量
final修飾的常量是不能被直接修改的
三、 類型轉(zhuǎn)換和數(shù)值轉(zhuǎn)換
3.1 類型轉(zhuǎn)換
java 作為一個(gè)強(qiáng)類型編程語言, 當(dāng)不同類型之間的變量相互賦值的時(shí)候, 會(huì)有教嚴(yán)格的校驗(yàn).來看一下列子
long 表示的范圍更大, 可以將 int 賦值給 long, 但是不能將 long 賦值給 int.
double 表示的范圍更大, 可以將 int 賦值給 double, 但是不能將 double 賦值給 int.
結(jié)論: 不同數(shù)字類型的變量之間賦值, 表示范圍更小的類型能隱式轉(zhuǎn)換成范圍較大的類型, 反之則不行.
3.1.1 強(qiáng)制類型轉(zhuǎn)換
結(jié)論: 使用 (類型) 的方式可以將 double 類型強(qiáng)制轉(zhuǎn)成 int. 但是
1.強(qiáng)制類型轉(zhuǎn)換可能會(huì)導(dǎo)致精度丟失. 如剛才的例子中, 賦值之后, 20.5 就變成 20 了, 小數(shù)點(diǎn)后面的部分被忽略.
2.強(qiáng)制類型轉(zhuǎn)換不是一定能成功, 互不相干的類型之間無法強(qiáng)轉(zhuǎn)
比如這個(gè)列子 int 和 boolean這兩種完全不相關(guān)的類型是不可以強(qiáng)轉(zhuǎn)的。
類型轉(zhuǎn)換小結(jié):
1. 不同數(shù)字類型的變量之間賦值, 表示范圍更小的類型能隱式轉(zhuǎn)換成范圍較大的類型.
2. 如果需要把范圍大的類型賦值給范圍小的, 需要強(qiáng)制類型轉(zhuǎn)換, 但是可能精度丟失.
3. 將一個(gè)字面值常量進(jìn)行賦值的時(shí)候, Java 會(huì)自動(dòng)針對(duì)數(shù)字范圍進(jìn)行檢查.
3.2 數(shù)值提升
結(jié)論: 當(dāng) int 和 long 混合運(yùn)算的時(shí)候, int 會(huì)提升成 long, 得到的結(jié)果仍然是 long 類型, 需要使用 long 類型的變量來
接收結(jié)果. 如果非要用 int 來接收結(jié)果, 就需要使用強(qiáng)制類型轉(zhuǎn)換.
再來看一個(gè)例子,前面在byte類型的時(shí)候就已經(jīng)說到了,這里再詳細(xì)說一下。
結(jié)論: byte 和 byte 都是相同類型, 但是出現(xiàn)編譯報(bào)錯(cuò). 原因是, 雖然 a 和 b 都是 byte, 但是計(jì)算 a + b 會(huì)先將 a 和 b 都提升成 int, 再進(jìn)行計(jì)算, 得到的結(jié)果也是 int, 這時(shí)賦給 c, 就會(huì)出現(xiàn)上述錯(cuò)誤。
由于計(jì)算機(jī)的 CPU 通常是按照 4 個(gè)字節(jié)為單位從內(nèi)存中讀寫數(shù)據(jù). 為了硬件上實(shí)現(xiàn)方便, 諸如 byte 和 short 這種低于4 個(gè)字節(jié)的類型, 會(huì)先提升成 int, 再參與計(jì)算。
簡單來說類型提升就是為了加快cpu運(yùn)算速度
如果非要這樣計(jì)算,則需要強(qiáng)轉(zhuǎn)。
類型提升小結(jié):
1.不同類型的數(shù)據(jù)混合運(yùn)算, 范圍小的會(huì)提升成范圍大的.
2.對(duì)于 short, byte 這種比 4 個(gè)字節(jié)小的類型, 會(huì)先提升成 4 個(gè)字節(jié)的 int , 再運(yùn)算.
四、 int 和 String 之間的相互轉(zhuǎn)換
4.1 int轉(zhuǎn)String
public static void main(String[] args) { int a = 10; //方法1 String str1 = 10+" "; //方法2 String str2 = String.valueOf(a); }
4.2 String轉(zhuǎn)int
public static void main(String[] args) { String str = "123456"; int b = Integer.valueOf(str); int c = Integer.parseInt(str); }
五、總結(jié)
內(nèi)置數(shù)據(jù)類型共有8種,每一個(gè)內(nèi)置類型都會(huì)對(duì)應(yīng)一個(gè)包裝類,這里也不深入講解。簡單來說就是方便了數(shù)據(jù)的處理
感謝閱讀!
到此這篇關(guān)于java基礎(chǔ)詳解之?dāng)?shù)據(jù)類型知識(shí)點(diǎn)總結(jié)的文章就介紹到這了,更多相關(guān)java數(shù)據(jù)類型總結(jié)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)的mysql事務(wù)處理操作示例
這篇文章主要介紹了Java實(shí)現(xiàn)的mysql事務(wù)處理操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了Java基于JDBC操作mysql數(shù)據(jù)庫實(shí)現(xiàn)事務(wù)處理的相關(guān)概念、操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-08-08SpringBoot部署在tomcat容器中運(yùn)行的部署方法
這篇文章主要介紹了SpringBoot部署在tomcat容器中運(yùn)行的部署方法,需要的朋友可以參考下2018-10-10JavaWeb實(shí)現(xiàn)文件上傳與下載實(shí)例詳解
在Web應(yīng)用程序開發(fā)中,文件上傳與下載功能是非常常用的功能,下面通過本文給大家介紹JavaWeb實(shí)現(xiàn)文件上傳與下載實(shí)例詳解,對(duì)javaweb文件上傳下載相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-02-02Java中EasyExcel使用自定義Converter處理方法詳解
EasyExcel自定義Converter是指在使用EasyExcel進(jìn)行Excel讀寫操作時(shí),可以自定義轉(zhuǎn)換器來處理一些不支持的數(shù)據(jù)類型,這篇文章主要給大家介紹了關(guān)于Java中EasyExcel使用自定義Converter處理的相關(guān)資料,需要的朋友可以參考下2024-08-08Java適配器模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java適配器模式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07Spring中HandlerMethod類源碼詳細(xì)解析
這篇文章主要介紹了Spring中HandlerMethod類源碼詳細(xì)解析,HandlerMethod類用于封裝控制器方法信息,包含類信息、方法Method對(duì)象、參數(shù)、注解等信息,具體的接口請(qǐng)求是可以根據(jù)封裝的信息調(diào)用具體的方法來執(zhí)行業(yè)務(wù)邏輯,需要的朋友可以參考下2023-11-11java system類使用方法示例 獲取系統(tǒng)信息
這篇文章主要介紹了java system類使用方法,該類中的方法都是靜態(tài)的。不能被實(shí)例化,沒有對(duì)外提供構(gòu)造函數(shù),該類可以獲取系統(tǒng)信息2014-01-01布隆過濾器詳解以及其在Java中的實(shí)際應(yīng)用
布隆過濾器是一種數(shù)據(jù)結(jié)構(gòu),比較巧妙的概率型數(shù)據(jù)結(jié)構(gòu)(probabilistic data structure),特點(diǎn)是高效地插入和查詢,這篇文章主要給大家介紹了關(guān)于布隆過濾器詳解以及其在Java中的實(shí)際應(yīng)用,需要的朋友可以參考下2023-12-12