自增運算符和自減運算符
因爲運算符改變了變量的值,所以它的操作數不能是數值。例如,4++就是一條非法語句。
int m =7;
int n = 7;
int a = 2 * ++m; // now a is 16, m is 8
int b = 2 * n++; // now b is 14, n is 8
建議不要在其他表達式的內部使用++,這樣編寫很容易令人困惑,並也很容易會產生bug。
關係運算符與boolean運算符
&&和||是按照“短路”的方式來求值的。如果第一個操作數已經能夠確定表達式的值,那麼就不必再計算第二個操作數了。這樣的方法不僅稍微加快了運行速度,同時也可以避免一些錯誤的發生。例如:
(x != 0) && (1 / x > x + y) //no division by 0
當x爲0時,不會計算第二部分。如果x爲0,1/x不會被計算,就不會出現除以0的錯誤。
重難點:位運算符
位運算符不按“短路”方法來運算。在得到結果之前,一定要計算兩個操作數的值。
(^) 邏輯異或 二進制同位對比,不同時結果才爲1
(~) 邏輯非 1變0,0變1
(<<) 左移 二進制有效位全部向左移制定位數
(>>) 右移 二進制有效位全部向右移制定位數
(>>>) 按位右移補零操作符 二進制有效位全部向右移指定位數,同時即使無效位也要用0補上。
warning:對移位運算符右側的參數需要進行模32的運算(如果左邊操作數是long類型,那麼要對右側操作數模64)。例如,1 << 35 與 1 << 3 或 8 是相同的。
數學函數與常量
Math類,包含各種各樣的數學函數。
想要計算一個數值的平方根,可以使用sqrt方法:
double y = Math.sqrt(4);
在Java中,沒有冪運算,因此要用到Math的pow方法:
double y = Math.pow(x, a);
y的值爲x的a次冪(x^a)
Math類提供了一些常用的三角函數:
Math.sin
Math.cos
Math.tan
Math.atan
Math.atan2
還有指數函數以及它的反函數——自然對數以及以10爲底的對數:
Math.exp
Math.log
Math.log10
還提供了兩個用於表示π和е常量的近似值:
Math.PI
Math.E
不必在數學方法名和常量名前添加前綴“Math.”,只要在源文件的頂部加上下面的這段代碼就可以了:
import static java.lang.Math.*;
數值類型之間的轉換
在上圖,藍色箭頭表示沒有信息的丟失;而三個紫色粗線的箭頭,表示有可能有精度損失的轉換。例如:
int n = 123456789;
float f = n;//f值爲1.234567892E8
當使用上面兩個數值進行二元操作時(例如 n+f , n是整數,f是浮點數),先要將兩個操作數轉換爲同一種類型,然後再進行計算。
○ 如果兩個操作數中有一個是double類型,另一個操作數就會轉換爲double類型;
○ 否則,如果其中一個操作數是float類型,另一個操作數將會轉換爲float類型;
○ 否則,如果其中一個操作數是long類型,另一個操作數將會轉換爲long類型。
○ 否則,兩個操作數都將被轉換爲int類型。
重難點:強制類型轉換
如果想對浮點數進行舍入運算,那就需要使用Math.round方法。
double x = 9.997;
int nx = (int)Math.round(x);
使用強制類型轉換的原因是因爲Math.round()方法返回的結果是一個long類型,存在信息丟失的可能。
warning:如果試圖將一個數值進行強制轉換,而又超出了目標類型的表示範圍,結果就會截斷成爲一個完全不同的值。例如,(byte)300的實際值爲44。
重點:括號與運算符級別
表達式 a += b += c
等價於 a += (b += c)
因爲 += 是右邊結合運算符
右結合運算符有
! ~ ++ – + - ()(強制類型轉換)
?: = ((+ / - / * / / / % / & / | / ^ / << / >> / >>>)=)
枚舉類型
自定義枚舉類型
enum Size {SMALL, MEDIUM, LARGE, EXTRA_LARGE};
然後,可以聲明這種變量:
Size s = Size.MEDIUM;
Size類型的變量只能存儲在這個類型聲明中給定的某個枚舉值,或者null值。
<———————————————–>
From–《Java核心技術卷·I》