Java 运算符

运算符指明对操作数的运算方式。组成表达式的Java有很多种。运算符按照其要求的操作数数目来分,可以有一元(单目)运算符,二元(双目)运算符和三元(三目)运算符,它们分别对应于1个、2个、3个操作数。运算符按其功能来分,有算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符和其他运算符。

下图表示运算符的优先级和结合性。

java运算符.png

注:结合性的左表示先算符号的左半部分,例如:1+2+3 按照先后应该是(1+2)+3,右就表示先算符号的右半部分。

算数运算符( +、-、*、/、%、++、 --)

算数运算符和平时在数学中的应用基本一致。

    /**
     * 算数运算符 测试
     */
    private static void arithmeticOperator() {
        int a = 102;
        int b = 5;
        int sum = a + b;            //两数之和
        int difference = a - b;     //两数之差
        int product = a * b;        //两数之积
        int quotient = a / b;       //两数之商的整数部分
        int remainder = a % b;      //余数: a - b*(a/b)
        int c = a++;                //a 放在++之前表示 c 先取到a原来的值,之后a自增1,此时a = 103
        int d = ++a;                //a 放在++之后表示 a先自增1,即103+1=104,之后d取到现在a的值.
        System.out.println("a + b =" + sum);
        System.out.println("a - b =" + difference);
        System.out.println("a * b =" + product);
        System.out.println("a / b =" + quotient);
        System.out.println("a % b =" + remainder);
        System.out.println("a++ 的值" + c);
        System.out.println("++a 的值" + d);
    }
Java 运算符_第1张图片
算数运算符

关系运算符(==、!=、<、>、<=、>=)

关系运算符用于比较两个数值之间的大小,其运算结果为一个逻辑类型(boolean布尔类型)的数值。

    /**
     * 关系运算符 测试
     */
    private static void relationalOperator() {
        int a = 100;
        int b = 50;
        System.out.println("a 等于 b :" + (a == b));
        System.out.println("a 不等于b:" + (a != b));
        System.out.println("a 小于 b :" + (a < b));
        System.out.println("a 大于 b :" + (a > b));
        System.out.println("a 不小于b:" + (a >= b));
        System.out.println("a 不大于b:" + (a <= b));
        //注意: 当 == 在比较对象时,比较的是对象的内存地址,而不是对象的属性和值
        String s = "hello";
        String str = "hello";
        String s1 = new String(s);
        String s2 = new String(s);
        System.out.println("s 等于 str:" + (s == str));        //true, 如果String缓冲池内存在与其指定值相同的String对象,
        // 那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用,和基本类型数据相似
        System.out.println("s1 等于 s2 :" + (s1 == s2));//false ,s1和s2是String两个不同的对象.
        System.out.println(" s 等于 s1 :" + (s == s1)); //false ,s == str != s1 != s2

    }

Java 运算符_第2张图片
关系运算符

注:"=="习惯用于原生(primitive)类型之间的比较,当== 用于对象之间的比较时,比较的是对象的内存地址

逻辑运算符(&、| 、!、 ^、 &&、 ||)

逻辑运算符要求操作数的数据类型为布尔型,其运算结果也是布尔型。


Java 运算符_第3张图片
逻辑运算符

需要注意的是:

  • 异或 ^ :两边相同时为flase,两边不同时为true;
  • & | 和 && ||的区别:& 和 && 都表示"与",只是&&具有短路的功能,也就是所当 && 左边为false时就跳过右边的判断,不管右边是什么结果都为false,减少计算机的开支;和&&类似,当||的左边为true时,不管右边是true还是false,结果都为true。在编程时,建议使用&& 和|| 进行判断操作。

位运算符(&、|、^、~、>>、<<、>>>)

位运算是以二进制位为单位进行的运算,其操作数和运算结果都是整型值。

注意:

  • 0&1 = 0, 1&1 = 1 只有两边都是1结果才是1;
  • 0|1 = 1, 0|0 = 0 只有两边都是0结果才是0;
  • 0^0 = 0, 1^1 = 0 , 0^1 = 1, 1^0 = 1;
  • ~0 = 1,~1 = 0;
  • ">>" 是有符号的,即当 >>左边的数是正数时,缺失位用0填,>>左操作数是负数时,缺失位用1填。
  • << 和 >>>是无符号的,即 << 和>>>左操作数无论正负,缺失位都要用0填;
