四虎影视库国产精品一区-四虎影视库-四虎影视久久久免费-四虎影视久久久-四虎影视久久-四虎影视精品永久免费网站

TEL:15195455103

Java培訓 > Java知識 >

Java Grammar:數(shù)據(jù)類型

作者:南京java培訓????來源:南京????發(fā)布時間:2020-02-05 08:44????瀏覽量:157

  Java中的基礎數(shù)據(jù)類型

  Java的數(shù)據(jù)類型

  我們知道,Java是一種強類型語言,類型對于Java語言來說非常的重要不言而喻,在Java中,分為基礎數(shù)據(jù)類型和引用數(shù)據(jù)類型,其中基礎數(shù)據(jù)類型分為了四類八種:

  下面,我們來分別說一下這四類八種

  整形

  首先,需要說明一點,在Java的整形中不存在unsigned類型的數(shù)值,也就是說Java的整形都是有符號的可為正,可為負的整數(shù)

  名稱取值范圍字節(jié)數(shù)位數(shù)包裝類byte$-2^7$ 到 $2^7-1$18Byteshort$-2^{15}$ 到 $2^{15}-1$216Shortint$-2^{31}$ 到 $2^{31}-1$432Integerlong$-2^{63}$ 到 $2^{63}-1$864Long

  可以看出,取值范圍取決于該類型的位數(shù),由于Java的代碼是運行在JVM中,所以該類型是獨立于機器之外存在的,與機器的關系并沒有很大,大大的提高了代碼的可移植性。

  在書寫代碼的時候,我們需要注意,在我們定義一個long類型的變量時,一定要記得在代碼后加上大寫的L(小寫的l在某些字體下容易被認證1,給代碼的可讀性帶來影響)。

  整形默認類型

  我們的整數(shù)默認類型是int類型,在我們進行計算的時候,會默認按照int類型進行計算。

  byte a = 127; //rightbyte b = 1; //rightbyte c = a + b; // wrongbyte d = 127 + 1; //wrong

  編譯器報錯兩處,均是下面的這個錯誤信息:

  HelloWorld.java:7: 錯誤: 不兼容的類型: 從int轉(zhuǎn)換到byte可能會有損失byte c = a + b; // wrong ^HelloWorld.java:9: 錯誤: 不兼容的類型: 從int轉(zhuǎn)換到byte可能會有損失byte d = 127 + 1; //wrong

  這是一道很常見的面試題,其中錯誤的原因有兩點:

  編譯器可以識別常量,但是無法識別變量,常量可以在編譯期間判斷是否超出范圍,但是兩個變量相加,編譯器在編譯期間無法得知,所以會報錯。

  編譯器在編譯期將該值作為int類型進行預編譯計算后發(fā)現(xiàn)超出byte的取值范圍,但是又是通過一個byte類型的變量去接收,所以就會出現(xiàn)可能會損失精度的異常。

  這里很好的體現(xiàn)了整數(shù)類型的默認計算類型就是int類型~

  浮點類型

  浮點型有兩種,一種是32位的float類型(單精度),一種是64位的double類型(雙精度)。

  名稱取值范圍字節(jié)數(shù)位數(shù)包裝類float大約$-3.4E+38$ 到 $+3.4E38$832Floatdouble大約$-1.7E-308$ 到 $1.7E308$1664Double

  因為double的取值范圍更廣,精度更高,所以我們?nèi)粘6际鞘褂胐ouble,默認的浮點類型也是double。

  關于float和long

  從上面我們可以知道float是32位的,而long是64位的,下意識的我們會認為64位的取值范圍必定要大于32位的,但事實并非如此:

  float占了4個字節(jié),也就是32位,其中第一位是符號位,23位是尾數(shù)位,剩下的8位都是指數(shù)位,$2^{8}$為256,由于(signed)符號數(shù)的原因,也就是說,float的取值范圍大致位于$2^{-126}$到${2^{127}}$,是要遠遠的大于long的取值范圍的。

  其實,這也詮釋了另外一個浮點數(shù)問題,因為計算機是二進制的,所以無法精確的表示出浮點數(shù),但是Java也給我們了一種解決方案,那就是我們在涉及到浮點數(shù)比較敏感的地方(比如經(jīng)緯度,金錢)的時候,一定要注意使用BigDecimal傳參為字符串的方式!

  三個特殊的浮點數(shù)值:

  正無窮大(Double.POSITIVE_INFINITY)負無窮大(Double.NEGATIVE_INFINITY)NAN(Double.NaN)

