1.算术运算符
(1)
System.out.println(1+2+3+"hello"+1+2+3); //输出6hello123,非6hello6或123hello123
原因:*每次运算时都是一次从左到右依次取两个数据运算;
*任何类型的数据与字符串连接,结果是字符串类型的数据,即当运算到6hello+1+2+3时,"6hello"为字符串类型。
(2)
System.out.println(10%3); //1 System.out.println(10%-3); //1 System.out.println(-10%3); //-1 System.out.println(-10%-3); //-1
原因:java取模运算中,结果的正负号取决于被除数。
(3)自增自减
int a,b;
前自增:a = 2; b=++a; //a=3,b=3 (先自增,再使用)
后自增:a = 2; b=a++; //a=3,b=2 (先使用,再自增)不完全正确,便于理解
自减同理。
int i = 0; i = i++; System.out.println('i='+i); //输出i=0
后自增咋JVM中的运行原理:因为后自增要使用到没有+1之前的值,那么jvm会先声明一个变量用于保存没有+1之前的值
上面代码可分为三步:
1* int temp = i; //声明一个临时变量用于记录i没有加1之前的值
2* 自增 i = i + 1; i = 1;
3* return temp; //将temp作为表达式(i++)的结果
2.赋值运算符
byte b1 = 1; byte b2 = 2; //b2 = b1 + b2; //报错,需要强制类型转换 b2 += b1; //对,因为使用'+='符号在编译时,java编译器会自动进行强制类型转换
3.比较运算符
(1)==在比较两个引用数据类型变量时,比较的是两个变量的内存地址是否相同。
(2)使用比较运算符的时候,要求两种数据类型必须一致。 byte、short、char 会自动提升至int;
当两个不同数据类型的数据不兼容时,会报错(例如boolean与int)。
(3)Instanceof 检查是否是类的对象
例:"hello"instanceof String //true
4.逻辑运算符
(1)^ 异或
两边相同结果是false; 两边不同结果是true。
(2)&& (短路与)
只有两边全为真的时候,结果才为真(同&),
当左边为假的时候就没有必要在进行判断,所以&& 比& 效率稍微高了一点。
(3)|| (短路或)
只要一边为真的时候,结果就为真(同|),
当左边为真的时候就没有必要在进行判断,所以 || 比 | 效率稍微高了一点。
5.位运算符(&、|、^、~)直接操作二进制位
(1)
System.out.println(6&3); //2
0110 //6
& 0011 //3
.......................................
0010 //2
(2)~:取反,将1变成0,或将0变成1
(3)^:异或
规律:如果操作数A连续异或同一个数据两次,结果还是操作数A
应用:对数据加密
(4)可能会出现的笔试题目:
*交换两个变量的值
方法一:(异或法)
int a = 3; int b = 5; a = a^b; //a = 3^5; b = a^b; //b = (3^5)^5 = 3; a = a^b; //a = (3^5)^3 = 5; System.out.println("a="+a+"b="+b);
方法二:(相加法)
int a = 3; int b = 5; a = a+b; // a = 3+5= 8; b = a-b; // b = 8-5 = 3; a = a-b; // a = 8-3 = 5; System.out.println("a="+a+"b="+b);
*取出一个二进制数据的指定位数(取低四位)
用&来解决,第四位为1,其余为0
6.移位运算符
(1)
<< 左移:左移n位,结果就是操作数乘以2的n次方;
>> 右移:右移n位,结果就是操作数除以2的n次方,
注意:左边补充位是1还是0,正数补充0,负数补充1;
>>> 无符号右移:左边补充位都是0;
(2)笔试题目:
用最高效率算出2乘以8的结果:2<<3 = 2*(2^3) = 16;
7.三元运算符
(1)格式:布尔表达式?值1:值2;
如果布尔表达式为true,运算后的结果是值1;
如果布尔表达式为false,运算后的结果是值2;
(2)注意:
使用三元运算符的时候,一定要使用该表达式返回的结果,或者定义一个变量接受该表达式返回的结果;
int age = 14; String result = age>=18?"成年人":"未成年人"; System.out.println(result);