一躏嚎、數(shù)據(jù)類型初階
1轧拄、概述
- Java定義了基本數(shù)據(jù)類型诅病、引用數(shù)據(jù)類型和自定義類型。
- 本主題將介紹Java的八種基本數(shù)據(jù)類型和引用數(shù)據(jù)類型中的String類型芋哭。
基本數(shù)據(jù)類型如下表所示:
類型 | 占用空間 | 取值范圍 |
---|---|---|
byte(字節(jié)型) | 1字節(jié) | -128~127 |
short(短整型) | 2字節(jié) | -216~216-1 |
int(整型) | 4字節(jié) | -231~231-1 |
long(長整型) | 8字節(jié) | -9223372036854775808~9223372036854775807 |
float(單精度) | 4字節(jié) | -3.402823510^38~ 3.402823510^38-1 |
double(雙精度) | 8字節(jié) | -1.79769310^308~ 1.7976931310^308 |
char(字符型) | 1字節(jié) | 0~65535 |
boolean(布爾型) | 1或4字節(jié) | false沉衣、true |
2郁副、椉跷空間
- 棧空間存取數(shù)據(jù)的效率高存谎。
- 棧中的數(shù)據(jù)按 “先進(jìn)后出” 的方式管理拔疚。
- 棧空間存儲空間較小既荚,不能存放大量的數(shù)據(jù)稚失。
- JVM將基本類型的數(shù)據(jù)存放在棧空間恰聘。
3、堆空間
- 堆空間存取數(shù)據(jù)的效率最低晴叨。
- 數(shù)據(jù)存放的位置隨機(jī)分配凿宾。
- 堆空間存儲數(shù)據(jù)的空間大,能存放大容量的數(shù)據(jù)兼蕊。
二初厚、變量的定義和變量使用的原因
1、什么是變量
- 變量就是可變的量孙技。
- 常量就是不可變的量产禾。
- 字面量:Java的變量和常量中存放的具體的數(shù)據(jù)稱為字面量。
2牵啦、為什么使用變量
計算機(jī)的高級語言普遍使用變量來管理內(nèi)存中存儲的數(shù)據(jù)亚情。
描述:圖一是棧空間中存儲基本數(shù)據(jù)類型的示意圖哈雏,椑慵空間最上面有一個數(shù)據(jù)是字符‘男’拌夏,這個數(shù)據(jù)存儲在棧空間中的一個地址表示空間中履因,比如障簿,0x3a50:0x是十六進(jìn)制的表示方式,3a50是具體的內(nèi)存單元在椪て空間中的地址站故。如果在寫程序時,通過內(nèi)存地址來讀取這些數(shù)據(jù)毅舆,是非常抽象西篓、難以理解、難以記憶的憋活。為此岂津,高級語言使用變量來操作內(nèi)存中的數(shù)據(jù),而不直接使用這些地址進(jìn)行操作悦即。圖二所示吮成,把數(shù)據(jù)‘男’,設(shè)一個變量sex來表示辜梳,我們在程序中或調(diào)用變量名sex來操作男粱甫,那么計算機(jī)底層會將sex和這個數(shù)據(jù)實際的地址進(jìn)行一一對應(yīng),這樣程序員只需要記住這個變量名就可以很方便的操作內(nèi)存中該數(shù)據(jù)作瞄,這就是變量使用的意義茶宵。
3、變量管理引用類型的數(shù)據(jù)
引用類型的數(shù)據(jù)是存放在堆空間中的宗挥,堆空間中有個數(shù)組乌庶,這個數(shù)組在堆空間中的地址是aa00,如何操作這個數(shù)組呢契耿?Java語言是采取以下處理方式瞒大,首先在棧空間中定義一個變量宵喂,這個變量名叫scores糠赦,這個變量存放的數(shù)據(jù)是堆空間中這個數(shù)組的地址aa00,棧中使用十六進(jìn)制0xaa00來表示锅棕,這樣我們在操作這個數(shù)組時拙泽,通過使用棧中的scores這個變量,調(diào)用該變量中保存的數(shù)組裸燎,即堆空間中該數(shù)組地址來操作數(shù)組顾瞻。
三、變量的命名德绿、定義和初始化
1荷荤、變量的命名
- 首字母是英文字母退渗、$或下劃線,由字母蕴纳、數(shù)字会油、下劃線組成。
- 變量的命名遵循見名知義的原則古毛。
- Java變量名建議不用中文翻翩。
- 變量名首字母建議不用大寫字母。
- 用駝峰命名法命名多個單詞組成的變量名稻薇。例如:sumScore
- 變量名不要使用Java關(guān)鍵字嫂冻。
2、變量的定義
定義變量:每個變量必須屬于一種數(shù)據(jù)類型塞椎。
格式: 類型 變量名1桨仿,變量2,……案狠,變量n;
示例:
byte score;//保存單科分?jǐn)?shù)
short age;//保存年齡
int sumScore;//保存總分
long fileSize;//保存文件長度
float x,y;
double result;//保存運(yùn)算結(jié)果
char sex;保存性別
boolean isContinue;//表示是否繼續(xù)
String name;//表示姓名
3服傍、變量的初始化
變量的初始化用賦值語句等號,將等號右側(cè)的數(shù)據(jù)存儲在左側(cè)的變量中莺戒。
age = 23;
score = 70+5;
i = 10/5;
result = Math.pow(2,5)+3.5;
sex = '男';
isContinue = true;
name = "張"+"大飛";
四伴嗡、用變量簡化計算
【示例-1】保存中間結(jié)果急波,用分步驟計算簡化復(fù)雜運(yùn)算
計算 (sqrt(20)+sqrt(10))/(sqrt(20)-sqrt(10)) =
要求:顯示結(jié)果保留小數(shù)點后1位从铲,即對小數(shù)點后第2位四舍五入。
方案一:整體計算
第一步:精確結(jié)果
代碼
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("(sqrt(20)+sqrt(10))/(sqrt(20)-sqrt(10))="+
(Math.sqrt(20)+Math.sqrt(10))/(Math.sqrt(20)-Math.sqrt(10)));
}
}
結(jié)果:5.828427124746191
第二步:保留一位小數(shù)
代碼
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("(sqrt(20)+sqrt(10))/(sqrt(20)-sqrt(10))="+
Math.round(10*(Math.sqrt(20)+Math.sqrt(10))/(Math.sqrt(20)-Math.sqrt(10)))/10.0);
}
}
結(jié)果:5.8
方案二:分布計算
代碼
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
double sqrt20=Math.sqrt(20);//將20的平方根保存在sqrt20中
double sqrt10=Math.sqrt(10);//將10的平方根保存在sqrt10中
double result=(sqrt20+sqrt10)/(sqrt20-sqrt10);
result=Math.round(result*10)/10.0;
System.out.println("(sqrt(20)+sqrt(10))/(sqrt(20)-sqrt(10))="+result);
}
}
結(jié)果:5.8
五澄暮、用變量保存多種類型的數(shù)據(jù)
【示例-2】不同類型的變量存放對應(yīng)類型的數(shù)據(jù)名段,變量的值可以改變。
預(yù)期結(jié)果見下圖:
代碼
public class Test02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String name="張飛";
char sex='男';
short age=35;
//float height=1.99f;
String type="豪放的";
System.out.println("嗨泣懊,大家好!俺叫"+name+"伸辟,今年"+age+"歲,俺是一個"+type+sex+"士");
name="王菲";
sex='女';
age=33;
type="文靜的";
System.out.println("嗨馍刮,大家好!俺叫"+name+"信夫,今年"+age+"歲,俺是一個"+type+sex+"士");
}
}
結(jié)果:
嗨卡啰,大家好!俺叫張飛静稻,今年35歲,俺是一個豪放的男士
嗨匈辱,大家好!俺叫王菲振湾,今年33歲,俺是一個文靜的女士
六亡脸、變量的作用域
- Java用一對大括號作為語句塊的范圍押搪,稱為作用域树酪。
- 作用于中德變量不能重復(fù)定義。
- 離開作用域大州,變量所分配的內(nèi)存空間將被JVM回收续语。
【示例-1】對于以下代碼,若將注釋符號去掉厦画,結(jié)果怎樣绵载?
public static void main(String[] args) {
{
String name="張三";
// String name="張三";
}
}
如果將注釋符號去掉,大括號中將出現(xiàn)兩個完全一樣的變量name苛白,因此娃豹,按照以上介紹的知識點,會出現(xiàn)變量重復(fù)定義的語法錯誤购裙。在程序中懂版,將注釋符號去掉后,會報錯出現(xiàn)紅色波浪線躏率,這是語法錯誤的標(biāo)志躯畴,將光標(biāo)移動到此位置會出現(xiàn)提示,具體見下圖所示:
點擊修改建議薇芝,修改后兩個變量名不一致了蓬抄,就不會有語法錯誤了,下圖所示:
這個案例說明:在同一作用域下變量不能重復(fù)定義夯到。
【示例-2】對于以下代碼嚷缭,第12和第13行是否會有語法錯誤?
在程序中檢驗:
代碼
public class Test03 {
public static void main(String[] args) {
{//語句塊(1)
String name="張三";
System.out.println(name);
}//語句塊(1)結(jié)束
String name="張三";
System.out.println(name);
}
}
運(yùn)行結(jié)果:
張三
張三
程序能夠運(yùn)行出結(jié)果耍贾,證明此代碼是沒有語法錯誤的阅爽。
分析:有兩個變量都叫name,但是第一個name作用域在語句塊(1)中荐开,離開了這個語句塊付翁,語句塊中所有定義的變量所占用的空間都將被Java虛擬機(jī)回收。那么晃听,在語句塊(1)之外百侧,再次定義變量name,就不會出現(xiàn)重復(fù)定義變量的語法錯誤能扒。
【示例-3】對于以下代碼佣渴,將第12行的注釋符號去掉,結(jié)果如何赫粥?
在程序中檢驗:
代碼
public class Test04 {
public static void main(String[] args) {
String name="張三";
System.out.println(name);
{//語句塊(1)
String name="張三";
System.out.println(name);
}//語句塊(1)結(jié)束
}
}
將注釋符號去掉后观话,語句塊(1)中的name報錯,出現(xiàn)語法錯誤的紅色波浪線越平,將光標(biāo)移到報錯位置频蛔,提示重復(fù)的局部變量name灵迫。第一個name的作用域是從main函數(shù)開始到main函數(shù)結(jié)束,在main函數(shù)中再次定義重復(fù)的變量就會出現(xiàn)變量重復(fù)定義的問題晦溪,修改語句塊(1)中的變量名就不會有問題了瀑粥。
七、基本數(shù)據(jù)類型的包裝類
1三圆、概述
Java為基本數(shù)據(jù)類型提供了對應(yīng)的類狞换,這些類稱作包裝類。如下表所示:
包裝類的類型 | 說明 |
---|---|
Byte類 | byte類型的包裝類 |
Short類 | short類型的包裝類 |
Integer類 | int類型的包裝類 |
Long類 | long類型的包裝類 |
Float類 | float類型的包裝類 |
Double類 | double類型的包裝類 |
Character類 | char類型的包裝類 |
Boolean類 | boolean類型的包裝類 |
2舟肉、為什么使用包裝類
- 包裝類中封裝了一些很實用的方法和常量修噪。例如:Byte.MIN_VALUE是Byte類中的一個常量,存放了byte類型數(shù)據(jù)的最小值路媚。
- 包裝類在集合中用來定義集合元素的類型黄琼。
3、包裝類的常用方法和常量
Integer
- Integer.MIN_VALUE:int類型的最小值:-2^31
- Integer.MAX_VALUE:int類型的最大值:2^31-1
- int Integer.parselnt(String sInteger);
作用:將字符串類型的整數(shù)轉(zhuǎn)換為int類型的數(shù)據(jù)整慎。
- String Integer.toBinaryString(int value);
作用:將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制脏款,返回結(jié)果String類型。- String Integer.toHexString(int value);
作用:將十進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制裤园,返回結(jié)果String類型撤师。
Long
- Long.MIN_VALUE:long類型的最小值
- Long.MAX_VALUE:long類型的最大值
- long Long.parseLong(String sLong);
作用:將字符串類型的整數(shù)轉(zhuǎn)換為long類型的數(shù)據(jù)。
- String Long.toBinaryString(long value);
作用:將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制拧揽,返回結(jié)果String類型剃盾。- String Long.toHexString(long value);
作用:將十進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制,返回結(jié)果String類型强法。
Double
- Double.MAX_VALUE:double類型的最大值
- double Double.parseDouble(String sDouble);
作用:將字符串類型的浮點數(shù)轉(zhuǎn)換為double類型的數(shù)據(jù)万俗。
- String Double.toBinaryString(double value);
作用:將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制,返回結(jié)果String類型饮怯。- String Double.toHexString(double value);
作用:將十進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制,返回結(jié)果String類型嚎研。
【示例】
<1> 獲取byte類型的最大蓖墅、最小值,并測試Byte.parseByte方法临扮。
<2>獲取int類型的最大论矾、最小值,并測試Integer.parseInt杆勇、Integer.toBinaryString等方法贪壳。
代碼
public class Test05 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Byte.MIN_VALUE+"~"+Byte.MAX_VALUE);
System.out.println(Byte.parseByte("108")+10);
System.out.println(Integer.MIN_VALUE+"~"+Integer.MAX_VALUE);
System.out.println(Integer.parseInt("50000")+5);
System.out.println(Integer.toBinaryString(16));
System.out.println(Integer.toHexString(16));
}
}
結(jié)果:
-128~127
118
-2147483648~2147483647
50005
10000
10
八、二進(jìn)制補(bǔ)碼
1蚜退、概述
- 計算機(jī)系統(tǒng)的內(nèi)部以二進(jìn)制形式存儲數(shù)據(jù)闰靴。
- 在Java程序中輸入的十進(jìn)制的數(shù)據(jù)都會被自動轉(zhuǎn)換為二進(jìn)制彪笼,Java內(nèi)部也以二進(jìn)制來進(jìn)行數(shù)值運(yùn)算,但返回的結(jié)果是十進(jìn)制蚂且。
2配猫、補(bǔ)碼規(guī)則
- 在計算機(jī)系統(tǒng)中,數(shù)值一律用二進(jìn)制的補(bǔ)碼來存儲杏死。
- 二進(jìn)制的最高位是符號位泵肄,0表示正數(shù),1表示負(fù)數(shù)淑翼。
- 正數(shù)的值是其本身腐巢,負(fù)數(shù)的值是最高位(符號位)不變,其它位逐位取反玄括,再加1系忙。
- 兩數(shù)相加,若最高位(符號位)有進(jìn)位惠豺,則進(jìn)位被舍棄银还。
例如: (1101)2 最高位是1,因此是負(fù)數(shù)
0010 逐位取反
0011 加1
(1101)2 = -3
二進(jìn)制數(shù) | 十進(jìn)制數(shù)補(bǔ)碼 | 十進(jìn)制值 |
---|---|---|
0000 | 0 | 0 |
0001 | +1 | 1 |
0010 | +2 | 2 |
0011 | +3 | 3 |
0100 | +4 | 4 |
0101 | +5 | 5 |
0110 | +6 | 6 |
0111 | +7 | 7 |
1000 | -8 | 8 |
1001 | -7 | 9 |
1010 | -6 | 10 |
1011 | -5 | 11 |
1100 | -4 | 12 |
1101 | -3 | 13 |
1110 | -2 | 14 |
1111 | -1 | 15 |
例如:4位二進(jìn)制補(bǔ)碼中洁墙,5-3的結(jié)果是2
0101 5
+ 1101 -3
————————————————————
0010 2
3蛹疯、為什么使用補(bǔ)碼
- 可以將符號位和其他位統(tǒng)一處理。
- 最高位不再表示數(shù)值热监,而是作為符號位捺弦,正好將數(shù)值折半,即一半是0至正數(shù)孝扛,一半是負(fù)數(shù)列吼。
- 減法也可以按加法來處理。
例如:
(1)4位二進(jìn)制數(shù)共有16個數(shù)苦始,用補(bǔ)碼表示寞钥,則一半是07,一半是-1-8陌选。
(2)8位二進(jìn)制數(shù)共有256個數(shù)理郑,用補(bǔ)碼表示,則一半是0127咨油,一半是-1-128您炉。
例如:7-3 可以表示為7+(-3),二進(jìn)制表示為:
0111 7
+ 1101 -3
————————————————————
0100 4
4役电、補(bǔ)碼運(yùn)算的特征
- 計算機(jī)中正數(shù)和負(fù)數(shù)的關(guān)系是取反加一赚爵。
【示例】在四位二進(jìn)制數(shù)中,已知3的二進(jìn)制值是0011,若要求-3冀膝,則:
0011 3
1100 逐位取反
1101 +1
則-3的二進(jìn)制值是1101唁奢。
- 補(bǔ)碼運(yùn)算是封閉的:運(yùn)算結(jié)果保留在補(bǔ)碼范圍之內(nèi),超范圍就溢出畸写。
【示例】四位二進(jìn)制的補(bǔ)碼運(yùn)算中驮瞧,請計算5+4的結(jié)果:
0101 5
+ 0100 4
————————————————————
1001 -7
- 4位二進(jìn)制補(bǔ)碼最多能表示2^4(16)個數(shù),數(shù)的范圍是-8~7枯芬。
- 8位二進(jìn)制補(bǔ)碼最多能表示2^8(256)個數(shù)论笔,數(shù)的范圍是-128~127。
- 16位二進(jìn)制補(bǔ)碼最多能表示2^16(65536)個數(shù)千所,數(shù)的范圍是-32768~32767狂魔。
- 32位二進(jìn)制補(bǔ)碼最多能表示232個數(shù),數(shù)的范圍是-231~2^31-1淫痰。
5最楷、補(bǔ)碼運(yùn)算的原理
正數(shù)+負(fù)數(shù)=模。
模:某種類型數(shù)據(jù)的總數(shù)待错。
例如:
4位二進(jìn)制數(shù)的模是2^4=16
8位二進(jìn)制數(shù)的模是2^8=256
16位二進(jìn)制數(shù)的模是2^16=65536
32位二進(jìn)制數(shù)的模是2^32
【示例】在4位二進(jìn)制中籽孙,7+(-7) = 16
0111
+ 1001
——————————————
10000
因此,負(fù)數(shù)=模-正數(shù)火俄,這就是逐位取反加1的原因犯建。
-7 = 16 - 7
10000
- 00111
——————————————
01001