运算符
-
算术运算符:+,-,*,/,%,++,--
操作符 描述 例子 A=10 B=20 + 加法 - 相加运算符两侧的值 A + B 等于 30 - 减法 - 左操作数减去右操作数 A – B 等于 -10 * 乘法 - 相乘操作符两侧的值 A * B等于200 / 除法 - 左操作数除以右操作数 B / A等于2 % 取余 - 左操作数除以右操作数的余数 B%A等于0 ++ 自增: 操作数的值增加1 B++ 或 ++B 等于 21(区别详见下文) -- 自减: 操作数的值减少1 B-- 或 --B 等于 19(区别详见下文)
//二元运算符
int a = 10;
int b = 20;
int c = 25;
int d = 25;
System.out.println("a + b = " + (a + b) );
System.out.println("a - b = " + (a - b) );
System.out.println("a * b = " + (a * b) );
System.out.println("b % a = " + (b % a) );//% 取余 模运算
System.out.println("c % a = " + (c % a) );//% 取余 模运算
System.out.println("a % b = " + a/b); //int 0.5 = 0
System.out.println("a % (double)b = " + a/(double)b); //double 0.5 = 0.5
后缀自增自减法(a++,a--): 先进行表达式运算,再进行自增或者自减运算
int b = a++ =====> b = a a = a + 1
前缀自增自减法(++a,--a): 先进行自增或者自减运算,再进行表达式运算。
int c = ++a =====> a = a + 1 c = a
//++ -- 自增 自减 一元运算符
int a = 3;
int b = a++;//执行这行代码后 先赋值 再自增 相当于在这行代码后面隐藏 a = a + 1
//a = a + 1
System.out.println("先赋值,再自增"+"a="+a+"b="+b);
//a = a + 1
int c = ++a;//执行这行代码前 先自增 再赋值 相当于在这行代码前面隐藏 a = a + 1
System.out.println("先自增,再赋值"+"a="+a+"c="+c);
-
关系运算符:>,<,>=,<=,==,!=
//关系运算符 返回结果 布尔值 true false
int a = 10;
int b = 20;
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));
-
逻辑运算符:&&,||,!
操作符 | 描述 | 例子 A=true B = false |
&& | 逻辑与运算符 - 当且仅当两个操作数都为真,条件才为真。 | (A&&B)为假 |
|| | 逻辑或运算符 - 如果任何两个操作数任何一个为真,条件为真。 | (A || B)为真 |
! | 逻辑非运算符 - 用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | !(A&&B)为真 |
//逻辑运算符 与(and) 或(or) 非(取反)
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时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。
//短路与运算 前面为false 后面不执行
int c = 5;
boolean d = (c<4)&&(c++<4);//如果c++<4执行 c变为6
System.out.println(d);
System.out.println("c="+c);
当使用与逻辑或算符时,在两个操作数都为flase时,结果才为flase,但是当得到第一个操作为true时,其结果就必定是true,这时候就不会再判断第二个操作了。
//短路或运算 前面为true 后面不执行
int c = 5;
boolean d = (c<6)||(c++<4);//如果e++<4执行 e变为4
System.out.println(d);
System.out.println("c="+c);
-
位运算符:&,|,^,~,>>,<<,>>>
Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
位运算符作用在所有的位上,并且按位运算。假设a = 60,b = 13;它们的二进制格式表示将如下:
A = 0011 1100 |
B = 0011 1100 |
A&B = 0000 1100 与 全1为1 |
A|B = 0011 1101 或 全0为0 |
A^B = 0011 0001 异或 相同为0 不同为1 |
~A = 1100 0011 非 0变1 1变0 |
操作符 | 描述 | 例子 A = 0011 1100 B = 0011 1100 |
& | 与 - 如果相对应位都是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 即 0000 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15 即 0000 1111 |
面试题:2*8 怎样计算最快?
2*8 = 2*2*2*2
0000 0000 0
0000 0001 1
0000 0010 2
0000 0011 3
0000 0100 4
0000 1000 8
0001 0000 16
从上面可以看出 左移就是把数字*2 右移就是把数字/2
2的二进制在存储器里面是 0000 0010
左移三位后变成0001 0000 也就是16
在系统中运算是以二进制的形式进行的。相比来说俩个二进制数相乘运算比移位运算慢一些。
位操作是程序设计中对位模式按位或二进制数的一元和二元操作。 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多。
-
条件运算符:?:
条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量
//三元运算符 条件运算符
//x ? y : z
//如果x为真 执行y 否则执行z
int grade = 80;
String result = grade>60?"及格":"不及格";
System.out.println(result);
String result2 = grade>90?"及格":"不及格";
System.out.println(result2);
-
赋值运算符:=,+=,-=,*=,/=,(%)=,<<=,>>=,&=,^=,|=
操作符 | 描述 | 例子 |
---|---|---|
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B将把A + B得到的值赋给C |
+ = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C + = A等价于C = C + A |
- = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C - = A等价于C = C - A |
* = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C * = A等价于C = C * A |
/ = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C / = A,C 与 A 同类型时等价于 C = C / A |
(%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | C%= A等价于C = C%A |
<< = | 左移位赋值运算符 | C << = 2等价于C = C << 2 |
>> = | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 |
&= | 按位与赋值运算符 | C&= 2等价于C = C&2 |
^ = | 按位异或赋值操作符 | C ^ = 2等价于C = C ^ 2 |
| = | 按位或赋值操作符 | C | = 2等价于C = C | 2 |
-
类型转换与运算
Java允许整型、字符型、浮点型数据进行混合运算,运算时不同类型的数据线转换为同一类型后再进行运算,转换的原则为:
操作数1 | 操作数2 | 结果 |
---|---|---|
byte short int | byte short int | int |
byte short int | long | long |
byte short int long | float | float |
byte short int long float | double | double |
char | int | int |
-
字符串连接符 +
面试题:(""+a+b)和(a+b+"")有啥区别?
int a = 10;
int b = 20;
System.out.println(a+b);
//字符串在前面 后面会拼接
System.out.println(""+a+b);
//字符串在后面 依旧运算
System.out.println(a+b+"");