運算符指明對操作數(shù)的運算方式泥张。組成表達式的Java有很多種。運算符按照其要求的操作數(shù)數(shù)目來分,可以有一元(單目)運算符默刚,二元(雙目)運算符和三元(三目)運算符,它們分別對應(yīng)于1個逃魄、2個荤西、3個操作數(shù)。運算符按其功能來分,有算術(shù)運算符皂冰、賦值運算符店展、關(guān)系運算符、邏輯運算符秃流、位運算符和其他運算符赂蕴。
下圖表示運算符的優(yōu)先級和結(jié)合性。
注:結(jié)合性的左表示先算符號的左半部分舶胀,例如:1+2+3 按照先后應(yīng)該是(1+2)+3概说,右就表示先算符號的右半部分。
算數(shù)運算符( +嚣伐、-糖赔、*、/放典、%基茵、++拱层、 --)
算數(shù)運算符和平時在數(shù)學(xué)中的應(yīng)用基本一致根灯。
/**
* 算數(shù)運算符 測試
*/
private static void arithmeticOperator() {
int a = 102;
int b = 5;
int sum = a + b; //兩數(shù)之和
int difference = a - b; //兩數(shù)之差
int product = a * b; //兩數(shù)之積
int quotient = a / b; //兩數(shù)之商的整數(shù)部分
int remainder = a % b; //余數(shù): a - b*(a/b)
int c = a++; //a 放在++之前表示 c 先取到a原來的值,之后a自增1,此時a = 103
int d = ++a; //a 放在++之后表示 a先自增1,即103+1=104,之后d取到現(xiàn)在a的值.
System.out.println("a + b =" + sum);
System.out.println("a - b =" + difference);
System.out.println("a * b =" + product);
System.out.println("a / b =" + quotient);
System.out.println("a % b =" + remainder);
System.out.println("a++ 的值" + c);
System.out.println("++a 的值" + d);
}
關(guān)系運算符(==、!=桃笙、<怎栽、>熏瞄、<=强饮、>=)
關(guān)系運算符用于比較兩個數(shù)值之間的大小,其運算結(jié)果為一個邏輯類型(boolean布爾類型)的數(shù)值行您。
/**
* 關(guān)系運算符 測試
*/
private static void relationalOperator() {
int a = 100;
int b = 50;
System.out.println("a 等于 b :" + (a == b));
System.out.println("a 不等于b:" + (a != b));
System.out.println("a 小于 b :" + (a < b));
System.out.println("a 大于 b :" + (a > b));
System.out.println("a 不小于b:" + (a >= b));
System.out.println("a 不大于b:" + (a <= b));
//注意: 當(dāng) == 在比較對象時,比較的是對象的內(nèi)存地址,而不是對象的屬性和值
String s = "hello";
String str = "hello";
String s1 = new String(s);
String s2 = new String(s);
System.out.println("s 等于 str:" + (s == str)); //true, 如果String緩沖池內(nèi)存在與其指定值相同的String對象娃循,
// 那么此時虛擬機將不為此創(chuàng)建新的String對象,而直接返回已存在的String對象的引用,和基本類型數(shù)據(jù)相似
System.out.println("s1 等于 s2 :" + (s1 == s2));//false ,s1和s2是String兩個不同的對象.
System.out.println(" s 等于 s1 :" + (s == s1)); //false ,s == str != s1 != s2
}
注:"=="習(xí)慣用于原生(primitive)類型之間的比較,當(dāng)== 用于對象之間的比較時,比較的是對象的內(nèi)存地址
邏輯運算符(&、| 捞蚂、!姓迅、 ^丁存、 &&柱嫌、 ||)
邏輯運算符要求操作數(shù)的數(shù)據(jù)類型為布爾型编丘,其運算結(jié)果也是布爾型嘉抓。
需要注意的是:
- 異或 ^ :兩邊相同時為flase,兩邊不同時為true杨赤;
- & | 和 && ||的區(qū)別:& 和 && 都表示"與"疾牲,只是&&具有短路的功能植捎,也就是所當(dāng) && 左邊為false時就跳過右邊的判斷,不管右邊是什么結(jié)果都為false焰枢,減少計算機的開支;和&&類似济锄,當(dāng)||的左邊為true時暑椰,不管右邊是true還是false,結(jié)果都為true一汽。在編程時,建議使用&& 和|| 進行判斷操作低滩。
位運算符(&角虫、|委造、^、~枫虏、>>隶债、<<死讹、>>>)
位運算是以二進制位為單位進行的運算曲梗,其操作數(shù)和運算結(jié)果都是整型值虏两。
注意:
- 0&1 = 0, 1&1 = 1 只有兩邊都是1結(jié)果才是1;
- 0|1 = 1, 0|0 = 0 只有兩邊都是0結(jié)果才是0愧旦;
- 0^0 = 0, 1^1 = 0 , 0^1 = 1, 1^0 = 1;
- ~0 = 1,~1 = 0;
- ">>" 是有符號的,即當(dāng) >>左邊的數(shù)是正數(shù)時定罢,缺失位用0填笤虫,>>左操作數(shù)是負(fù)數(shù)時,缺失位用1填祖凫。
- << 和 >>>是無符號的琼蚯,即 << 和>>>左操作數(shù)無論正負(fù),缺失位都要用0填惠况;
/**
* 位運算符 測試
*/
private static void bitOperator() {
int a = 56;
int b = 78;
String aStr = Integer.toBinaryString(a); //a 轉(zhuǎn)為二進制是:0b0000_0000_0000_0000_0000_0000_0011_1000
String bStr = Integer.toBinaryString(b); //b 轉(zhuǎn)為二進制是:0b0000_0000_0000_0000_0000_0000_0100_1110
int and = a & b; //將a和b的二進制數(shù)同位進行&計算遭庶,and = 0b0000_0000_0000_0000_0000_0000_0000_1000
int or = a | b; //將a和b的二進制數(shù)同位進行|計算,or = 0b0000_0000_0000_0000_0000_0000_0111_1110
int xor = a ^ b; //將a和b的二進制數(shù)同為進行^計算售滤,xor = 0b0000_0000_0000_0000_0000_0000_0111_0110
int not = ~a; //將a的二進制數(shù)進行~計算罚拟, not = 0b1111_1111_1111_1111_1111_1111_1100_0111
//注意:這里看出求int的二進制負(fù)數(shù)其實就是 其絕對值減1后二進制進行~計算台诗。
//eg. a=50, 那么求-50的二進制數(shù),先將50-1=49赐俗, -50的二進制就是 ~49
System.out.println("a 的二進制表示是:" + aStr);
System.out.println("b 的二進制表示是:" + bStr);
System.out.println("a & b 的結(jié)果是:" + and);
System.out.println("a | b 的結(jié)果是:" + or);
System.out.println("a ^ b 的結(jié)果是:" + xor);
System.out.println("~a 的結(jié)果是:" + not);
int b1 = 115; //b1 的二進制數(shù)是: 0b0000_0000_0000_0000_0000_0000_0111_0011
int b2 = -7; //b2 的二進制數(shù)是: 0b1111_1111_1111_1111_1111_1111_1111_1001
int b1_left_2 = b1 << 2; // 將b1左移2位末尾兩位用0填上得 0b0000_0000_0000_0000_0000_0001_1100_1100 (460)
int b1_right_2 = b1 >> 2; // 將b1右移2位開頭用0填上得 0b0000_0000_0000_0000_0000_0000_0001_1100 (28)
int b2_left_2 = b2 << 2; // 將b2左移2位末尾兩位用0填上得 0b1111_1111_1111_1111_1111_1111_1110_0100 (-28)
int b2_right_2 = b2 >> 2; // 將b2右移2位來頭兩位用1填上得 0b1111_1111_1111_1111_1111_1111_1111_1110 (-2)
//注意:>> 是有符號的拉队,即當(dāng) >>左邊的數(shù)是正數(shù)時,缺失位用0填阻逮,>>左操作數(shù)是負(fù)數(shù)時粱快,缺失位用1填。
// << 是無符號的叔扼,即 << 左操作數(shù)無論正負(fù)事哭,缺失位都要用0填;
// 與 << 相對應(yīng)的是 無符號右移 >>>, 其缺失位也全都用0填瓜富。
int b1_right_2_no_sign = b1 >>> 2; // 將b1右移2位開頭用0填上得 0b0000_0000_0000_0000_0000_0000_0001_1100 (28)
int b2_right_2_no_sign = b2 >>> 2; // 將b2右移2位開頭用0填上得 0b0011_1111_1111_1111_1111_1111_1111_1110 (103740822)
System.out.println("b1 左移2位得:" + b1_left_2);
System.out.println("b1 右移2位得:" + b1_right_2);
System.out.println("b2 左移2位得:" + b2_left_2);
System.out.println("b2 右移2位得:" + b2_right_2);
System.out.println("b1 無符號右移2位得:" + b1_right_2_no_sign);
System.out.println("b2 無符號右移2位得:" + b2_right_2_no_sign);
}
賦值運算符
賦值運算符是 "=" 與二元算術(shù)運算符鳍咱、邏輯運算符和位運算符組合成簡捷運算符,從而可以簡化一些常用表達式的書寫与柑。
其他運算符
三元運算符
三元運算符是軟件編程中的一個固定格式谤辜,語法是“條件表達式?表達式1:表達式2”价捧。
當(dāng)條件表達式為true時丑念,結(jié)果 “表達式1”,條件為false時结蟋,結(jié)果是“表達式2”
三元運算符可以簡化if else的書寫脯倚。
String isLate = "";
if(new Date().getHours() > 9){
isLate = "遲到了";
}else{
isLate = "沒遲到";
}
System.out.println(isLate);
可以簡寫成
String isLate = new Date().getHours() > 9 ? "遲到了" : "沒遲到";
System.out.println(isLate);