中博教育軟件學校

  字符型

  char關鍵字所修飾的類型是字符型,需要由單引號引起來,一個或兩個char類型的數(shù)值可以表示一個Unicode字符,我們所熟知的字符串底層數(shù)據(jù)結構正是一個字符數(shù)組常量:

  /** The value is used for character storage. */ private final char value[];

  char類型其實是由u+十六進制數(shù)據(jù)的組成的,大值為uffff(65535),小值為u0000(0)。

  這里需要注意一些特殊的轉(zhuǎn)義字符:

  轉(zhuǎn)義序列名稱Unicode值退格u0008 制表u0009 換行u000a 回車u000d”雙引號u0022’單引號u0027反斜杠u005c

  布爾型

  boolean修飾的變量就是布爾型,布爾類型很簡單,只有true false兩個值,但是這里需要注意,和C++不同的地方是它不能由數(shù)字0或1轉(zhuǎn)換成布爾型。

  強制類型轉(zhuǎn)換

  byte a = 127; //rightbyte b = 1; //rightbyte c = a + b; // wrongbyte d = (byte)(a + b) // rightSystem.out.println(d);

  還是這個熟悉的例子,剛剛我們已經(jīng)分析了第三種情況為什么會報錯,這里我們可以通過強制類型轉(zhuǎn)換來強制完成這個操作。

  強制類型轉(zhuǎn)換只發(fā)生在位數(shù)較多的類型(int,64位)轉(zhuǎn)為位數(shù)較少(byte,8位)的類型。

  果不其然,我們將第三句注釋掉之后,代碼可以正常編譯通過,然后我們?nèi)ミ\行的時候,發(fā)現(xiàn)打印的d的值如下:

  這里就說到了強制類型轉(zhuǎn)換會發(fā)生的一種情況,如果被轉(zhuǎn)換的數(shù)值超出目標類型的取值范圍,就會發(fā)生數(shù)據(jù)的丟失。

  二進制在計算的時候,發(fā)生了超出數(shù)據(jù)范圍的進位操作,隨著強制類型轉(zhuǎn)換,進位的部分被咔嚓掉,然后就發(fā)生這種情況了(熟悉原反補的同學應該明白這一點)。

  var

  JDK 10中推出了一種新的類型var,猛地看起來很像javascript中的var,它可以這么玩:

  var list = new ArrayList();var x = 3;

  乍一看,還真的和javascript有些像,但其實并不然,并不會影響Java是一個強類型語言的事實,它是基于局部變量推斷機制來完成的,編譯器在處理var時,先讀構造器,并將它作為變量的類型,然后將該類型寫入字節(jié)碼當中。也就是說,該類型是無法更改的。

  var a = 3;a = [1,2,3];

  這樣的寫法在javascript中毫無問題,但是在Java中就不行。但是需要注意,var只能作用于帶有構造器的局部變量和for循環(huán)中。

  本篇重點總結

  數(shù)據(jù)類型四類八種

  float取值范圍要大于long

  強制轉(zhuǎn)換只發(fā)生在高位轉(zhuǎn)低位

  var類型的原理是局部類型推斷


本文內(nèi)容、圖片由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至2353260942@qq.com 舉報,一經(jīng)查實,本站將立刻刪除。(如需投稿聯(lián)系管理員開通!)

? CopyRight njjava.com ???? 蘇ICP備14052071號

搶試聽名額

名額僅剩66名

教育改變生活

WE CHANGE LIVES