數(shù)據(jù)類型
一、什么是數(shù)據(jù)類型
????1.百度百科: 數(shù)據(jù)類型在數(shù)據(jù)結(jié)構(gòu)中的定義是一個值的集合以及定義在這個值集上的一組操作。
????????簡單理解 : ?Java對數(shù)據(jù)進行了分類,存在不同的類型
????????為什么需要數(shù)據(jù)分類:不同的數(shù)據(jù)類型占用的存儲空間不一樣,為了更好的利用計算機內(nèi)存 空間,防止出現(xiàn)小數(shù)據(jù)存在大數(shù)據(jù)類型導(dǎo)致浪 ?費空間的情況(存入的數(shù)據(jù)是以二進制的形式 放入存儲空間的:01010101010101010101010101010101)
????2.在 Java 的領(lǐng)域里,
????????基本數(shù)據(jù)類型變量(包括整數(shù)[byte、short、int、long]}、浮點型[float、double]、字符型[char]、布爾類型[boolean]): ?存的是數(shù)據(jù)值本身
????????引用數(shù)據(jù)類型變量: ?存的是保存數(shù)據(jù)的內(nèi)存空間地址,輸出時輸出的是數(shù)據(jù)。
????????學(xué)習(xí)數(shù)據(jù)類型基本認(rèn)識:
????????Java中每個變量都有一種類型,數(shù)據(jù)類型限制變量能用的存儲空間,所以可以存入的值也是有范圍的
????????????示例:比如byte數(shù)據(jù)類型能存的值在-128~127之間,超過就沒法存
二、進制
????1.進制的概念
????????(1)10進制 (逢10進1)(計數(shù)) ?在我們生活中最常用,同樣,在我們寫代碼中也最常用。
????????????其中的符號可以是 :1 2 3 4 5 6 7 8 9 0
????????(2)2進制 ?(逢2進1) ?
????????????其中的符號可以是: 1 0
????????(3)8進制 (逢8進1)
????????????其中的符號可以是: 0 1 2 3 4 5 6 7?
????????(4)16進制(逢16進1)?
????????????其中的符號可以是:
????????????0 1 2 3 4 5 6 7 8 9 A(10) B(11) C(12) D(13) E(14) F(15)?
????????????????示例:2A ?
三、基本數(shù)據(jù)類型(8種)
????1.計算機中的存儲單位
????????1024T
????????1T = 1024G
????????1G = 1024MB
????????1M = 1024KB
????????1KB=1024Byte
????????1Byte = 8 bit【1個bit就是一個二進制位】
????2.整型數(shù)據(jù)byte ?short ?int ? long
????????為什么會有不同大小的類型,舉個例子比如存 5 這個數(shù)據(jù)怎么存的?
????????byte(8位,范圍是-128到127)
????????short(16位)
????????int(32位)
????????long (64位)
????????上面的byte short int long 最大長度可以通過jdk文檔去找到 具體的范圍。
????????如果值比long還大,怎么辦?
????????Java提供了一個類:BigInteger:用于處理較大整數(shù)
????????long賦值時,因為整數(shù)默認(rèn)是int類型,要轉(zhuǎn)換為long類型的值,后面加上l或L
????????同一個整數(shù)可以使用不同的進制表示:(System.out.println(0b101)需jdk1.7才能按照十進制輸出)
????????Java7 開始 支持?jǐn)?shù)字之間用 _ 分割(12_34_56輸出123456)
????3.浮點型 ? ?float ? ?double ?其實就是小數(shù)
????????float(單精度32位)
????????直接給變量賦值時必須在浮點類型數(shù)據(jù)后面加上f 或F
????????[ 表示該數(shù)據(jù)是一個浮點類型數(shù)據(jù) ]
????????double( 雙精度64位)
????????單精度雙精度區(qū)別:
????????(1)對于單精度浮點數(shù),運行速度相比double更快,占內(nèi)存更小,
????????????但是當(dāng)數(shù)值非常大或者非常小的時候會變得不精確。
????????(2)雙精度比單精度表示的位數(shù)大 精確的位數(shù)多,簡單地說, float表示的小數(shù)點位數(shù)少。
????????????默認(rèn)浮點數(shù)的類型是 double
????????????表現(xiàn)形式:
????????????常規(guī) ?
????????????例如 ?3.14 ?3.14f
????????????科學(xué)計數(shù)法
????????????例如 ?3.14e2 ?3.14*10^2 ? ? 3.14e-2
????????????注意:存入的數(shù)據(jù)會有精度損失 [ 使用浮點數(shù)的時候需要注意 ]
????????????例如 double num= 1.0, 是一個無限接近1.0的一個值
????????????結(jié)論:浮點運算很少是精確的,只要是超過精度能表示的范圍就會產(chǎn)生誤差。往往產(chǎn)生誤差不是 因為數(shù)的大小,而是因為數(shù)的精度。因此,產(chǎn)生的結(jié)果接近但不等于想要的結(jié)果。尤其在使用 float 和 double 作精確運 算的時候要特別小心。
????????????那怎么更精確的表示浮點數(shù)呢?
? ? ????????Java提供了一個類BigDecimal來表示更精準(zhǔn)的浮點數(shù)
????4.字符char?
????????什么是字符:單引號引起來的一個符號就是字符數(shù)據(jù) ? ?例如:'A'
????????存儲單位16 位[0-65535] ?[2個字節(jié),16位]。字符常量使用單引號 ''(英文狀態(tài)下)包裹起來。
????????表現(xiàn)形式:
????????'A'最常用,最直觀的方式
????????使用一個數(shù)字表示,對應(yīng)有一個ASCII碼表[ 字符編碼 ]
? ? ????????例如:char c = 65;//表示 'A' 這個字符
????????16進制表現(xiàn)形式
????????'A'->65(10進制)
?????????'A'->0x41(16進制)怎么表示? '\u0041'
????????特殊符號(需要使用轉(zhuǎn)義符號轉(zhuǎn)義)
?????????\' ? \" ? \\ ? \r(回車) ?\n(換行) \t(制表符Tab)
????????字符數(shù)據(jù)可以當(dāng)成一個整數(shù)來使用,
????????什么是ASCII表,就像化學(xué)元素周
????5.布爾類型boolean
????????值只有兩個 true false,不能使用 0 1表示
四、 引用類型
????1.引用類型String
????????String是 java中已經(jīng)設(shè)計好的一個類,表示的值是字符串,是字符串?dāng)?shù)據(jù)類型
????????[注意:Java中設(shè)計的類和我們自己設(shè)計的類的性質(zhì)是一樣的]
????????常見形式:String s = "你好";
????????當(dāng)String 和 + 一起使用的時候,這時候+ 是拼接字符串的功能
????????System.out.println("你好"+2);//結(jié)果為 ? ?你好2
????????int a ?= 5;
????????int b = 10
????????System.out.println("a="+a+",b="+b); //結(jié)果為a=5,b=10
????2.一個類其實就是一種引用數(shù)據(jù)類型
????????自己寫的一個類也是一種數(shù)據(jù)類型,類型為類名
????????我們自己寫的類和Java已經(jīng)寫好的,性質(zhì)一樣
五、 數(shù)據(jù)類型轉(zhuǎn)換
????????整型數(shù)據(jù)【值】 : 默認(rèn)類型為int類型 :例如:12默認(rèn)為int類型
????????小數(shù)數(shù)據(jù) : 默認(rèn)為double類型 :例如:3.14默認(rèn)為double類型
????????①自動類型轉(zhuǎn)換:小數(shù)據(jù)類型轉(zhuǎn)大數(shù)據(jù)類型【存儲空間的大小】
????????②強制類型轉(zhuǎn)換:
????????①大數(shù)據(jù)類型轉(zhuǎn)小數(shù)據(jù)類型[存儲空間大小]
? ? ? ? ②相同存儲空間不同類型表達值范圍不一樣[例如:char及short
????3.數(shù)據(jù)轉(zhuǎn)換說明
????????1.在Java中,boolean類型與所有其他7種類型都不能進行轉(zhuǎn)換。(byte short int long float double char)
????????2.如下7種數(shù)據(jù)類型,它們之間都可以進行轉(zhuǎn)換,但是可能會存在精度損失或者其他一些變化:
????????????byte short ,char ?int ?long float ?double
????????????①自動類型轉(zhuǎn)換: ?[short和char ,因值的范圍不同,不能自動轉(zhuǎn)換]其他都可以自動完成轉(zhuǎn)換
????????????②強制類型轉(zhuǎn)換: ?必須強制轉(zhuǎn)換。
????????思考:為什么float 在long 后面?
????????小數(shù)(浮點數(shù)) 的存儲方式,結(jié)構(gòu)和整數(shù)不一樣:知道就好無須深入研究..
????(1)自動轉(zhuǎn)換
????????1)數(shù)據(jù)類型過長 和 溢出
????????????byte b = 128;//超出byte范圍
????????????long intMax = int最大數(shù)(查jdk文檔)
????????2)long ?float ?double只要兩個操作數(shù)中有一個是上面類型的,另一個就會被轉(zhuǎn)換成相應(yīng)類型,并且結(jié)果也是該類型: 例如
????????????int ?num = 10;?
????????????double b = 10.01;
????????????double ?c = num + b;
????????????System.out.println(c);
????????3)如果2個操作數(shù)(包括byte,short,char,int),都將會轉(zhuǎn)換為int類型,并且結(jié)果也是int(自動向上轉(zhuǎn)型)
????????????short s = 10;
????????????int num = 20;
????????????int n = num + s;
????????????System.out.println(n);
? ??
????????????byte b=3; ? ??
????????????b=(byte)(b*3);//必須聲明byte。
????????????System.out.println(b);
????????4)char類型向更高長度類型(例如整型)轉(zhuǎn)換時,會轉(zhuǎn)換為對應(yīng)的ASCII碼值,再做其他類型的自動轉(zhuǎn)換
????????????例如:
????????????char ?c = 'A';?
????????????int num = 10;?
????????????int a = c+num;
????????????System.out.println(a); ? ? ? ? ? ? ? ? ? ? ? ? ??
????????需要注意的是:
????????????1.char型具有兩個字節(jié),其數(shù)值范圍是0 ~ 2^16-1,
????????????2.short類型也具有兩個字節(jié),其值的范圍是-2^15 ~ 2^15-1
????????????這直接導(dǎo)致byte型不能自動類型提升到char,char和short直接也不會發(fā)生自動類型提升(因為值范圍問題),同時,byte當(dāng)然可以直接提升到short型。?
????????????所以,char 不能和byte short 相互自動轉(zhuǎn)換
????????5)特例 :只看類型不看值
????????????示例1:
????????????int a = 129;
????????????byte b = (byte)a;//編譯器只看容器不看值
???????????System.out.println(b);//結(jié)果為-127
????????????示例2:
????????????byte ?b ?= ?100;//可以自動轉(zhuǎn)換
????????????float ? f = 1.3;//不能自動轉(zhuǎn)換
????????????int ?a = 2147483647;
????????????a = a+1;
????????????System.out.println(a); ?// 結(jié)果為 ?-2147483648
????(2)強制轉(zhuǎn)換
????????1.強制類型轉(zhuǎn)換的語法
????????數(shù)據(jù)類型 變量名 = (數(shù)據(jù)類型)值;//值可能是更高的類型
????????2.強制類型轉(zhuǎn)換的注意事項
????????????(1)高轉(zhuǎn)低會導(dǎo)致精度丟失,不同類型的強制轉(zhuǎn)換,可能會導(dǎo)致精度的下降.
????????????(2)實際開發(fā)中:應(yīng)該要知道被強制轉(zhuǎn)換的數(shù)據(jù),是在一個已知的范圍;
????????3.示例
????????????比如說:double 轉(zhuǎn) float ?
????????????示例一:
????????????int i1=123;
????????????int i2=456;?
????????????float f1 = (float) ((i1+i2)*1.2);//容量大的類型轉(zhuǎn)換為容量小的類型時,要加上強制轉(zhuǎn)換符
????????????示例二:
????????????short i=99;
????????????char c=(char)i; ?
????????????System.out.println(c); ?
????????????示例三:
????????????byte b1=1;
????????????byte b2=2;
????????????byte b3=(byte)(b1+b2); //byte,short,char在計算時首先轉(zhuǎn)換為int,大容//量(int)轉(zhuǎn)換為小容量的類型(byte)時要加強制轉(zhuǎn)換
????????????特 ?例:
????????????byte t = 127;//不報錯
????????????int a = 127;
????????????//需要強制轉(zhuǎn)換才不報錯:編譯器只看容器【只看類型】不看值
????????????byte b = (byte)a;System.out.println(b); // 結(jié)果為 127