基本运算符

        • / %
  • += -= *= /= %=
    • 负号操作符就是直接取反
  • 相同类型进行运算,返回的仍然是相同类型,例如int类型的地板除
  • 不同类型参与运算,所有参与者会自动提升至最高精度
  • 取余运算符%是有符号的 -9 % 5 = -4
  • a = a + 1的执行过程是 cpu从内存中取出a的值放入寄存器,然后对寄存器中的数字加1,再写回内存单元中

    自增自减运算符

  • 自增、自减 i++ 等价于 i = i+1 或 i += 1; i++与 ++i 两者差别就是表达式的值不一样

    比较运算符

  • <

  • ==
  • = <= !=

  • 参与运算后,结果是布尔类型

    逻辑运算符与短路特性

  • 对布尔值操作,返回结果仍然为布尔值

  • 当逻辑运算符左边已可以确定返回值时,不会去计算运算符右边的表达式,变现为短路特性
    1. // 直接对装箱类型的Boolean值进行判断时可能会抛出一个空指针异常,增加一个短路的保护判断
    2. Boolean config = getConfig();
    3. if(config != null && config) {}

三元运算符

  • ?: 常用于用于不同条件时的取值
  • 三元运算符可以进行嵌套,不确定运算数据加括号,不建议进行嵌套,可读性不好

    位运算详解与实战

  • 计算机有符号表示时,首位0表示正数,但用补码表示负数 对3取反+1得到-3

  • 使用补码的原因是因为需要使用加法器同时处理加法和减法
  • ~ 按位取反
  • & 按位与 | 按位或
  • ^ 异或 可理解为 不进位的加法 x^x = 0; x^y^y =x
  • << 左移 空出部分补0,溢出丢弃 左移可认为x2
  • 右移 带符号右移,左边缺失位补符号位

  • 无符号右移,总是补0

  • 访问修饰符就用到了位运算,从32位int读出某一位,只需要与只有该位为1的数进行按位与 &;同理,按位或 | 可以进行设置该位

    1. public class Cat {
    2. private static int CUTE = 0x1;
    3. private static int FAT = 0x2;
    4. private static int WHITE = 0x4;
    5. private int properties = 0;
    6. // ↑ 请勿修改以上部分的代码,请勿添加新的成员变量
    7. // ↓ 请补全以下代码
    8. /**
    9. * 使用位运算设置猫咪萌的属性
    10. *
    11. * @param cute true为萌,false为不萌
    12. */
    13. public void setCute(boolean cute) {
    14. properties = cute ? properties | CUTE : properties & (~CUTE) ;
    15. System.out.println(properties);
    16. }
    17. /**
    18. * 这只猫萌吗?请在此处使用位运算读取properties,得到猫是否萌的结果
    19. *
    20. * @return 萌则返回true,否则返回false
    21. */
    22. public boolean isCute() {
    23. return (properties & CUTE) != 0;
    24. }
    25. public static void main(String[] args) {
    26. Cat cat = new Cat();
    27. cat.setCute(true);
    28. System.out.println("这只猫萌吗:" + cat.isCute());
    29. }
    30. }

    运算符优先级与字符串加法操作

  • 乘除高于加减

  • 其他加括号
  • 字符串加法经过特殊处理,如调用toString方法,字符串连接被转换为StringBuilder调用,因为java中字符串是不可变的,为了减少零碎创建的sring类对象引起过大的内存开销,创建这个特殊的类来处理问题;