算数运算符,即加减乘除余,以及自增和自减,Java的自动拆箱使得我们能够对包装类直接进行算数运算。
Integer a = 1;
Integer b = 2;
System.out.println(a+b);
//输出:3
算数运算符很简单,但需要我们注意的是类型转换问题。考虑以下代码:
int a = 1;
short b = 2;
short c = a+b;//编译不通过
int c = a+b;//编译通过
System.out.println(c);
a
是int型,b
是short型,二者相加,会自动转化为范围更大的类型。
int a = 1;
short b = Short.MAX_VALUE;
short c = (short) (a+b);
System.out.println(c);
//输出:-32768
我们可以通过强转的方式,将int转为short型,编译和执行不会报错,但是会导致不是期望的结果。以上c = (short) (a+b)
超过了short所能表示的最大值,再强转后溢出,得到-32768(short的最小值)。
double a = 1.123456789;
float b = (float) a;
System.out.println(b);
//输出:1.1234568
double 类型强转float后,导致精度丢失。
int a = 1;
short b = 2;
b += a;//编译通过
b = b + a;//编译失败
System.out.println(b);
//输出3
b += a
是自增运算,等价于b = b + a
,但是b = b + a
是编译不过的,b += a
则会自动转型为左操作数对应的类型,也就是short类型。
😉 小技巧:再进行算数运算时,需要考虑null值情况,我们可以通过自己封装计算工具或者开源工具包来规避可能发生的异常,将null默认按0处理。
Java的逻辑运算符有:且(&&
),或(||
),非(!
)
逻辑运算符需要注意以下几点:
!
的优先级最高,其次是&&
,最后是||
,当写复杂的逻辑判断时,需要注意其作用范围。&&
和||
的短路性(条件1)&&(条件2)
,当条件1为false时,不会执行条件2的判断。如果条件2的判断是一个耗时操作,那么尽量把条件1放在前面,可以提高效率。一些小建议:
if(a==1||a==2||a==3||a==4){}
可以改写为
List<Integer> list = Arrays.asList(1,2,3,4);
if(list.indexOf(a)>-1){}
Java中的关系运算符有:大于(>
)、小于(<
)、等于(==
),大于等于(>=
),小于等于(<=
),不等于(!=
),其中,需要注意的是==
,对于两个对象,它比较的是两个对象的内存地址;对于包装类型和基本类型,它比较的是拆箱后的值。
Java的位运算符有:与(&
)、或(|
)、非(~
)、异或(^
),左移(<<
),右移(>>
)、无符号右移(>>>
)。
byte a = 0B101;
byte b = 0B010;
System.out.println(a&b);
System.out.println(a|b);
System.out.println(~a);
System.out.println(a^b);
//输出:
//0
//7
//-6
//7