运算符
Java支持如下运算符:
- 算术运算符:+,-,*,/,%,++,–
- 赋值运算符:=
- 关系运算符:>,<,>=,<=,==,!=,instanceof
- 逻辑运算符:&&,||,!
- 位运算符:&,|,^,~,>>,<<,>>> (了解)
- 条件运算符:?:
- 扩展赋值运算符:+=,-=,*=,/=
1.二元运算符
①整数运算:
long a = 123123123L;
int b = 123;
short c = 10;
byte d = 8;
System.out.println(a+b+c+d); //Long,操作数有一个为Long,则结果也为Long
System.out.println(b+c+d); //int,操作数没有Long,即使操作数全为short,byte,结果也为int
System.out.println(c+d); //int
②浮点运算:
float a = 3.1415F;
double b = 3.1415;
float c = 1.1232131F;
System.out.println(a+b); //double,操作数有一个为double,则结果为double
System.out.println(b+c); //double
System.out.println(a+c); //float,操作数都是float,则结果才为float
③关系运算:
int a = 10;
int b = 20;
System.out.println(a>b); //false
System.out.println(a<b); //true
System.out.println(a==b); //false
System.out.println(a!=b); //true
④取模运算
int a = 21;
int b = -10;
int c = 9;
int d = -9;
System.out.println(a%b); //1,正数%负数=正数
System.out.println(a%c); //3,正数%正数=正数
System.out.println(b%c); //-1,负数%正数=负数
System.out.println(b%d); //-1,负数%负数=负数
2.一元运算符
①自加自减运算:
int a = 3;
int b = a++; //a先给b赋值,b=3,再自增。
int c = ++a; //a先自增,再给c赋值。
System.out.println(a); //5
System.out.println(b); //3
System.out.println(c); //5
②幂运算:
int a = 3^2; //注意:java中不能这么处理,^是异或符号。
//正确方法:
double a = Math.pow(2,3);
System.out.println(a); //8.0
3.逻辑运算符:
举例:
boolean a = true;
boolean b = false;
System.out.println("a && b:" + (a&&b)); //&&:逻辑与运算符,当且仅当两个变量都为真,结果才为true
System.out.println("a || b:" + (a||b)); //||:逻辑或运算符,两个变量有一个为真,结果为true
System.out.println("!(a && b):" + !(a&&b)); //!:true变为false,false变为true
输出:
a && b:false
a || b:true
!(a && b):true
**短路运算:**从左到右计算,如果判断结果确定则不会再计算下去。
int a = 5;
boolean b = (a < 4)&&(a++ < 4);
System.out.println(a); //5,证明a++并没有计算
System.out.println(b); //false
4.位运算符
Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。位运算符作用在所有的位上,并且按位运算。
操作符 | 描述 |
---|---|
& | 如果相对应位都是1,则结果为1,否则为0 |
| | 如果相对应位都是0, 则结果为0,否则为1 |
^ | 如果相对应位相同,则结果为0,否则为1 |
~ | 按位取反 |
<< | 二进制下按位左移运算符 |
>> | 二进制下按位右移运算符 |
>>> | 二进制下无符号按位右移补零操作 |
例如:
A = 0011 1100 //60
B = 0000 1101 //13
-------------
A & B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~A = 1100 0011
A << 2 = 1111 0000 = 240 //向左移动两位,左移n位相当于乘2的n次方
B >> 2 = 11 即3 //向右移动两位,低位舍弃,高位正数补0、负数补1,右移n位相当于除以2的n次方
A >>> 2 = 0000 1111 = 15 //向右移动后补0,右移n位相当于除以2的n次方
常见面试题:
int a = 2 * 8怎样运算效率最快?
答:System.out.println(2<<3);
//在系统中运算是以二进制的形式进行的。相比来说两个二进制数相乘运算比移位运算慢一些。
5.扩展运算符
扩展运算符 | 用法举例 | 等效表达式 |
---|---|---|
+= | a += b | a = a + b |
-= | a -= b | a = a - b |
*= | a *= b | a = a * b |
/= | a /= b | a = a / b |
%= | a %= b | a = a % b |
6.字符串连接符
“+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
int a = 1;
int b = 2;
System.out.println("" + a + b); //12
System.out.println(a + b + ""); //3
7.三元运算符
语法格式:
x ? y : z
其中x为boolean类型表达式,若x为true,则整个三目运算的结果为表达式y的值,否则整个运算结果为表达式z的值。
例如:
int score = 80;
String type = score < 60 ? "不及格" : "及格";
System.out.println("type = " + type); //及格
8.运算符优先级
优先级 | 运算符 | 结合性 |
---|---|---|
1 | ()、[]、{} | 从左向右 |
2 | !、+、-、~、++、– | 从右向左 |
3 | *、/、% | 从左向右 |
4 | +、- | 从左向右 |
5 | <<、>>、>>> | 从左向右 |
6 | <、<=、>、>=、instanceof | 从左向右 |
7 | ==、!= | 从左向右 |
8 | & | 从左向右 |
9 | ^ | 从左向右 |
10 | | | 从左向右 |
11 | && | 从左向右 |
12 | || | 从左向右 |
13 | ?: | 从右向左 |
14 | =、+=、-=、*=、/=、&=、|=、^=、~=、<<=、>>=、>>>= | 从右向左 |