运算符

算数运算符

其包括:+ , - , * , / , % , ++ , --
"%":模运算即取余运算。计算所除之后的余数。
"++":自增运算符。即a++:a = a+1;
"--":自减运算符。即a--:a = a-1;

自增运算符的性质

  • 自增/减运算为一元运算,其运算过程仅需要一个元素参与:int b = a++;
  • 实际上是隐藏了一步:a = a ± 1;
  • 注意a++和++a的区别。其在于是先赋值还是先自运算。
int a = 3;
int b = a++; // 即先赋值给b(赋值仍为原a),再进行自增(a = a+1)。
             //即 b = 3
System.out.println(a); //经过了之前的自增步骤,
                       //此时 a = a+1 即 a = 4。
int c = ++a; //此处先自增,再赋值给c,
             //即c = 1+4 = 5

字符串连接符“+”

int a = 10;
int b = 20;
System.out.println(""+a+b); //结果为 1020.
System.out.println(a+b+""); //结果为 30.

“+”的意义由第一个元素的性质决定。
若第一个元素为String,则+为连接符,将前后元素直接连接输出。
若第一个元素为数值,贼+为算术运算符。

赋值运算符

其包括:=

关系运算符

其包括:> , < , >= , <= , == , != , instanceof
"!=":不等于号
"instanceof":

逻辑运算符

其包括:&&, || , !
"&&":****与符,a && b 即a和b。a,b均为真,结果才为真。
"||":****或符,a || b 即a或者b。a,b有一个为真,结果为真。
"!":****非符,!a 即改变a的布尔值。真假互换。

拓展:关于短路运算。

int c = 5;
boolean d = (c<4)&&(c++<4);
System.out.println(d);
System.out.println(c);
//结果为:d = false; c=4

因为在与运算中,一假即假,故当(c<4)成立时,直接输出结果false。
从而跳过后续步骤(c++),后者被短路,即c值不变。

位运算符(重难点)

其包括:& , | , ^ , ~ , >> , << , >>>

  • 这是基于计算机二进制的运算。是一种底层的运算,因此具有无比的速度。
  • 与计算机组成原理和数据结构相关,考验能力。
  • 底层逻辑为:1代表true;0代表false。

eg:
A = 0011 1100
B = 0000 1101
做如下运算,均基于对位比较。

A & B: 与符:对应位置均为1,输出1,否则为0。(存在0就输出0)结果为:0000 1100
A | B: 或符:存在1即输出1。结果为 0011 1101
A ^ B: 亦或符:对位相同为0不相同为1。结果为:0011 0001
~ B: 取反符:即将位值取反。结果为 1111 0010
<< / >> 符介绍见下:

位运算拓展面试题

问:2 x 8怎么运算最快?
答:2 x 8 = 2* 2* 2* 2 = 16 最快。

解析如下:
二进制计数法:
0000 0000 0
0000 0001 1
0000 0010 2
0000 0011 3
0000 0100 4
0000 1000 8
0001 0000 16

由二进制计数法,易得自0001始:
将1向左移1位即为乘2
将1向右移1位即为除2

引出"<<",">>":
左移符 << :a << b 将a左移b位,即 a = a*2^b
右移符 >> :a >> b 将a右移b位,即 a = a/2^b

条件运算符

其包括:?

扩展赋值运算符

其包括:+= , -= , *= , /=
本质上是一种缩写:
a += b; //a = a+b
a -= b; //a = a-b
即对自己的迭代运算。

三元运算符

形如:x ? y : z。
其中:x为一个判别条件;y,z为条件输出。
意为:如果 x == true,则结果为 y ,否则为 z 。
与 if 语句类似。
eg.

int score = 50;
String type = score < 60 ?"不及格":"及格";
System.out.println(type); //不及格