1、算术操作符

整数除法会直接去掉结果的小数位,而不是四舍五入地处理结果。

1 int a=3, b;
2 b = a/2;
3 System.out.println(b);
4 //the output is 1

 byte、char、short参加运算时会被提升为int。

+=、-+、*=、/=在左操作数为byte、char、short类型时,运算前提升为int,赋值时则被截取。

byte b = 20;
//byte a = b + 2;    //编译错误:Type mismatch: cannot convert from int to byte
byte a = (byte) (b + 2);

System.out.println(Integer.toBinaryString(b+120));
b += 120;
System.out.println(Integer.toBinaryString(b));
//output:
//10001100
//11111111111111111111111110001100

 

2、一元加减号

一元减号具有数学上负号的作用

int a = 3, b;
b = -a;
System.out.println(b);
//the output is -3

一元加号只是作为一元减号的对应被创造的,没有什么作用。EXCEPT下面这一条:

一元加减号的操作数为byte、chart、short变量时,一元加减号会将其提升为int型,这点在赋值操作是需要注意。

byte b = 4;
//byte bb = -b;    //编译错误:无法从int转换到byte
//byte bb = +b;    //编译错误:无法从int转换到byte
byte bb = (byte)-b    //正确,需要进行强制类型转换

3、按位操作符

按位操作符用来操作整数基本数据类型中的单个“比特”,即二进制位。按位操作符会对两个参数中对应的二进制位(由低位到高位,所有位都参与运算,包括符号位)执行布尔运算,并最终生成一个结果。

按位操作之前,byte、char、short会被提升为int。

&=、|=、^=都是合法的,但是不存在~=,因为~是一元操作符。

左操作数为byte、char、short时,由于在移位之前进行了提升,赋值的时候会发生截断(高位会被截掉)。

按位操作符与逻辑操作符长得很像,下面会对二者进行比较说明。

4、移位操作符

移位的时候会对所有二进制位进行移动,所以此时不区分符号位。

左移(<<)在低位插入0。

有符号右移操作符(>>)使用符号扩展,符号为正,则在高位插入0,符号为符,则在高位插入1。

无符号右移操作符(>>>)使用“零扩展”,无论正负,都在高位插入0。

如果对byte、char、short类型的变量进行移位处理,那么在移位之前这些变量会被转换成int型,并且得到的结果也是int型。

<<=、>>=、>>>=左操作数为byte、char、short时,由于在移位之前进行了提升,赋值的时候会发生截断(高位会被截掉)。此时对于>>>=可能得不到正确的结果。

5、自增、自减操作符

不会对变量进行提升。

6、关系操作符

==和equals的比较

==是比较引用是否相等,即两个引用是否指向了同一块存储空间,比较的是引用的值。

equals方法默认也是比较引用,功能与“==”完全一样,看下Object类的源码就知道。

public boolean equals(Object obj) {
    return (this == obj);
}

如果想用equals方法实现比较对象内容的功能,需要重写equals方法。目前大多数java类库都重写了equals方法。

7、逻辑运算符

逻辑运算符只可用于布尔值,位运算一般用于整型数,但有一个特例。java将布尔值作为一种单比特值对待,所以可以对其进行&、|、^运算,但是不能进行~运算,避免与逻辑NOT混淆。

所以对于&&、||可以替换成&、|。注意:尽管两者都可以实现正确的逻辑运算,但是由于逻辑运算符具有短路功能,而位操作符不具有此功能,所以有时候代码效率会不同。

8、直接常量就是字面常量,译为literals

9、字符串操作符+、+=

进行字符串连接的时候会调用对象的toString()方法。

int arr[] = {1,2,3};
System.out.println("结果:"+arr);
//结果:[I@1afae45

有一点疑惑,《thinking in java》中在讲字符串操作符是提到“如果表达式以一个字符串开头,那么后续所有操作数都必须是字符串”,我们知道对开头不是字符串的表达式,只要含有字符串,最终都会转换成字符串,生成一个字符串值,这句话该怎样理解?