數(shù)據(jù)類型(上)
數(shù)據(jù)類型用來(lái)聲明變量挨稿,程序在運(yùn)行過(guò)程中根據(jù)不同的數(shù)據(jù)類型分配不同大小的空間陕靠。
例如:
int i = 10;
double d = 1.23;
i變量和d變量數(shù)據(jù)類型不同反惕,空間大小不同赤嚼。
數(shù)據(jù)類型在java語(yǔ)言中包括兩種:
第一種:基本數(shù)據(jù)類型
基本數(shù)據(jù)類型有可以劃分為4大類8小種:
8小種:
byte,short,int,long,float,double,boolean,char
第一類:整數(shù)型:byte,short,int,long(沒(méi)有小數(shù))
第二類:浮點(diǎn)型:float,double(帶有小數(shù)的)
第三類:布爾型:boolean(只有兩個(gè)值true和false)
第四類:字符型:char(java種規(guī)定字符必須使用單引號(hào)括起來(lái),屬于文字寞宫。)
第二種:引用數(shù)據(jù)類型
字符串型String屬于引用數(shù)據(jù)類型株灸。String字符串不屬于基本數(shù)據(jù)類型范疇崇摄。
java種除了基本數(shù)據(jù)類型之外,剩下的都是引用數(shù)據(jù)類型慌烧。
引用數(shù)據(jù)類型后期面向?qū)ο蟮臅r(shí)候才會(huì)接觸逐抑。
計(jì)算機(jī)存儲(chǔ)單位
整數(shù)型:byte,short,int,long有什么區(qū)別?
浮點(diǎn)型:float,double有什么區(qū)別屹蚊?
區(qū)別就是:占用的空間大小不同厕氨。
計(jì)算機(jī)只能識(shí)別二進(jìn)制。
1字節(jié) = 8bit(8比特)-->1byte = 8bit
byte占用1個(gè)字節(jié)淑翼。short占用2個(gè)字節(jié)腐巢。int占用4個(gè)字節(jié)。long占用8個(gè)字節(jié)玄括。float占用4個(gè)字節(jié)冯丙。double占用8個(gè)字節(jié)。boolean占用1個(gè)字節(jié)。char占用2個(gè)字節(jié)胃惜。
1KB = 1024byte
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
二進(jìn)制與十進(jìn)制
十進(jìn)制轉(zhuǎn)換成二進(jìn)制
方法:除以2泞莉,然后余數(shù)逆序輸出
例如:125轉(zhuǎn)換為二進(jìn)制
125/2 = 62 余1
62/2 = 31 余0
31/2 = 15 余1
15/2 = 7 余1
7/2 = 3 余1
3/2 = 1 余1
1/2 = 0 余1
逆序輸出:1111101
二進(jìn)制轉(zhuǎn)換成十進(jìn)制
方法:權(quán)相加法
例如:1111101
12^6+125+1*24+12^3+122+0*21+1*2^0=64+32+16+8+4+0+1=125
十六進(jìn)制:滿16進(jìn)1位
八進(jìn)制:滿8進(jìn)1位
取值范圍
byte類型的取值范圍
byte是 [-128~127] 共可以標(biāo)識(shí)256個(gè)不同的數(shù)字。
byte類型的最大值是怎么計(jì)算出來(lái)的呢船殉?
byte是1個(gè)字節(jié)鲫趁,8個(gè)比特位,所以byte可以存儲(chǔ)的最大值是:01111111利虫。
注意:在計(jì)算機(jī)當(dāng)中挨厚,一個(gè)二進(jìn)制位最左邊的是符號(hào)位,當(dāng)為0是表示整數(shù)糠惫,當(dāng)為1時(shí)表示負(fù)數(shù)疫剃。
所以,byte類型最大值時(shí)2的7次方減1硼讽,也就是128-1=127
有幾個(gè)取值范圍需要大家記壮布邸:
byte(1個(gè)字節(jié)):【-128 ~ 127】
short(2個(gè)字節(jié)):【-32768 ~ 32767】 可以表示65536個(gè)數(shù)字
int(4個(gè)字節(jié)):【-2147483648 ~ 2147483647】
char(2個(gè)字節(jié)):【0 ~ 65535】 可以表示65536個(gè)數(shù)字
short和char實(shí)際上容量相同,不過(guò)char可以表示更大的數(shù)字固阁。因?yàn)閏har表示的是文字壤躲,文字沒(méi)有正負(fù)之分,所以char可以表示更大的數(shù)字备燃。
字符編碼
對(duì)于8種基本數(shù)據(jù)類型來(lái)說(shuō)碉克,其中byte,short赚爵,int棉胀,long法瑟,folat冀膝,double,boolean霎挟,這7種類型計(jì)算機(jī)表示起來(lái)比較容易窝剖,因?yàn)樗麄兌际菙?shù)字。其中布爾類型只有兩個(gè)值true和false酥夭。實(shí)際上true和false分別在c++種對(duì)應(yīng)的是1和0赐纱,1為true,0為false熬北。
對(duì)于char類型來(lái)說(shuō)計(jì)算機(jī)表示起來(lái)比較麻煩疙描,因?yàn)閏har對(duì)應(yīng)的是文字。每一個(gè)國(guó)家的文字不一樣讶隐,文字不能直接通過(guò)自然算法轉(zhuǎn)換成二進(jìn)制起胰。
所以字符編碼產(chǎn)生了。
字符編碼是人為定義的一套轉(zhuǎn)換表巫延。在字符編碼種規(guī)定了一系列的文字對(duì)應(yīng)的二進(jìn)制效五。
字符編碼其實(shí)本質(zhì)上就是一本字典地消,該字典中描述了文字于二進(jìn)制之間的對(duì)照關(guān)系。
字符編碼是認(rèn)為規(guī)定的畏妖。(某個(gè)計(jì)算機(jī)協(xié)會(huì)規(guī)定的)
字符編碼涉及到編碼和解碼兩個(gè)過(guò)程脉执,編碼和解碼的時(shí)候必須采用同一套字符編碼方式,不然就會(huì)產(chǎn)生亂碼戒劫。
起初半夷,計(jì)算機(jī)是不支持文字的,只支持科學(xué)計(jì)算迅细。后來(lái)隨著計(jì)算機(jī)的發(fā)展玻熙,計(jì)算機(jī)開(kāi)始支持文字,最先支持的文字是英文疯攒,英文對(duì)應(yīng)的字符編碼方式是ASCII碼嗦随。
ASCII碼采用1byte進(jìn)行存儲(chǔ),鍵盤上所有的鍵全部算上也不超過(guò)256個(gè)敬尺。所以英文本身在計(jì)算機(jī)方面就占有優(yōu)勢(shì)枚尼。
'a' ---> 97 ---> 01100001
'A' ---> 65 ---> 01000001
'0' ---> 48 ---> 00101110(這個(gè)'0' 不是數(shù)字0,是文字'0' )
'a'--采用ASCII碼進(jìn)行編碼-->01100001
01100001--采用ASCII碼進(jìn)行解碼-->'a'
隨著計(jì)算機(jī)語(yǔ)言的發(fā)展砂吞,后來(lái)國(guó)際標(biāo)準(zhǔn)組織制定了ISO-8859-1編碼方式署恍,又稱為lating-1編碼方式,向上兼容ASCII碼蜻直,但不支持中文盯质。后來(lái)發(fā)展到亞洲才支持中文,日文概而,韓文....
簡(jiǎn)體中文這塊的編碼方式:GB2312<GBK<GB18030(容量的關(guān)系)
繁體中文:Big5(臺(tái)灣使用的是大五碼)
在java中呼巷,java為了支持全球所有的文字,采用了一種字符編碼方式叫做Unicode編碼赎瑰。unicode編碼統(tǒng)一了全球所有的文字王悍,支持所有文字。具體實(shí)現(xiàn)包括:UTF-8 UTF-16 UTF-32.....餐曼。
字符型:char
char占用2個(gè)字節(jié)压储。
char的取值范圍是 [0~65535]
char采用unicode編碼方式。
char類型的字面量使用單引號(hào)括起來(lái)源譬。
char可以存儲(chǔ)一個(gè)漢字集惋。一個(gè)漢字占用2個(gè)字節(jié),char類型正好占用兩個(gè)字節(jié)踩娘。
轉(zhuǎn)義字符
java語(yǔ)言中”\“負(fù)責(zé)轉(zhuǎn)義刮刑。
**加上一個(gè)特殊的字符,共同構(gòu)成一個(gè)新的字符。
** 的出現(xiàn)會(huì)將緊挨著的后面的字符進(jìn)行轉(zhuǎn)義为朋。
\t 表示制表符tab
\n 表示換行符
System.out.println();輸出括號(hào)內(nèi)內(nèi)容之后換行
System.out.print();輸出括號(hào)內(nèi)內(nèi)容之后不換行
如果想要在控制臺(tái)輸出一個(gè) ' 字符臂拓,可以使用 System.out.println(''');
' 表示一個(gè)普通不能再普通的單引號(hào)字符。
同理如果想要在控制臺(tái)輸出一個(gè) \ 字符习寸,可以使用 System.out.println('\');
\在java中兩個(gè)反斜杠代表了一個(gè)”普通的反斜杠字符“胶惰。
如果想要在控制臺(tái)輸出"test",可以使用 System.out.println(""test"");
"表示一個(gè)普通的雙引號(hào)字符霞溪。
\u反斜杠u表示后面的是一個(gè)字符的unicode編碼孵滞。
unicode編碼是十六進(jìn)制的。
例如:System.out.println('\u4e2d');
輸出的結(jié)果是:中
在較低版本JDK(例如JDK8)中鸯匹,bin目錄下會(huì)有一個(gè)native2ascii.exe的命令坊饶,在DOS命令窗口輸入這個(gè)命令后,輸入字符殴蓬,在敲擊回車匿级,就會(huì)出現(xiàn)它的unicode編碼。
整數(shù)型的4種編寫方式
對(duì)于整數(shù)型來(lái)說(shuō)染厅,最常用的是int痘绎,開(kāi)發(fā)的時(shí)候不用斤斤計(jì)較。
在java語(yǔ)言種整數(shù)型字面量有4種表示形式:
十進(jìn)制:最常用的肖粮。
二進(jìn)制:0b開(kāi)頭
八進(jìn)制:0開(kāi)頭
十六進(jìn)制:0x開(kāi)頭
public class Int{
public static void main(String[] args){
//十進(jìn)制
int a = 10;
System.out.println(a);//輸出10
//八進(jìn)制
int b = 010;
System.out.println(b);//輸出8
//十六進(jìn)制
int c = 0x10;
System.out.println(c);//輸出16
//二進(jìn)制(JDK8的新特性孤页,低版本不支持)
int d = 0b10;
System.out.println(c);//輸出2
}
}
類型轉(zhuǎn)換
在java中有一條非常重要的結(jié)論:在任何情況下,整數(shù)型的”字面量“默認(rèn)被當(dāng)作int類型處理涩馆。
如果希望該”整數(shù)型字面量“被當(dāng)作long類型來(lái)處理行施,需要在”字面量“后面添加L或l。建議使用大寫的L魂那,因?yàn)樾憀和1傻傻分不清蛾号。
小容量可以自動(dòng)轉(zhuǎn)換成大容量,這種操作被稱為:自動(dòng)類型轉(zhuǎn)換冰寻。
過(guò)大的整數(shù)可以在后面加一個(gè)L须教,把int類型轉(zhuǎn)換位long類型皿渗。
大容量轉(zhuǎn)換成小容量斩芭,要想編譯通過(guò),必須加強(qiáng)制類型轉(zhuǎn)換符乐疆,進(jìn)行強(qiáng)制類型轉(zhuǎn)換划乖。
需要注意的是:加強(qiáng)制類型轉(zhuǎn)換符之后,雖然編譯通過(guò)了挤土,但是運(yùn)行的時(shí)候可能會(huì)損失精度琴庵。
強(qiáng)制類型轉(zhuǎn)換符格式:(強(qiáng)制轉(zhuǎn)換的類型)
例如:
long x = 100L;
int y = (int)x;//這個(gè)(int)就是強(qiáng)制類型轉(zhuǎn)換符
long類型強(qiáng)轉(zhuǎn)為int類型會(huì)自動(dòng)將前面的4個(gè)字節(jié)砍掉。
int類型強(qiáng)轉(zhuǎn)為byte類型會(huì)自動(dòng)將前面的3個(gè)字節(jié)砍掉。
java中有一個(gè)語(yǔ)法規(guī)則:當(dāng)這個(gè)整數(shù)型字面量沒(méi)有超出byte或short的取值范圍迷殿,那么這個(gè)整數(shù)型的字面量是可以直接賦值給byte或short類型的變量儿礼。
這種語(yǔ)法機(jī)制是為了方便寫代碼而存在的。