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