8初级 - Java的运算系统

131 阅读3分钟

基本运算符

package com.github.hcsp;

public class Main {
    public static void main(String[] args) {
        // 两个相同类型的数,做运算返回两个相同类型的数,所以除法是的地板除
        int a = 1 + 1;
        // 精度会提升到最高精度
        double c = 5.0 / 2;
        double b = 1.0 + 1d;
        // 取余数是带有符号的
        System.out.println(9 % 5);
        System.out.println(-9 % 5);

        System.out.println(isOdd(1));
        System.out.println(isOdd(3));
        System.out.println(isOdd(-1));

    }
    // 判断一个整数是不是奇数
    public static boolean isOdd(int number) {
        // 这么写是错误的,因为取余要考虑符号
//        return number % 2 == 1;
        return number % 2 != 0;
    }
}

a+=1发了生三步

  • 1将a的值内存取出来放到cpu
  • cpu中进行+1
  • 在写回到内存

1.png

自增自减运算符

package com.github.hcsp;

public class Main {
    public static void main(String[] args) {
        int a = 0;
        int b = 0;
        System.out.println(a++); // 0
        System.out.println(++b); // 1
    }

}

比较匀速符

  • >,<,==,返回布尔值

逻辑运算符

package com.github.hcsp;

public class Main {
    public static void main(String[] args) {
        System.out.println(false && false);
        System.out.println(true && true);
        System.out.println(false && true);
        System.out.println(true || true);
        System.out.println(false && false);
        System.out.println(!true);
    }
}
  • 短路特性
package com.github.hcsp;

public class Main {
    public static void main(String[] args) {
        Boolean config = getConfig();

        // 1: true -> true
        // 2: false -> false
        // 3: null -> false // 左边false,右边就不会操作,避免了空指异常昌
        if(config !=null && config) {

        }
    }

    public static Boolean getConfig() {
        // 可能返回true/false/null
    }
}

三元运算符

  • ?:
  • 尽量不要嵌套,保证代码的可读性

位运算符

  • 大概有个印象就行,用到了再去查
package com.github.hcsp;

public class Main {
    public static void main(String[] args) {
        System.out.println(~3); // -4
    }
}

2.png

3.png

  • 补码的概念
  • 符号为0代表正数,补码表示负\

4.png

  • 为什么搞这么复杂,硬件电路+表示+/-
  • 使用补码的好处就是可以同时完成加法和减法\

5.png

  • 总结:为了计算方便,用补码表示负号\

6.png

按位与

7.png

按位或

8.png

异或

  • 不进位的加法\

9.png

  • XYY = X\

10.png

  • x^x = 0
  • 算法题加快计算

左移

  • 左移,二进制每左移一位就*2,好处速度快很多\

11.png

右移

  • 带符号右>>和无符号右移>>>\

12.png

  • modifer的类,使用位运算节省内存

位运算的使用场景

  • 假设一个class有32个属性,属性不互斥,32个布尔值存放这32个属性,最常见的直接用32个布尔值存放这些属性,结果就是一个布尔值内存中至少一个占用一个字节
  • 这样的情况是一个对象至少占了32个字节,如果对象多的话,占用内存就大
  • 另外一种方案是一个int四个字节32个byte,一个字节8个位,利用int存放32个bool值,32个byte值需要4个字节\

13.png

问题怎么把位转成布尔值

  • Modifier.java,访问修饰符类
  • java虚拟机内部尽可能要减少内存,把是不是public,protected\

14.png

  • public 操作符 ,0x00 00 00 01, 16位的字符可以转成二进制的位
  • 设置预先定好的值某个位上的属性是1,其余是0
  • 实现了把若干的属性设置到int中去
  • 被置位\

15.png

  • 按位与判断是否被置位\

16.png

  • 总结:一堆布尔值如何把塞到一个int中的某个位,设置的时候按位或,读取的时候用按位与运算

运算的优先级

  • 不明确的情况下加括号

字符串的加法

  • 字符串加法的时候会调用对象的toString方法
  • 连接很长的字符串加法的时候,jdk内部会自动转成StringBuilder方法,减轻内存压力,提高性能