运算符指明对操作数的运算方式。组成表达式的Java有很多种。运算符按照其要求的操作数数目来分,可以有一元(单目)运算符,二元(双目)运算符和三元(三目)运算符,它们分别对应于1个、2个、3个操作数。运算符按其功能来分,有算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符和其他运算符。
下图表示运算符的优先级和结合性。
注:结合性的左表示先算符号的左半部分,例如:1+2+3 按照先后应该是(1+2)+3,右就表示先算符号的右半部分。
算数运算符( +、-、*、/、%、++、 --)
算数运算符和平时在数学中的应用基本一致。
/**
* 算数运算符 测试
*/
private static void arithmeticOperator() {
int a = 102;
int b = 5;
int sum = a + b; //两数之和
int difference = a - b; //两数之差
int product = a * b; //两数之积
int quotient = a / b; //两数之商的整数部分
int remainder = a % b; //余数: a - b*(a/b)
int c = a++; //a 放在++之前表示 c 先取到a原来的值,之后a自增1,此时a = 103
int d = ++a; //a 放在++之后表示 a先自增1,即103+1=104,之后d取到现在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);
}
关系运算符(==、!=、<、>、<=、>=)
关系运算符用于比较两个数值之间的大小,其运算结果为一个逻辑类型(boolean布尔类型)的数值。
/**
* 关系运算符 测试
*/
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));
//注意: 当 == 在比较对象时,比较的是对象的内存地址,而不是对象的属性和值
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缓冲池内存在与其指定值相同的String对象,
// 那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用,和基本类型数据相似
System.out.println("s1 等于 s2 :" + (s1 == s2));//false ,s1和s2是String两个不同的对象.
System.out.println(" s 等于 s1 :" + (s == s1)); //false ,s == str != s1 != s2
}
注:"=="习惯用于原生(primitive)类型之间的比较,当== 用于对象之间的比较时,比较的是对象的内存地址
逻辑运算符(&、| 、!、 ^、 &&、 ||)
逻辑运算符要求操作数的数据类型为布尔型,其运算结果也是布尔型。
需要注意的是:
- 异或 ^ :两边相同时为flase,两边不同时为true;
- & | 和 && ||的区别:& 和 && 都表示"与",只是&&具有短路的功能,也就是所当 && 左边为false时就跳过右边的判断,不管右边是什么结果都为false,减少计算机的开支;和&&类似,当||的左边为true时,不管右边是true还是false,结果都为true。在编程时,建议使用&& 和|| 进行判断操作。
位运算符(&、|、^、~、>>、<<、>>>)
位运算是以二进制位为单位进行的运算,其操作数和运算结果都是整型值。
注意:
- 0&1 = 0, 1&1 = 1 只有两边都是1结果才是1;
- 0|1 = 1, 0|0 = 0 只有两边都是0结果才是0;
- 0^0 = 0, 1^1 = 0 , 0^1 = 1, 1^0 = 1;
- ~0 = 1,~1 = 0;
- ">>" 是有符号的,即当 >>左边的数是正数时,缺失位用0填,>>左操作数是负数时,缺失位用1填。
- << 和 >>>是无符号的,即 << 和>>>左操作数无论正负,缺失位都要用0填;
/**
* 位运算符 测试
*/
private static void bitOperator() {
int a = 56;
int b = 78;
String aStr = Integer.toBinaryString(a); //a 转为二进制是:0b0000_0000_0000_0000_0000_0000_0011_1000
String bStr = Integer.toBinaryString(b); //b 转为二进制是:0b0000_0000_0000_0000_0000_0000_0100_1110
int and = a & b; //将a和b的二进制数同位进行&计算,and = 0b0000_0000_0000_0000_0000_0000_0000_1000
int or = a | b; //将a和b的二进制数同位进行|计算,or = 0b0000_0000_0000_0000_0000_0000_0111_1110
int xor = a ^ b; //将a和b的二进制数同为进行^计算,xor = 0b0000_0000_0000_0000_0000_0000_0111_0110
int not = ~a; //将a的二进制数进行~计算, not = 0b1111_1111_1111_1111_1111_1111_1100_0111
//注意:这里看出求int的二进制负数其实就是 其绝对值减1后二进制进行~计算。
//eg. a=50, 那么求-50的二进制数,先将50-1=49, -50的二进制就是 ~49
System.out.println("a 的二进制表示是:" + aStr);
System.out.println("b 的二进制表示是:" + bStr);
System.out.println("a & b 的结果是:" + and);
System.out.println("a | b 的结果是:" + or);
System.out.println("a ^ b 的结果是:" + xor);
System.out.println("~a 的结果是:" + not);
int b1 = 115; //b1 的二进制数是: 0b0000_0000_0000_0000_0000_0000_0111_0011
int b2 = -7; //b2 的二进制数是: 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)
//注意:>> 是有符号的,即当 >>左边的数是正数时,缺失位用0填,>>左操作数是负数时,缺失位用1填。
// << 是无符号的,即 << 左操作数无论正负,缺失位都要用0填;
// 与 << 相对应的是 无符号右移 >>>, 其缺失位也全都用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);
}
赋值运算符
赋值运算符是 "=" 与二元算术运算符、逻辑运算符和位运算符组合成简捷运算符,从而可以简化一些常用表达式的书写。
其他运算符
三元运算符
三元运算符是软件编程中的一个固定格式,语法是“条件表达式?表达式1:表达式2”。
当条件表达式为true时,结果 “表达式1”,条件为false时,结果是“表达式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);