Java运算符可分为:
算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符、条件运算符与其他运算符。
算术运算符
进行数据计算
运算符 | 描述 | 例子 |
+ | 双目运算符,对两边操作数进行求和运算 | a+b=c |
- | 双目运算符,对两边操作数进行求差运算 | a-b=c |
* | 双目运算符,对两边操作数进行求积运算 | a*b=c |
/ | 双目运算符,对两边操作数进行求商运算 | a/b=c |
% | 双目运算符,对两边操作数进行求余(取模)运算 | a%b=c |
byte/short在运算的时候会自动的提升为int,然后进行运算,运算结果为int。
同一个类型参与运算,结果的类型与参与运算的类型一致。
如果运算过程中有大类型参与了运算,结果一定是大类型
由于绝大部分小数在转化成二进制的时候是无限小数,所以double类型在存储小数的时候也没有办法精确存储,因此也没有办法来精确运算。
整数/0 :ArithmeticException(算数异常)。
任意非0数字/0.0或者是任意小数/0 :Infinity(无穷大)。
0/0.0->NaN-> Not a Number(非数字)NaN和任何值都不相等包括其本身。
判断一个对象是否是NaN只有一个方法isNaN();
允许对浮点数进行取模操作。
public static void main(String[] args) {
int a = 5;
int b = 3;
double c = 3.31;
double d = 1.1;
int w;
double s;
double z;
//加 +
System.out.println("<==========(+)==========>");
w=a+b;
s=a+c;
z=c+d;
System.out.println("int求和"+w);
System.out.println("int double 求和"+s);
System.out.println("double double 求和"+z);
//减 -
System.out.println("<==========(-)==========>");
w=a-b;
s=a-c;
z=c+d;
System.out.println("int 求差:"+w);
//由于绝大部分小数在转化成二进制的时候是无限小数,所以double类型在存储小数的时候也没有办法精确存储,因此也没有办法来精确运算
System.out.println("int double 求差:"+s);
System.out.println("double double 求差:"+z);
//乘 *
System.out.println("<==========(*)==========>");
w=a*b;
s=a*c;
z=c+d;
System.out.println("int 求积:"+w);
System.out.println("int double 求积:"+s);
System.out.println("double double 求积:"+z);
// 除 /
System.out.println("<==========(/)==========>");
w=a/b;
s=a/c;
z=c/d;
System.out.println("int 求商:"+w);
System.out.println("int double 求商:"+s);
System.out.println("double double 求商:"+z);
// 余(求莫) %
System.out.println("<==========(%)==========>");
w=a%b;
s=a%c;
z=c%d;
System.out.println("int 求余(求莫):"+w);
System.out.println("int double 求余(求莫):"+s);
System.out.println("double double 求余(求莫):"+z);
System.out.println("<==========任意非0数字/0.0或者是任意小数/0==========>");
s = a/0.0;
z = c/0;
System.out.println("任意非0数字/0.0:"+s);
System.out.println("任意小数/0:"+z);
}
自增自减运算符
自增(++):将变量的值加1,分前缀式(如++a)和后缀式(如a++)。前缀式是先加1再使用;后缀式是先使用再加1。
自减(--):将变量的值减1,分前缀式(如--a)和后缀式(如a--)。前缀式是先减1再使用;后缀式是先使用再减1。
运算符 | 描述 | 例子 |
++ | 单目运算符,对左边或右边数做加1运算 | a++/++a 等同于a=a+1 |
-- | 单目运算符,对左边或右边数做减1运算 | a--/--a 等同于a=a-1 |
符号在前 先运算再使用 符号在后 先使用再运算
赋值运算符
将运算符右边操作数的值赋给运算符左边的变量。
运算符 | 描述 | 例子 |
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | a=b |
+= | 加和赋值操作符,把左操作数和右操作数相加赋值给左操作数 | a+=c等同于c=c+a |
-= | 减和赋值操作符,把左操作数和右操作数相减赋值给左操作数 | a-=c等同于c=c-a |
*= | 乘和赋值操作符,把左操作数和右操作数相乘赋值给左操作数 | a*=c等同于c=c*a |
/= | 除和赋值操作符,把左操作数和右操作数相除赋值给左操作数 | a/=c(同类型)等同于c=c/a |
(%)= | 取模和赋值操作符,把左操作数和右操作数取模后赋值给左操作数 | a%=c等同于c=c%a |
<< = | 左移位赋值运算符 | 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 |
public static void main(String[] args) {
int a = 10;
int b = 20;
int c;
System.out.println("<===============(=)===============>");
c = a + b;
System.out.println("c = a + b = " + c);
System.out.println("<===============(+=)===============>");
c += a;
System.out.println("c += a = " + c);
System.out.println("<===============(-=)===============>");
c -= a;
System.out.println("c -= a = " + c);
System.out.println("<===============(*=)===============>");
c *= a;
System.out.println("c *= a = " + c);
System.out.println("<===============(/=)===============>");
a = 10;
c = 15;
c /= a;
System.out.println("c /= a = " + c);
System.out.println("<===============(%=)===============>");
a = 10;
c = 15;
c %= a;
System.out.println("c %= a = " + c);
System.out.println("<===============(<<=)===============>");
c <<= 2;
System.out.println("c <<= 2 = " + c);
System.out.println("<===============(>>=)===============>");
c >>= 2;
System.out.println("c >>= 2 = " + c);
c >>= 2;
System.out.println("c >>= 2 = " + c);
System.out.println("<===============(&=)===============>");
c &= a;
System.out.println("c &= a = " + c);
System.out.println("<===============(^=)===============>");
c ^= a;
System.out.println("c ^= a = " + c);
System.out.println("<===============(|= )===============>");
c |= a;
System.out.println("c |= a = " + c);
}
关系运算符
系运算符对两个操作数进行比较,并返回比较结果,比较结果的值为一个布尔值(true或false)。
运算符 | 描述 | 例子 |
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (A == B)为假 |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (A != B) 为真 |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (A> B)为假 |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (A <B)为真 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (A> = B)为假 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (A <= B)为真或假 |
public static void main(String[] args) {
int a = 10;
int b = 20;
int c= 10;
System.out.println("<===============(== )===============>");
System.out.println("a == b = " + (a == b)+"\na == c = " + (a == c) );
System.out.println("<===============(!= )===============>");
System.out.println("a != b = " + (a != b)+"\na != c = " + (a != c) );
System.out.println("<===============(!= )===============>");
System.out.println("a > b = " + (a > b)+"\na > c = " + (a > c) );
System.out.println("<===============(!= )===============>");
System.out.println("a < b = " + (a < b)+"\na < c = " + (a < c) );
System.out.println("<===============(>= )===============>");
System.out.println("b >= a = " + (b >= a) +"\na >= c = " + (a >= c));
System.out.println("<===============(<= )===============>");
System.out.println("b <= a = " + (b <= a) +"\na <= c = " + (a <= c));
}
逻辑运算符
逻辑运算符连接两个关系表达式或布尔变量,用于解决多个关系表达式的组合判断问题,返回的运算结果为布尔值。
运算符 | 描述 | 例子 |
&& | 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 | (a&&b)一假都假全真为真 |
|| | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。 | (a||b)一真都真 全假为假 |
! | 称为逻辑非运算符。用来反转操作数的逻辑状态。 | (a&&b)为真!(a&&b)为假 |
public static void main(String[] args) {
boolean a = true;
boolean b = false;
System.out.println("<===============(&&)===============>");
System.out.println("a && b = " + (a&&b));
System.out.println("<===============(||)===============>");
System.out.println("a || b = " + (a||b) );
System.out.println("<===============(! )===============>");
System.out.println("!(a && b) = " + !(a && b));
System.out.println("!(a || b) = " + !(a || b));
}
位运算符
应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。位运算符作用在所有的位上,并且按位运算。(菜鸟教程https://www.runoob.com/java/java-operators.html)
A = 0011 1100
B = 0000 1101-----------------
A&B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001~A= 1100 0011
运算符 | 描述 | 例子 |
& | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 |
| | 如果相对应位都是 0,则结果为 0,否则为 1 | (A | B)得到61,即 0011 1101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 |
~ | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
public static void main(String[] args) {
int a = 60; /* 60 = 0011 1100 */
int b = 13; /* 13 = 0000 1101 */
int c;
System.out.println("<===============(&)===============>");
c = a & b; /* 12 = 0000 1100 */
System.out.println("a & b = " + c);
System.out.println("<===============(|)===============>");
c = a | b; /* 61 = 0011 1101 */
System.out.println("a | b = " + c);
System.out.println("<===============(^)===============>");
c = a ^ b; /* 49 = 0011 0001 */
System.out.println("a ^ b = " + c);
System.out.println("<===============(~)===============>");
c = ~a; /*-61 = 1100 0011 */
System.out.println("~a = " + c);
System.out.println("<===============(<<)===============>");
c = a << 2; /* 240 = 1111 0000 */
System.out.println("a << 2 = " + c);
System.out.println("<===============(>>)===============>");
c = a >> 2; /* 15 = 1111 */
System.out.println("a >> 2 = " + c);
System.out.println("<===============(>>>)===============>");
c = a >>> 2; /* 15 = 0000 1111 */
System.out.println("a >>> 2 = " + c);
}
条件运算符
是为三元运算符,该运算符有3个操作数,并且需要判断布尔表达式的值决定应该赋值给哪个变量。
variable X = expression ? value if true:value if false
public static void main(String[] args) {
int a, b;
a = 10;
// 如果 a 等于 1 成立,则设置 b 为 20,否则为 30
b = (a == 1) ? 20 : 30;
System.out.println("Value of b is : " + b);
// 如果 a 等于 10 成立,则设置 b 为 20,否则为 30
b = (a == 10) ? 20 : 30;
System.out.println("Value of b is : " + b);
String c, d;
c = "郑州";
d = (c.equals("郑州")) ? "郑州" : "洛阳";
System.out.println("Value of b is : " + d);
d = (c.equals("luoy")) ? "郑州" : "洛阳";
System.out.println("Value of b is : " + d);
}
instanceof 与 contains运算符
该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。
(Object reference variable)instanceof(class/interface type)
(Object reference variable)contains(class/interface type)
Java运算符优先级
在一个多运算符的表达式中,运算符优先级不同会导致最后得出的结果差别甚大。
类别 | 操作符 | 关联性 |
后缀 | () [] . (点操作符) | 左到右 |
一元 | expr++ expr-- | 左到右 |
一元 | ++expr --expr + - ~ ! | 右到左 |
乘性 | * /% | 左到右 |
加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
关系 | > >= < <= | 左到右 |
相等 | == != | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | | | | 左到右 |
条件 | ?: | 右到左 |
赋值 | = + = - = * = / =%= >> = << =&= ^ = | = | 右到左 |
逗号 | , | 左到右 |