Java的基本數據類型
Java是一種強類型語言,每個變量都必須先聲明其類型再使用。
一、整數類型
類型 | 佔用存儲空間 | 表述範圍 |
---|---|---|
byte | 1字節 | -128~127 |
short | 2字節 | -2^15~2^15-1(-32768-32767) |
int(integer) | 4字節 | -2^31~2^31-1(約2億) |
long | 8字節 | -2^63~2^63-1 |
2^16=65536
比long還大的整數用BigInteger
1. 整數常數的三種表示形式
十進制
- 一般生活中常用十進制
八進制
- 以0開頭(1,2,3,4,5,6,7)
十六進制
- 以0x開頭(1~9,a,b,c,d,e,f)
進制轉換
Integer.toBinaryString() //轉換爲2進制字符串
Integer.toOctalString() //轉換爲8進制字符串
Integer.toHexString() //轉換爲16進制字符串
2. 整數常數默認類型
Java語言整數常數默認爲int型,如果賦值時數據的大小沒有超過byte/short/char的表述範圍,可以自動轉型。
聲明long型常量可以在後面加”l”或”L”,一般加”L”,小寫容易誤認爲是數字1。
二、浮點類型
類型 | 佔用存儲空間 | 表述範圍 |
---|---|---|
float | 4字節 | -3.403E38~3.403E38 |
double | 8字節 | -1.798E308~1.798E308 |
float 單精度浮點型,尾數可以精確到7位有效數字
double 雙精度浮點型,數值精度爲float的兩倍;
絕大部分應用程序都用double類型。
1. 浮點類型常量的兩種表示形式
十進制
3.14
314.0
0.314科學計數法
314E2:314*10^2->31400
314e2 : 314*10^2->31400
314E-2:314*10^-2->3.14
2. 浮點常數默認類型
- 浮點類型常數默認類型爲double型,若要將其賦給float類型需要在後面加F/f
3. 浮點數誤差問題
- 浮點數存在舍入誤差,很多數不能精確表示,最好避免使用浮點數
- 如果要不產生舍入誤差的精確數字計算可以使用BigDecimal。
Float f=0.1f;
Double d=1.0/10;
System.out.println(f==d);//Flase
三、字符型(char|2個字節)
單引號用來表示一個字符常量:如’A’是一個字符,它與”A”不同,”A”表示含有一個字符的字符串。
char類型內部採用Unicode編碼表中的字符(Unicode:2,0~65535)
char是在0~65535的範圍,運算時直接當做整數來運算,也可以把0~65535之間的整數直接轉型爲char(在整數前面用(char)強制類型轉換)
Java中還允許使用轉義字符’\’來將其後面的字符轉變爲其他含義:
\b: 退格
\n: 換行
\r : 回車
\t : 製表符(Tab)
\’ :單引號
\” :雙引號
\\:反斜槓
小例子(循環打印A~Z)
public class TestCharType
{
public static void main(String args)
{
char c1='A';
for(int i=0;i<26;i++)
{
char Temp=(char)(c1+i);
System.out.print("\t"+Temp);
}
}
}
ASCII碼錶:ASCII碼對照表
四、布爾型(boolean|不是一個字節是一位)
有兩個值:True 和 False
用來判斷邏輯條件,一般用於程序流程的控制
五、基本數據類型自動轉換強制轉型類型提升問題
- 自動類型轉換
- 容量小的數據類型可以自動轉換爲容量大的數據類型;
- 容量指的是表數範圍而不是字節數;
圖中,黑色實線箭頭表示無數據丟失的自動類型轉換,而紅色虛線在轉換時可能存在數據丟失。
特例:
可以將整型常量直接賦值給byte、short、char等類型變量,而不需要進行強制類型轉換,只要不超過其表數範圍。
強制類型轉換
用於顯式的轉換一個數值的類型
當將一種類型強制轉換爲另一種類型而又超出了目標類型的表數範圍,就會被截斷成爲一個完全不同的值,無意義的值!
強制類型轉換:(轉換類型)轉換的變量 例:(char)(a+2)
表達式中類型提升問題
- 在混合多種數據類型的表達式中,類型會向容量大的值的數據類型提升
自動類型轉換中的值溢出問題
int money=100000000;
int years=20;
long total=money*years;
//返回的是負數,因爲money和years都是int類型,相乘也爲int,但其值超過了int的表數範圍,所以溢出。
//錯誤修改
long total=(long)(money*years);
//正確修改
long total=(long)money*years;
//算一個人70年心跳多少次
long times=70*60*24*356*70;//溢出
//一般我們優先對第一個數進行類型轉換(可能前面就已經溢出)
long times=70L*60*24*365*70;
運算符
- 算術運算符: +,-,*,/,%(取餘數),++,- -
- 賦值運算符 =
- 關係運算符: >,<,>=,<=,==,!= instanceof
- 邏輯運算符: &&,||,!
- 位運算符: &,|,^,~ , >>,<<,>>> (瞭解!!!)
- 條件運算符 ?:
- 擴展賦值運算符:+=,-=,*=,/=
1. 算數運算符
整數運算:
- 如果兩個操作數有一個爲long, 則結果也爲long
- 沒有long時,結果爲int。即使操作數全爲shot、byte結果也是int.
浮點運算:
- 如果兩個操作數有一個爲double, 則結果爲double.
- 只有兩個操作數都是float, 則結果才爲float.
取模運算
其操作數可以爲浮點數,一般使用整數。如:5.9%3.9=2.000000004
要點:
- 負數%負數=負數;
- 負數%正數=負數;
- 正數%負數=正數;
- 注:一般都是正整數運算,不用考慮這麼細!
一元運算符(++, - -)
int a = 3;
int b = a++; //執行完後,b=3。先給b賦值,再自增。
int c = ++a; //執行完後,c=5。先自增,再給c賦值
注意:
//java中的乘冪處理:
int a = 3^2; //java中不能這麼處理, ^是異或符號。
double b = Math.pow(3, 2);
//Math類提供了很多科學和工程計算需要的方法和常數。
2. 邏輯運算符
- 邏輯與:&& 和 &, 邏輯或:|| 和 |, 邏輯非:!。
- 邏輯與和邏輯或採用短路的方式。從左到右計算,如果確定值則不會再計算下去。
- 邏輯與只要有一個爲false, 則直接返回false.
- 邏輯或只要有一個爲true, 則直接返回true;
- boolean c =1>2&&2>(3/0); (除數爲0編譯能通過,執行是拋出異常)
3. 位運算符
~--取反(注意符號問題)
&--按位與
|-- 按位或
^-- 按位異或
0 1 0 1
1 0 0 1
- - - -
1 1 0 0
<<:左移運算符 //左移一位相當於乘2
>>:右移運算符 //右移一位相當於除2取商。
>>>:無符號移位運算符
int a = 3*2*2;
int b = 3<<2; //相當於:3*2*2;
int a = 12/2/2;
int b = 12>>2;
4. 三目條件運算符
三目條件運算符,語法格式:x ? y : z
- 其中 x 爲 boolean 類型表達式,
- 先計算 x 的值,若爲true,則整個三目運算的結果爲表達式 y 的值,
- 否則整個運算結果爲表達式 z 的值。
int score = 80;
int x = -100;
String type = score < 60 ? "不及格" : "及格";
int flag = x > 0 ? 1 : (x == 0 ? 0 : -1);
System.out.println("type= " + type);
System.out.println("flag= "+ flag);
5. 擴展運算符
6. 字符串連接符
- “+”運算符兩側的操作數中只要有一個是字符串(String)類型,系統會自動將另一個操作數轉換爲字符串然後再進行連接。
int c = 12;
System.out.println("c=" + c); //c12
運算符優先級的問題
- 不需要去刻意的記住他,表達式裏面優先使用小括號來組織!!