文章目錄
1、操作符
我們知道了程序用變量來表示數據,而操作符,顧名思義,就是來操作數據。在由操作符和數據所構成的表達式,被操縱的數據也被稱爲數據元。
優先級 | 操作符分類 | 操作符 |
---|---|---|
由高到低 | 一元操作符 | ! ++ – - ~ |
算術操作符、位操作符 | * / % + - >> << >>> | |
比較操作符 | > < >= <= != == | |
邏輯操作符 | && || % | ^ | |
三元操作符 | 布爾表達式 ? 表達式1: 表達式2 | |
賦值操作符 | = *= += -= /= %= |
1.1 算術操作符
Java的算數操作符與其它大多數程序設計語言都是相同的,其中包括加(+)、減(-)、乘(×)、除(÷)以及取模(%)。
假設:整數變量A的值爲10,變量B的值爲20,如下表:
操作符 | 描述 | 例子 |
---|---|---|
+ | 加法 - 相加運算符兩側的值 | A + B 等於 30 |
- | 減法 - 左操作數減去右操作數 | A – B 等於 -10 |
* | 乘法 - 相乘操作符兩側的值 | A * B等於200 |
/ | 除法 - 左操作數除以右操作數 | B / A等於2 |
% | 取餘 - 左操作數除以右操作數的餘數 | B%A等於0 |
++ | 自增: 操作數的值增加1 | B++ 或 ++B 等於 21 |
– | 自減: 操作數的值減少1 | B-- 或 --B 等於 19 |
注:
- 前綴自增自減法(++a,–a): 先進行自增或者自減運算,再進行表達式運算;
- 後綴自增自減法(a++,a–): 先進行表達式運算,再進行自增或者自減運算;
1.2 比較運算符
假設:整數變量A的值爲10,變量B的值爲20
操作符 | 描述 | 例子 |
---|---|---|
== | 檢查如果兩個操作數的值是否相等,如果相等則條件爲真。 | (A == B)爲假。 |
!= | 檢查如果兩個操作數的值是否相等,如果值不相等則條件爲真。 | (A != B) 爲真。 |
> | 檢查左操作數的值是否大於右操作數的值,如果是那麼條件爲真。 | (A> B)爲假。 |
< | 檢查左操作數的值是否小於右操作數的值,如果是那麼條件爲真。 | (A <B)爲真。 |
>= | 檢查左操作數的值是否大於或等於右操作數的值,如果是那麼條件爲真。 | (A> = B)爲假。 |
<= | 檢查左操作數的值是否小於或等於右操作數的值,如果是那麼條件爲真。 | (A <= B)爲真。 |
1.3 位運算符
假設:整數變量A的值爲60,變量B的值爲13
操作符 | 描述 | 例子 |
---|---|---|
& | 如果相對應位都是1,則結果爲1,否則爲0 | (A&B),得到12,即0000 1100 |
| | 如果相對應位都是0,則結果爲0,否則爲1 | (A | B)得到61,即 0011 1101 |
^ | 如果相對應位值相同,則結果爲0,否則爲1 | (A ^ B)得到49,即 0011 0001 |
~ | 按位取反運算符翻轉操作數的每一位,即0變成1,1變成0。 | (~A)得到-61,即1100 0011 |
<< | 按位左移運算符。左操作數按位左移右操作數指定的位數。 | A << 2得到240,即 1111 0000 |
>> | 按位右移運算符。左操作數按位右移右操作數指定的位數。 | A >> 2得到15即 1111 |
>>> | 按位右移補零操作符。左操作數的值按右操作數指定的位數右移,移動得到的空位以零填充。 | A>>>2得到15即0000 1111 |
1.4 邏輯運算符
假設:布爾變量A爲真,變量B爲假
操作符 | 描述 | 例子 |
---|---|---|
&& | 稱爲邏輯與運算符。當且僅當兩個操作數都爲真,條件才爲真。 | (A && B)爲假。 |
| | | 稱爲邏輯或操作符。如果任何兩個操作數任何一個爲真,條件爲真。 | (A | | B)爲真。 |
! | 稱爲邏輯非運算符。用來反轉操作數的邏輯狀態。如果條件爲true,則邏輯非運算符將得到false。 | !(A && B)爲真。 |
補充:
邏輯運算符包含短路邏輯運算,即左邊條件如果成立,則表示該語句條件“成立”,不繼續執行後續判斷。
1.5 三元運算符
三元運算符,又稱條件運算符。
格式如下:
# ?前爲表達式,如果表達式返回結果爲true,則x賦值爲:前的值,false則x賦值爲:後的值
variable x = (expression) ? value if true : value if false
# eg
int age = 23;
String name = (age == 23) ? "bboyhan": "BBOYHAN";
System.out.println(name);
1.6 運算轉換
Java規定,在執行數據的操作運算,必須是同一數據類型。如整型只能和整型進行+操作,我們知道了Java的8大基本數據類型定義了不同數值範圍的數據。Java定義了若干使用於表達式的類型提升規則。
- byte、short、char類型的數據在進行運算時將自動轉化爲int類型;
- 如果其中一個操作數是float類型,另一個將轉換爲float類型;
- 如果其中一個操作數是long類型,另一個將轉換爲long類型;
- boolean類型與其他基本類型不能進行類型的轉換(既不能進行自動類型的提升,也不能強制類型轉換),否則,將編譯出錯。
在運算過程中,由低字節向高字節自動轉換(正向過程),Java會自行處理。
但由高字節需要向低字節轉換(逆向過程),需要使用強制轉換(可能丟失精度)。需要注意的一點是:在強制類型轉換中目標類型和源類型變量的類型始終沒有發生改變。
int a=(int)3.14;
提問:float類型能否與long類型進行自動轉換?
答:能,float能表示的數的範圍比long大,一個long型數可以轉爲float型。
- long類型,取值範圍是-2^63 --> 2^63-1(-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807)
- float類型,取值範圍是2^(-149) --> (2-2(-23))*2127,也就是Float.MIN_VALUE和Float.MAX_VALUE
任何一個long類型的數字都可以使用float類型的表示方法來表示。但是,由於float有精度限制,所以在轉換的過程中有可能丟失精度
float內存存儲原理
在IEEE標準754中,float浮點數分爲三部分組成:
- 符號位(S),0表示正數,1表示負數。翻轉該位的值會翻轉該數字的符號。
- 指數位(E),指數字段需要表示正指數和負指數。
- 尾部(F),也被稱爲有效數,代表數字的精度的位。
Sign | Exponent | Fraction | |
---|---|---|---|
單精度,Single Precision | 1 [31] | 8 [30–23] | [22–00] |
雙精度,Double Precision | 1 [63] | 11 [62–52] | 52 [51–00] |
Laid out as bits, floating point numbers look like this:
Single: SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF
Double: SEEEEEEE EEEEFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
2、流程控制
現實生活中,不論是日常事務還是生產工序,都會按照特定的流程進行運轉。在Java當中,同樣地可以通過特定的語句進行相應的流程控制。
2.1 分支語句
(一)if else
if…else…語句,布爾表達式的值爲true時,執行if代碼塊,爲false時,執行else代碼塊。
if(布爾表達式){
//...
}else{
//...
}
int x = 1;
if(x == 1){
System.out.println("x 等於 1,執行這句")
}else{
System.out.println("x 不等於 1,執行這句")
}
多個條件的情況,可以在中間插入 else if(布爾表達式)。
int x = 1;
if(x < 1){
System.out.println("x 小於 1,執行這句")
}else if (x == 1){
System.out.println("x 等於 1,執行這句")
}else{
System.out.println("否則,執行這句")
}
(二)switch
switch case 語句判斷一個變量與一系列值中某個值是否相等,每個值稱爲一個分支。
switch(expression){
case value :
//代碼
break; //可選,不寫相當於會繼續執行下方的case判斷
case value :
//代碼
break; //可選
//你可以有任意數量的case語句
default : //可選
//...
}
int age = 23;
switch(age){
case 18 :
System.out.println("age 等於 18,執行,有break,結束")
break;
case 23 :
System.out.println("age 等於 23,執行")
//break; //沒break,繼續往下執行
default :
System.out.println("其它情況,執行")
}
switch 語句中的變量類型可以是: byte、short、int、char、String、Enum類型,同時 case 標籤必須爲字符串常量或字面量。
2.2 循環語句
(一)while、do…while
while( 布爾表達式 ) {
//...
}
# eg
int x = 10;
while( x < 20 ) {
System.out.print("value of x : " + x );
x++;
System.out.print("\n");
}
do {
//...
}while( 布爾表達式 );
# eg
int x = 10;
do{
System.out.print("value of x : " + x );
x++;
System.out.print("\n");
}while( x < 20 );
(二)for
形式一:
for(初始化; 布爾表達式; 更新) {
//...
}
# eg
int[] intList = {1, 2, 3, 4};
//遍歷
for (int j = 0; j < intList.length; j++) {
int i = intList[j];
System.out.println(i);
}
形式二:
# for (循環變量類型 循環變量名稱 : 要被遍歷的對象) 循環體
/* 建立一個數組 */
int[] intList = {1, 2, 3, 4};
/* 開始遍歷 */
for (int i : intList) {
System.out.println(i);
}
2.3 流程跳轉
語句 | 說明 |
---|---|
break | 終止循環 |
continue | 跳過本次(當前)循環 |
return | 退出本方法,跳至上層調用方法 |
# eg
int[] intList = {1, 2, 3, 4};
//遍歷
for (int j = 0; j < intList.length; j++) {
int i = intList[j];
if(i == 1){
continue; //跳出本次循環,不打印1
}
System.out.println(i);
}
# eg
int[] intList = {1, 2, 3, 4};
//遍歷
for (int j = 0; j < intList.length; j++) {
int i = intList[j];
if(i == 2){
break; //終止循環,不再執行
}
System.out.println(i);
}
# 擴展
int[] intList = {1, 2, 3, 4};
//遍歷
A:for (int j = 0; j < intList.length; j++) {
int i = intList[j];
if(i == 2){
break A; //跳至A,A可任意命名
}
System.out.println(i);
}