Java基本資料型別+運算子
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
運算子優先順序的問題
- 不需要去刻意的記住他,表示式裡面優先使用小括號來組織!!