基本运算符
- / %
- += -= *= /= %=
- 负号操作符就是直接取反
- 相同类型进行运算,返回的仍然是相同类型,例如int类型的地板除
- 不同类型参与运算,所有参与者会自动提升至最高精度
- 取余运算符%是有符号的 -9 % 5 = -4
a = a + 1的执行过程是 cpu从内存中取出a的值放入寄存器,然后对寄存器中的数字加1,再写回内存单元中
自增自减运算符
自增、自减 i++ 等价于 i = i+1 或 i += 1; i++与 ++i 两者差别就是表达式的值不一样
比较运算符
<
- ==
= <= !=
-
逻辑运算符与短路特性
对布尔值操作,返回结果仍然为布尔值
- 当逻辑运算符左边已可以确定返回值时,不会去计算运算符右边的表达式,变现为短路特性
// 直接对装箱类型的Boolean值进行判断时可能会抛出一个空指针异常,增加一个短路的保护判断
Boolean config = getConfig();
if(config != null && config) {}
三元运算符
- ?: 常用于用于不同条件时的取值
三元运算符可以进行嵌套,不确定运算数据加括号,不建议进行嵌套,可读性不好
位运算详解与实战
计算机有符号表示时,首位0表示正数,但用补码表示负数 对3取反+1得到-3
- 使用补码的原因是因为需要使用加法器同时处理加法和减法
- ~ 按位取反
- & 按位与 | 按位或
- ^ 异或 可理解为 不进位的加法 x^x = 0; x^y^y =x
- << 左移 空出部分补0,溢出丢弃 左移可认为x2
右移 带符号右移,左边缺失位补符号位
无符号右移,总是补0
访问修饰符就用到了位运算,从32位int读出某一位,只需要与只有该位为1的数进行按位与 &;同理,按位或 | 可以进行设置该位
public class Cat {
private static int CUTE = 0x1;
private static int FAT = 0x2;
private static int WHITE = 0x4;
private int properties = 0;
// ↑ 请勿修改以上部分的代码,请勿添加新的成员变量
// ↓ 请补全以下代码
/**
* 使用位运算设置猫咪萌的属性
*
* @param cute true为萌,false为不萌
*/
public void setCute(boolean cute) {
properties = cute ? properties | CUTE : properties & (~CUTE) ;
System.out.println(properties);
}
/**
* 这只猫萌吗?请在此处使用位运算读取properties,得到猫是否萌的结果
*
* @return 萌则返回true,否则返回false
*/
public boolean isCute() {
return (properties & CUTE) != 0;
}
public static void main(String[] args) {
Cat cat = new Cat();
cat.setCute(true);
System.out.println("这只猫萌吗:" + cat.isCute());
}
}
运算符优先级与字符串加法操作
乘除高于加减
- 其他加括号
- 字符串加法经过特殊处理,如调用toString方法,字符串连接被转换为StringBuilder调用,因为java中字符串是不可变的,为了减少零碎创建的sring类对象引起过大的内存开销,创建这个特殊的类来处理问题;