/**
     * 位运算符 测试
     */
    private static void bitOperator() {
        int a = 56;
        int b = 78;
        String aStr = Integer.toBinaryString(a);    //a 转为二进制是:0b0000_0000_0000_0000_0000_0000_0011_1000
        String bStr = Integer.toBinaryString(b);    //b 转为二进制是:0b0000_0000_0000_0000_0000_0000_0100_1110
        int and = a & b;        //将a和b的二进制数同位进行&计算,and = 0b0000_0000_0000_0000_0000_0000_0000_1000
        int or = a | b;         //将a和b的二进制数同位进行|计算,or  = 0b0000_0000_0000_0000_0000_0000_0111_1110
        int xor = a ^ b;        //将a和b的二进制数同为进行^计算,xor = 0b0000_0000_0000_0000_0000_0000_0111_0110
        int not = ~a;           //将a的二进制数进行~计算,       not = 0b1111_1111_1111_1111_1111_1111_1100_0111
        //注意:这里看出求int的二进制负数其实就是 其绝对值减1后二进制进行~计算。
        //eg. a=50, 那么求-50的二进制数,先将50-1=49, -50的二进制就是 ~49
        System.out.println("a 的二进制表示是:" + aStr);
        System.out.println("b 的二进制表示是:" + bStr);
        System.out.println("a & b 的结果是:" + and);
        System.out.println("a | b 的结果是:" + or);
        System.out.println("a ^ b 的结果是:" + xor);
        System.out.println("~a 的结果是:" + not);


        int b1 = 115;       //b1 的二进制数是: 0b0000_0000_0000_0000_0000_0000_0111_0011
        int b2 = -7;        //b2 的二进制数是: 0b1111_1111_1111_1111_1111_1111_1111_1001
        int b1_left_2 =  b1 << 2;   // 将b1左移2位末尾两位用0填上得 0b0000_0000_0000_0000_0000_0001_1100_1100 (460)
        int b1_right_2 = b1 >> 2;   // 将b1右移2位开头用0填上得     0b0000_0000_0000_0000_0000_0000_0001_1100 (28)
        int b2_left_2 =  b2 << 2;   // 将b2左移2位末尾两位用0填上得 0b1111_1111_1111_1111_1111_1111_1110_0100 (-28)
        int b2_right_2 = b2 >> 2;   // 将b2右移2位来头两位用1填上得 0b1111_1111_1111_1111_1111_1111_1111_1110 (-2)
        //注意:>> 是有符号的,即当 >>左边的数是正数时,缺失位用0填,>>左操作数是负数时,缺失位用1填。
        //      << 是无符号的,即 << 左操作数无论正负,缺失位都要用0填;
        //      与 << 相对应的是 无符号右移 >>>, 其缺失位也全都用0填。
        int b1_right_2_no_sign = b1 >>> 2;  // 将b1右移2位开头用0填上得 0b0000_0000_0000_0000_0000_0000_0001_1100 (28)
        int b2_right_2_no_sign = b2 >>> 2;  // 将b2右移2位开头用0填上得 0b0011_1111_1111_1111_1111_1111_1111_1110 (103740822)
        System.out.println("b1 左移2位得:" + b1_left_2);
        System.out.println("b1 右移2位得:" + b1_right_2);
        System.out.println("b2 左移2位得:" + b2_left_2);
        System.out.println("b2 右移2位得:" + b2_right_2);
        System.out.println("b1 无符号右移2位得:" + b1_right_2_no_sign);
        System.out.println("b2 无符号右移2位得:" + b2_right_2_no_sign);
    }
Java 运算符_第4张图片
位运算符结果

赋值运算符

赋值运算符是 "=" 与二元算术运算符、逻辑运算符和位运算符组合成简捷运算符,从而可以简化一些常用表达式的书写。

Java 运算符_第5张图片
赋值运算符

其他运算符

三元运算符
三元运算符是软件编程中的一个固定格式,语法是“条件表达式?表达式1:表达式2”。
当条件表达式为true时,结果 “表达式1”,条件为false时,结果是“表达式2”
三元运算符可以简化if else的书写。

       String isLate = "";
        if(new Date().getHours() > 9){
            isLate = "迟到了";
        }else{
            isLate = "没迟到";
        }
        System.out.println(isLate);

可以简写成

      String isLate = new Date().getHours() > 9 ? "迟到了" : "没迟到";
      System.out.println(isLate);

你可能感兴趣的:(Java 运算符)