基本运算符
- / %
- += -= *= /= %=
- 负号操作符就是直接取反
- 相同类型进行运算,返回的仍然是相同类型,例如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类对象引起过大的内存开销,创建这个特殊的类来处理问题;
